7 天学会 Python
写给完全没写过 Python(甚至没写过代码)的你:不预设任何编程基础,只假设你会用电脑、能上网安装软件。7 天,每天 30–60 分钟,目标是先能跑起来、能自己写小脚本,而不是一口吃成专家。
本页与进阶向的 Python 语言全景页(数据模型、装饰器、类型注解等)互补:先把本页走通,再去看那页理解「为什么」。 文中示例基于 Python 3.10+(推荐直接安装 3.12/3.13),均可复制到本地运行验证。
目录
- 第 1 天:装好环境,跑通第一个程序
- 第 2 天:数据与运算:数字、字符串、布尔
- 第 3 天:流程控制:条件、循环与缩进
- 第 4 天:四个容器:列表、元组、字典、集合
- 第 5 天:函数与模块:把代码装进盒子
- 第 6 天:文件读写与异常处理
- 第 7 天:综合小项目:命令行备忘录
7 天路线总览
| 天数 | 主题 | 你将学会 | 当天产出 |
|---|---|---|---|
| 第 1 天 | 环境与第一个程序 | 安装、运行 .py、print/变量/input | 一个会「自我介绍」的小程序 |
| 第 2 天 | 数据与运算 | 数字/字符串/布尔、类型转换、f-string | 一个金额计算器 |
| 第 3 天 | 流程控制 | if/for/while、缩进规则 | FizzBuzz 小游戏 |
| 第 4 天 | 容器 | list/dict/tuple/set、切片、推导式 | 字符词频统计 |
| 第 5 天 | 函数与模块 | 函数、参数、作用域、import | 猜数字游戏 |
| 第 6 天 | 文件与异常 | 读写文件、with、try/except | 文件统计小工具 |
| 第 7 天 | 综合项目 | 把前 6 天串成完整工具 | 命令行备忘录 |
学习方法建议:先照着敲一遍跑通,再删掉自己重写;卡住了先读报错最后一行;第 7 天之前每天都要动手,只看不敲等于没学。
第 1 天:装好环境,跑通第一个程序
安装 Python
去 python.org 下载并安装(Windows 安装时务必勾选 Add python.exe to PATH;macOS 建议用官方安装包而非系统自带的老版本)。
安装完打开终端(Windows 是 PowerShell 或 CMD),验证:
# 终端里执行(Windows 下如果 python3 不行就试 python)
python3 --version # 期望输出类似 Python 3.12.xWindows 注意:命令可能是
python而不是python3;两个都试一下,以后统一用能用的那个。
三种运行方式
- 交互式解释器(REPL):终端输入
python3回车进入,出现>>>提示符后逐行输入立即出结果,输exit()退出。适合试小片段。 - 运行脚本文件:把代码存成
xxx.py,在终端执行python3 xxx.py。这是之后的主要方式。 - 编辑器/IDE:推荐 VS Code(装 Python 插件)或 PyCharm,写大文件更舒服;第一天用最简单的方式即可,不必纠结工具。
第一个程序
新建 hello.py:
# hello.py —— 注释:以 # 开头,# 后面的内容 Python 会忽略
print("你好,世界")
print("我" + "会" + "Python")
# 变量:给数据起个名字,之后随时用
name = "小明"
age = 18
print(name, "今年", age, "岁")
# input():让程序停下来等用户输入,输入的内容是「字符串」
who = input("你叫什么名字?")
print("你好,", who, "!", sep="")运行:python3 hello.py。
讲解要点:
print(...)把内容打印到屏幕;多传几个参数默认用空格分隔,加sep=""可以不空格。- 变量赋值用
=,Python 不需要声明类型,变量类型由值决定。 - 字符串要用引号包起来,单引号
'...'或双引号"..."都行(但别混着配对)。 input()返回的永远是字符串,哪怕用户输入的是数字。
动手练习
写 introduce.py:问用户的姓名和年龄,输出一句话,例如「你好,小红,明年你就 20 岁了」。
提示:年龄要先转成数字才能加 1——怎么转?第 2 天会讲,可以先自己试试 int(age_str)。
新手常踩的坑
Print大写不行——Python 区分大小写,报NameError: name 'Print' is not defined。- 引号不成对:
print("hi')会报SyntaxError(语法错误),检查引号是否一单一双混用。 - 报错看不懂?先看最后一行,那里才是真正的原因;上面的行只是「出错时的调用现场」。
- Windows 下双击
.py会闪退——用命令行运行才能看到输出和报错。
第 2 天:数据与运算:数字、字符串、布尔
基础数据类型
Python 最常用的四种数据 + 一个特殊值:
| 类型 | 例子 | 说明 |
|---|---|---|
整数 int | 42、-7 | 没有小数部分 |
浮点数 float | 3.14、2.0 | 有小数部分(计算机里是近似值) |
字符串 str | "你好"、'py' | 文本,必须加引号 |
布尔 bool | True、False | 判断结果,只有两个值 |
空值 NoneType | None | 表示「还没有值」,后面讲函数时会遇到 |
用 type() 可以看一个数据的类型:
print(type(42)) # <class 'int'>
print(type("42")) # <class 'str'> —— 带引号就是文本算术运算符
print(10 / 3) # 3.333... 一个 / 是真正的除法,结果一定是 float
print(10 // 3) # 3 // 是整除,向下取整
print(10 % 3) # 1 % 是取余数
print(2 ** 10) # 1024 ** 是乘方
print(7 + 2.0) # 9.0 int 和 float 混算,结果自动变 float字符串与 f-string
字符串可以拼接、重复、取长度,最推荐用 f-string 把变量塞进文本:
name = "小红"
price = 9.9
count = 3
print(f"{name}买了{count}个单价{price}元的商品") # 小红买了3个单价9.9元的商品
print(f"总价:{price * count:.2f} 元") # 总价:29.70 元 —— :.2f 保留两位小数
s = " Hello, Python "
print(s.strip()) # 去掉首尾空格: Hello, Python
print(s.lower()) # 全小写 hello, python
print(s.split(",")) # 按逗号切分 -> [' Hello', ' Python ']
print(",".join(["a", "b"])) # 用逗号拼起来 -> a,b类型转换
用户输入、读文件得到的一般都是字符串,需要时手动转:
age_str = input("你几岁?") # 拿到的是 str,比如 "18"
age = int(age_str) # int() 转成数字
print(f"明年你 {age + 1} 岁")
print(float("3.5")) # 3.5
print(str(100)) # '100'动手练习
写 bill.py:问商品单价和数量,算总价并打印成「总价:xx.xx 元」;再算如果打八折是多少。用 f-string 的 :.2f 控制小数位。
新手常踩的坑
"5" + 3报TypeError:字符串和数字不能直接加,先int("5") + 3。int("abc")报ValueError:不是数字的文本转不了。0.1 + 0.2不等于0.3,而是0.30000000000000004——浮点数是二进制的近似值。金额计算别用 float 直接比相等,必要时用round()或 Decimal。
第 3 天:流程控制:条件、循环与缩进
最重要的一句话:缩进就是代码块
Python 不用 {} 表示代码块,而是用相同数量的空格/制表符缩进。同一层的语句缩进必须一致:
score = 85
if score >= 60: # if 条件后面必须有冒号 :
print("及格") # 这行缩进了 4 个空格,属于 if 内部
print("检查完毕") # 这行顶格,不受 if 影响,总会执行if / elif / else
score = int(input("分数:"))
if score >= 90:
print("优秀")
elif score >= 60: # elif = else if,可以有多个
print("及格")
else:
print("不及格")
# 逻辑运算:and(且) or(或) not(非),还有成员判断 in
age = 20
if age >= 18 and age < 60:
print("成年且未退休")
if "py" in "python": # 判断字符串是否包含
print("包含 py")for 循环
# range(n) 产生 0..n-1;range(1, 101) 产生 1..100(右边开区间,不含 101)
total = 0
for i in range(1, 101): # 经典:1 加到 100
total += i # total += i 就是 total = total + i
print(total) # 5050
for ch in "hi":
print(ch) # 逐字符打印 h、i
for name in ["小明", "小红"]:
print(f"你好,{name}")while 循环与 break / continue
n = 0
while n < 5: # 条件为真就一直循环,小心死循环
n += 1
if n == 2:
continue # 跳过本次循环体剩下的部分
if n == 4:
break # 直接跳出整个循环
print(n) # 输出 1、3(2 被 continue 跳过,到 4 就 break 了)动手练习
写 fizzbuzz.py:从 1 数到 100,3 的倍数打印 Fizz,5 的倍数打印 Buzz,同时是 3 和 5 的倍数打印 FizzBuzz,其余打印数字本身。
提示:判断「同时是 3 和 5 的倍数」要用 x % 15 == 0 或 x % 3 == 0 and x % 5 == 0,并且这个分支要放在最前面判断。
新手常踩的坑
if/while/for行尾忘写冒号:,最常见的 SyntaxError 来源。- Tab 和空格混用缩进 →
IndentationError: unexpected indent。统一用 4 个空格(让编辑器把 Tab 自动转空格)。 range(1, 100)到不了 100(右边开区间);循环条件写错导致死循环——卡住按Ctrl+C强制中断。=(赋值)和==(判断相等)搞混,这是所有语言新手都中招的地方。
第 4 天:四个容器:列表、元组、字典、集合
list 列表:有序、可修改
fruits = ["apple", "banana", "cherry"]
print(fruits[0]) # 下标从 0 开始: apple
print(fruits[-1]) # 倒数第一个: cherry
print(fruits[1:3]) # 切片,左闭右开 -> ['banana', 'cherry']
fruits.append("durian") # 末尾追加
fruits.insert(0, "mango")
fruits.remove("apple") # 删除指定值
last = fruits.pop() # 弹出并返回末尾元素
print(sorted(fruits)) # 返回排序后的新列表,不改变原列表
print(len(fruits)) # 元素个数
nums = [x * x for x in range(1, 6)] # 列表推导式 -> [1, 4, 9, 16, 25]tuple 元组:有序、不可修改
point = (3, 4)
# point[0] = 99 # 不行!元组不能改
x, y = point # 解包:一次性取出
a, b = b, a # 经典技巧:交换两个变量dict 字典:键值对
student = {"name": "小红", "age": 18, "city": "北京"}
print(student["name"]) # 小红
print(student.get("score", 0)) # 键不存在时返回默认值 0,而不是报错
student["score"] = 92 # 新增或修改
student["age"] = 19
student.pop("city") # 删除键
for key, value in student.items(): # 同时遍历键和值
print(key, "=", value)
if "name" in student: # 判断键是否存在
print("有 name")set 集合:无序、自动去重
tags = {"a", "b", "a", "c"}
print(tags) # {'a', 'c', 'b'} 顺序不保证,且 a 只有一个
tags.add("d")
print("a" in tags) # True 成员判断非常快
a, b = {1, 2, 3}, {2, 3, 4}
print(a & b) # 交集 {2, 3}
print(a | b) # 并集 {1, 2, 3, 4}动手练习
写 wordcount.py:给定一句话 s = "the cat and the dog and the bird",统计每个单词出现次数并打印。
提示:s.split() 把句子拆成单词列表 → for 遍历 → 用 dict 的 get(word, 0) + 1 累加。
新手常踩的坑
d["不存在"]会报KeyError,不确定时用d.get(key, 默认值)。- 列表下标越界
fruits[99]报IndexError。 - 复制列表要用切片或
list():b = a只是让两个名字指向同一个列表,改b会连累a;b = a[:]才是复制一份。 - 切片是左闭右开:
s[0:3]不含第 3 个元素;s[::-1]是倒序,这个技巧很常用。
第 5 天:函数与模块:把代码装进盒子
定义与调用
函数把一段逻辑装进盒子,起个名字,随时调用:
def greet(name, emoji="👋"): # 参数可以带默认值,调用时可不传
"""问候某人(这是文档字符串 docstring,用于说明函数作用)"""
return f"{emoji} 你好,{name}"
print(greet("小明")) # 👋 你好,小明
print(greet("小红", "🎉")) # 🎉 你好,小红
print(greet(name="小刚")) # 关键字参数,顺序无关
def add_and_double(a, b):
total = a + b # 函数内的变量是局部的
return total * 2
result = add_and_double(3, 4) # 调用函数并把返回值存起来
print(result) # 14
# 没写 return 的函数返回 None
def say_hi():
print("hi")
print(say_hi()) # None作用域(先记直觉)
函数里面的变量在外面不可见(局部变量);函数可以读取外面的变量,但想修改它得用 global——新手阶段建议别用 global,把需要的数据通过参数传进去、用 return 传出来。
def demo():
x = 10 # 局部变量,函数外不存在
demo()
# print(x) # NameError!外面访问不到import 导入模块
Python 自带很多「标准库」,导入即可用:
import math
import random
from datetime import date # from 模块 import 名字,之后可直接用
print(math.sqrt(16)) # 4.0
print(math.pi) # 3.14159...
print(random.randint(1, 6)) # 1~6 随机整数(掷骰子)
print(date.today()) # 今天的日期组织代码的惯例
每个脚本都可以有一个「主入口」:
def game():
# ... 游戏逻辑 ...
if __name__ == "__main__": # 只有直接运行本文件时才执行下面这行
game()现在不理解没关系,先照抄这个结构,后面写工具脚本都用它。
动手练习
写 guess.py 猜数字游戏:
random.randint(1, 100)生成秘密数字;while True循环里让用户猜,输入转int;- 大了提示「太大了」,小了提示「太小了」,猜中
break并打印用了多少次; - 把逻辑放进
def main():,底部用if __name__ == "__main__":调用。
新手常踩的坑
- 只定义了函数却没调用——代码不会自己跑,函数要调用才执行。
- 函数内拼错变量名 →
NameError;return后面的代码永远不会执行。 - 默认参数放在无默认参数后面:
def f(a, b=1)合法,def f(a=1, b)直接语法错误。 - 经典陷阱:默认参数是可变对象(列表/字典)时会被多个调用共享,如
def add(item, bag=[]): bag.append(item); return bag。新手先记结论:默认值用None,函数里再初始化:
def add(item, bag=None):
if bag is None:
bag = []
bag.append(item)
return bag第 6 天:文件读写与异常处理
读写文本文件
# 写文件:w 覆盖写,a 追加写;encoding 指定 utf-8,中文不乱码
with open("note.txt", "w", encoding="utf-8") as f:
f.write("第一行\n")
f.write("第二行\n")
# 读文件:with 负责自动关闭文件,不用手动 f.close()
with open("note.txt", "r", encoding="utf-8") as f:
content = f.read() # 整个读成一个大字符串
lines = content.splitlines() # 按行拆成列表
print(lines) # ['第一行', '第二行']with open(...) as f: 是 Python 最推荐的写法:无论后面代码是否出错,文件都会被正确关闭。
异常处理 try / except
程序运行出错时会「抛出异常」,默认会中断程序并打印红色报错。用 try/except 接住它、给用户友好提示:
try:
num = int(input("请输入一个整数:"))
print(100 / num)
except ValueError:
print("你输入的不是整数")
except ZeroDivisionError:
print("不能除以 0")
except Exception as e: # 兜底:捕获其他所有异常(顺序要放最后)
print(f"出错了:{e}")
else: # 没出错才执行
print("计算完成,没有异常")处理文件不存在的场景
from pathlib import Path # 现代的文件路径库
p = Path("memo") # 用 Path 拼接路径、建目录更直观
p.mkdir(exist_ok=True) # 不存在就创建目录,已存在也不报错
try:
with open("memo/words.txt", "r", encoding="utf-8") as f:
words = f.read().split()
print(f"共 {len(words)} 个词")
except FileNotFoundError:
print("文件还不存在,先写一点内容吧")动手练习
写 filecount.py:
- 读入一个文本文件(没有就先
with open写入几行内容); - 统计:一共多少行、去掉空行后多少行、
"python"(不区分大小写)出现几次; - 把统计结果以追加模式写进同一个文件。
新手常踩的坑
- 忘记
with或手动close:文件一直占着,Windows 上可能删不掉/写不进。 - 中文读出来乱码 → 打开/写入都显式传
encoding="utf-8"。 - 用
"w"打开一个已有文件会直接清空它——想保留旧内容用"a"追加,或先读后写。 except裸捕获(不写异常类型)会把所有错误都吞掉,出问题连日志都没有。至少写except Exception as e并打印,或者接住具体类型。
第 7 天:综合小项目:命令行备忘录
把前 6 天全部串起来:这个程序支持「添加 / 查看 / 删除 / 退出」四件事,数据存进文件——一个真正能天天用的小工具。
完整代码
# memo.py —— 命令行备忘录:第 7 天综合练习
# 运行环境:Python 3.10+;数据保存到当前目录的 memos.txt
import os
FILE = "memos.txt"
def load_memos():
"""读取备忘录列表;文件不存在返回空列表"""
if not os.path.exists(FILE):
return []
with open(FILE, "r", encoding="utf-8") as f:
return [line.strip() for line in f if line.strip()]
def save_memos(memos):
"""把列表逐行写回文件(w 模式覆盖)"""
with open(FILE, "w", encoding="utf-8") as f:
for m in memos:
f.write(m + "\n")
def show(memos):
if not memos:
print("(还没有备忘,先加一条吧)")
return
for i, m in enumerate(memos, start=1): # 从 1 开始编号
print(f"{i}. {m}")
def add(memos, text):
memos.append(text)
save_memos(memos)
print(f"已添加:{text}")
def delete(memos, index):
if 1 <= index <= len(memos):
removed = memos.pop(index - 1)
save_memos(memos)
print(f"已删除:{removed}")
else:
print(f"序号无效,共 {len(memos)} 条")
def main():
memos = load_memos()
while True:
print("\n=== 备忘录 ===")
show(memos)
cmd = input("请选择 [a]添加 [d]删除 [q]退出:").strip().lower()
if cmd == "q":
print("再见!")
break
elif cmd == "a":
text = input("要记什么:").strip()
if text:
add(memos, text)
elif cmd == "d":
try:
num = int(input("删除第几条:"))
except ValueError:
print("请输入数字")
continue
delete(memos, num)
else:
print("不认识这个命令,输入 a / d / q")
if __name__ == "__main__":
main()它用到了什么(逐点对照)
| 代码里的写法 | 对应第几天 |
|---|---|
if not os.path.exists(FILE)、while True、break、continue | 第 1/3 天:条件与循环 |
def load_memos()、参数、return、默认参数 start=1 | 第 5 天:函数 |
open + with + encoding="utf-8"、for line in f | 第 6 天:文件 |
try/except ValueError 接住非数字输入 | 第 6 天:异常 |
f-string、.strip()、.lower()、列表切片与 enumerate | 第 2/4 天:数据与容器 |
if __name__ == "__main__": 入口惯例 | 第 5 天:模块组织 |
7 天自查清单
学完第 7 天,你应该能——
- [ ] 新建一个
.py文件并运行它,读懂报错的最后一行 - [ ] 用变量、
f-string、if/for/while写小逻辑 - [ ] 用
list/dict组织数据,用推导式简化循环 - [ ] 把重复逻辑写成函数,用
import引入标准库 - [ ] 读写文件并处理常见异常,让程序不轻易崩溃
- [ ] 独立完成一个「输入 → 处理 → 存储」的小工具
哪一项打不了勾,就回头重做那一天的练习,而不是往下赶。
下一步怎么走
- 读本方向的 Python 语言全景页:数据模型(魔术方法)、装饰器/生成器、类型注解与 Pydantic——它解释「为什么 Python 是这样」。
- 把备忘录改成用
dict存「日期 + 内容」,按日期筛选——练第 4 天的数据结构。 - 每天给自己写一个自动化小脚本(整理下载文件夹、统计阅读时长),从「学会」到「熟练」靠的是持续写。
- 遇到问题先查官方文档(有简体中文版),再搜索报错原文。