Skip to content

7 天学会 Python

写给完全没写过 Python(甚至没写过代码)的你:不预设任何编程基础,只假设你会用电脑、能上网安装软件。7 天,每天 30–60 分钟,目标是先能跑起来、能自己写小脚本,而不是一口吃成专家。

本页与进阶向的 Python 语言全景页(数据模型、装饰器、类型注解等)互补:先把本页走通,再去看那页理解「为什么」。 文中示例基于 Python 3.10+(推荐直接安装 3.12/3.13),均可复制到本地运行验证。

目录

  1. 第 1 天:装好环境,跑通第一个程序
  2. 第 2 天:数据与运算:数字、字符串、布尔
  3. 第 3 天:流程控制:条件、循环与缩进
  4. 第 4 天:四个容器:列表、元组、字典、集合
  5. 第 5 天:函数与模块:把代码装进盒子
  6. 第 6 天:文件读写与异常处理
  7. 第 7 天:综合小项目:命令行备忘录

7 天路线总览

天数主题你将学会当天产出
第 1 天环境与第一个程序安装、运行 .pyprint/变量/input一个会「自我介绍」的小程序
第 2 天数据与运算数字/字符串/布尔、类型转换、f-string一个金额计算器
第 3 天流程控制if/for/while、缩进规则FizzBuzz 小游戏
第 4 天容器list/dict/tuple/set、切片、推导式字符词频统计
第 5 天函数与模块函数、参数、作用域、import猜数字游戏
第 6 天文件与异常读写文件、withtry/except文件统计小工具
第 7 天综合项目把前 6 天串成完整工具命令行备忘录

学习方法建议:先照着敲一遍跑通,再删掉自己重写;卡住了先读报错最后一行;第 7 天之前每天都要动手,只看不敲等于没学。


第 1 天:装好环境,跑通第一个程序

安装 Python

python.org 下载并安装(Windows 安装时务必勾选 Add python.exe to PATH;macOS 建议用官方安装包而非系统自带的老版本)。

安装完打开终端(Windows 是 PowerShell 或 CMD),验证:

bash
# 终端里执行(Windows 下如果 python3 不行就试 python)
python3 --version   # 期望输出类似 Python 3.12.x

Windows 注意:命令可能是 python 而不是 python3;两个都试一下,以后统一用能用的那个。

三种运行方式

  1. 交互式解释器(REPL):终端输入 python3 回车进入,出现 >>> 提示符后逐行输入立即出结果,输 exit() 退出。适合试小片段。
  2. 运行脚本文件:把代码存成 xxx.py,在终端执行 python3 xxx.py。这是之后的主要方式。
  3. 编辑器/IDE:推荐 VS Code(装 Python 插件)或 PyCharm,写大文件更舒服;第一天用最简单的方式即可,不必纠结工具。

第一个程序

新建 hello.py

python
# 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 最常用的四种数据 + 一个特殊值:

类型例子说明
整数 int42-7没有小数部分
浮点数 float3.142.0有小数部分(计算机里是近似值)
字符串 str"你好"'py'文本,必须加引号
布尔 boolTrueFalse判断结果,只有两个值
空值 NoneTypeNone表示「还没有值」,后面讲函数时会遇到

type() 可以看一个数据的类型:

python
print(type(42))     # <class 'int'>
print(type("42"))   # <class 'str'> —— 带引号就是文本

算术运算符

python
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 把变量塞进文本:

python
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

类型转换

用户输入、读文件得到的一般都是字符串,需要时手动转:

python
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" + 3TypeError:字符串和数字不能直接加,先 int("5") + 3
  • int("abc")ValueError:不是数字的文本转不了。
  • 0.1 + 0.2 不等于 0.3,而是 0.30000000000000004——浮点数是二进制的近似值。金额计算别用 float 直接比相等,必要时用 round() 或 Decimal。

第 3 天:流程控制:条件、循环与缩进

最重要的一句话:缩进就是代码块

Python 不用 {} 表示代码块,而是用相同数量的空格/制表符缩进。同一层的语句缩进必须一致:

python
score = 85
if score >= 60:              # if 条件后面必须有冒号 :
    print("及格")            # 这行缩进了 4 个空格,属于 if 内部
print("检查完毕")            # 这行顶格,不受 if 影响,总会执行

if / elif / else

python
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 循环

python
# 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

python
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 == 0x % 3 == 0 and x % 5 == 0,并且这个分支要放在最前面判断。

新手常踩的坑

  • if/while/for 行尾忘写冒号 :,最常见的 SyntaxError 来源。
  • Tab 和空格混用缩进 → IndentationError: unexpected indent统一用 4 个空格(让编辑器把 Tab 自动转空格)。
  • range(1, 100) 到不了 100(右边开区间);循环条件写错导致死循环——卡住按 Ctrl+C 强制中断。
  • =(赋值)和 ==(判断相等)搞混,这是所有语言新手都中招的地方。

第 4 天:四个容器:列表、元组、字典、集合

list 列表:有序、可修改

python
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 元组:有序、不可修改

python
point = (3, 4)
# point[0] = 99  # 不行!元组不能改
x, y = point       # 解包:一次性取出
a, b = b, a        # 经典技巧:交换两个变量

dict 字典:键值对

python
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 集合:无序、自动去重

python
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 遍历 → 用 dictget(word, 0) + 1 累加。

新手常踩的坑

  • d["不存在"] 会报 KeyError,不确定时用 d.get(key, 默认值)
  • 列表下标越界 fruits[99]IndexError
  • 复制列表要用切片或 list()b = a 只是让两个名字指向同一个列表,改 b 会连累 ab = a[:] 才是复制一份。
  • 切片是左闭右开s[0:3] 不含第 3 个元素;s[::-1] 是倒序,这个技巧很常用。

第 5 天:函数与模块:把代码装进盒子

定义与调用

函数把一段逻辑装进盒子,起个名字,随时调用:

python
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 传出来。

python
def demo():
    x = 10        # 局部变量,函数外不存在
demo()
# print(x)        # NameError!外面访问不到

import 导入模块

Python 自带很多「标准库」,导入即可用:

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())                # 今天的日期

组织代码的惯例

每个脚本都可以有一个「主入口」:

python
def game():
    # ... 游戏逻辑 ...

if __name__ == "__main__":         # 只有直接运行本文件时才执行下面这行
    game()

现在不理解没关系,先照抄这个结构,后面写工具脚本都用它。

动手练习

guess.py 猜数字游戏:

  1. random.randint(1, 100) 生成秘密数字;
  2. while True 循环里让用户猜,输入转 int
  3. 大了提示「太大了」,小了提示「太小了」,猜中 break 并打印用了多少次;
  4. 把逻辑放进 def main():,底部用 if __name__ == "__main__": 调用。

新手常踩的坑

  • 只定义了函数却没调用——代码不会自己跑,函数要调用才执行
  • 函数内拼错变量名 → NameErrorreturn 后面的代码永远不会执行。
  • 默认参数放在无默认参数后面def f(a, b=1) 合法,def f(a=1, b) 直接语法错误。
  • 经典陷阱:默认参数是可变对象(列表/字典)时会被多个调用共享,如 def add(item, bag=[]): bag.append(item); return bag。新手先记结论:默认值用 None,函数里再初始化
python
def add(item, bag=None):
    if bag is None:
        bag = []
    bag.append(item)
    return bag

第 6 天:文件读写与异常处理

读写文本文件

python
# 写文件: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 接住它、给用户友好提示:

python
try:
    num = int(input("请输入一个整数:"))
    print(100 / num)
except ValueError:
    print("你输入的不是整数")
except ZeroDivisionError:
    print("不能除以 0")
except Exception as e:        # 兜底:捕获其他所有异常(顺序要放最后)
    print(f"出错了:{e}")
else:                         # 没出错才执行
    print("计算完成,没有异常")

处理文件不存在的场景

python
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

  1. 读入一个文本文件(没有就先 with open 写入几行内容);
  2. 统计:一共多少行、去掉空行后多少行、"python"(不区分大小写)出现几次;
  3. 把统计结果以追加模式写进同一个文件。

新手常踩的坑

  • 忘记 with 或手动 close:文件一直占着,Windows 上可能删不掉/写不进。
  • 中文读出来乱码 → 打开/写入都显式传 encoding="utf-8"
  • "w" 打开一个已有文件会直接清空它——想保留旧内容用 "a" 追加,或先读后写。
  • except 裸捕获(不写异常类型)会把所有错误都吞掉,出问题连日志都没有。至少写 except Exception as e 并打印,或者接住具体类型。

第 7 天:综合小项目:命令行备忘录

把前 6 天全部串起来:这个程序支持「添加 / 查看 / 删除 / 退出」四件事,数据存进文件——一个真正能天天用的小工具。

完整代码

python
# 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 Truebreakcontinue第 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-stringif/for/while 写小逻辑
  • [ ] 用 list/dict 组织数据,用推导式简化循环
  • [ ] 把重复逻辑写成函数,用 import 引入标准库
  • [ ] 读写文件并处理常见异常,让程序不轻易崩溃
  • [ ] 独立完成一个「输入 → 处理 → 存储」的小工具

哪一项打不了勾,就回头重做那一天的练习,而不是往下赶。

下一步怎么走

  1. 读本方向的 Python 语言全景页:数据模型(魔术方法)、装饰器/生成器、类型注解与 Pydantic——它解释「为什么 Python 是这样」。
  2. 把备忘录改成用 dict 存「日期 + 内容」,按日期筛选——练第 4 天的数据结构。
  3. 每天给自己写一个自动化小脚本(整理下载文件夹、统计阅读时长),从「学会」到「熟练」靠的是持续写。
  4. 遇到问题先查官方文档(有简体中文版),再搜索报错原文。

回到 编程语言概览 查看其它语言笔记,或对照五语言对比了解 Python 与其他语言的异同。

基于 VitePress 构建 · 内容以知识共享方式沉淀