Python 基础入门

欢迎来到 Python 的世界!这份文档会帮助你从零开始理解项目中的代码。


写在前面:编程是什么?

编程就是给计算机下命令,让它帮你做事。

就像你告诉朋友:

"帮我买一杯咖啡,要热的,加糖"

编程就是用代码告诉计算机:

"帮我发送一条消息,发给 @BotFather,内容是 /start"


一、Python 是什么?

Python 是一种编程语言,就像汉语、英语是人类语言一样。

对比 人类语言 编程语言
用途 人与人交流 人与计算机交流
例子 汉语、英语 Python、JavaScript
特点 有歧义 必须精确

为什么选 Python?

其他语言写循环:
for (int i = 0; i < 10; i++) {
    System.out.println(i);
}

Python 写循环:
for i in range(10):
    print(i)

Python 更简洁,更像人说话!

怎么运行 Python?

# 方法1:直接运行文件
python hello.py

# 方法2:进入交互模式(像计算器一样)
python
>>> print("Hello")
Hello
>>> 1 + 1
2
>>> exit()    # 退出

二、变量 —— 给数据起名字

什么是变量?

想象你有很多盒子,每个盒子装一样东西。为了方便找,你在盒子上贴了标签。


┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ name │ │ age │ │ city │
│ "小明" │ │ 18 │ │ "北京" │
└─────────────┘ └─────────────┘ └─────────────┘


这就是变量:**变量名 = 标签,变量值 = 盒子里的东西**。

### 创建变量

```python
# 创建变量:名字 = 值
name = "小明"
age = 18
is_student = True

# 使用变量:用名字找值
print(name)        # 小明
print(age)         # 18

重要: = 不是"等于",是"赋值"!把右边的东西放进左边的盒子里。

x = 5        # 把 5 放进叫 x 的盒子
x = x + 1    # 把 x 盒子的值取出来,加1,再放回去
print(x)     # 6

变量命名规则

# ✅ 正确的名字
user_name = "张三"      # 用下划线连接(推荐)
userName = "李四"       # 驼峰命名
age1 = 20              # 可以有数字
_private = "秘密"       # 下划线开头表示"私有的"

# ❌ 错误的名字
1name = "错误"          # 不能数字开头
user-name = "错误"      # 减号会被当成减法
my name = "错误"        # 不能有空格
class = "错误"          # 不能用 Python 关键字

命名建议

# 好的名字:见名知意
user_age = 18
total_price = 99.9
is_logged_in = True

# 不好的名字:看不懂
a = 18
x = 99.9
flag = True

变量可以改变类型

x = 10          # x 是整数
x = "hello"     # x 变成字符串(Python 允许,但不推荐)

三、数据类型 —— 数据的种类

就像超市里不同商品放不同货架,不同数据有不同类型。

1. 字符串(str)—— 文字

用引号包起来的就是字符串。

# 单引号、双引号都可以
name = '小明'
city = "北京"

# 三引号:多行文字
poem = '''
床前明月光,
疑是地上霜。
'''

# 为什么需要引号?
# 没有引号,Python 会把它当成变量名
name = 小明      # ❌ 错误:小明是谁?
name = "小明"    # ✅ 正确:这是一个文字

字符串常用操作

# 拼接
first = "Hello"
last = "World"
full = first + " " + last
print(full)           # Hello World

# 重复
line = "-" * 20
print(line)           # --------------------

# 长度
print(len("小明"))     # 2(两个汉字)

# 包含判断
text = "我喜欢Python"
print("Python" in text)    # True
print("Java" in text)      # False

# 取出单个字符
text = "Python"
print(text[0])        # P(第1个)
print(text[-1])       # n(最后1个)

# 取出部分(切片)
text = "Python"
print(text[0:3])      # Pyt(第1到第3个,不含第4个)
print(text[:3])       # Pyt(从头取3个)
print(text[3:])       # hon(从第4个取到最后)

字符串格式化

name = "小明"
age = 18

# 方法1:f-string(推荐,Python 3.6+)
message = f"我叫{name},今年{age}岁"
print(message)        # 我叫小明,今年18岁

# 方法2:format()
message = "我叫{},今年{}岁".format(name, age)

# 方法3:百分号(老写法)
message = "我叫%s,今年%d岁" % (name, age)

f-string 进阶:

price = 19.999
count = 5

print(f"单价:{price:.2f}元")      # 保留2位小数:单价:20.00元
print(f"数量:{count:03d}")         # 补零到3位:数量:005
print(f"总价:{price * count}元")   # 可以计算:总价:99.995元

什么时候用字符串?

  • 名字、地址、描述
  • 消息内容
  • API 密钥、Token
  • 文件路径

2. 整数(int)—— 整数

没有小数点的数字。

age = 18
count = 100
temperature = -10      # 可以是负数
big_number = 1_000_000 # 可以用下划线分隔,更易读(Python 3.6+)

整数运算

a = 10
b = 3

print(a + b)     # 13(加)
print(a - b)     # 7(减)
print(a * b)     # 30(乘)
print(a / b)     # 3.333...(除,结果是浮点数)
print(a // b)    # 3(整除,只取整数部分)
print(a % b)     # 1(取余数,10除以3余1)
print(a ** b)    # 100(幂运算,10的3次方)

整除和取余的妙用:

# 分离分钟和秒
total_seconds = 125
minutes = total_seconds // 60    # 2(分钟)
seconds = total_seconds % 60     # 5(剩余秒数)
print(f"{minutes}分{seconds}秒")  # 2分5秒

# 判断奇偶
num = 7
if num % 2 == 0:
    print("偶数")
else:
    print("奇数")

什么时候用整数?

  • 年龄、数量、次数
  • ID(用户ID、消息ID)
  • 排名、分数
  • 索引位置

3. 浮点数(float)—— 小数

有小数点的数字。

price = 99.9
pi = 3.14159265358979
temp = -0.5
scientific = 1.5e10    # 科学计数法:15000000000.0

浮点数的坑:

# 计算机存储小数有精度问题
print(0.1 + 0.2)    # 0.30000000000000004(不是精确的0.3)

# 解决方法:用 round() 四舍五入
result = 0.1 + 0.2
print(round(result, 2))    # 0.3(保留2位小数)

什么时候用浮点数?

  • 价格、金额
  • 温度、速度
  • 比例、百分比
  • 科学计算

4. 布尔值(bool)—— 真或假

只有两个值:True(真)和 False(假)。

is_adult = True
has_license = False

# 注意:首字母必须大写!
true   # ❌ 错误
True   # ✅ 正确

布尔运算

# 与(and):两个都真才真
print(True and True)    # True
print(True and False)   # False

# 或(or):有一个真就真
print(True or False)    # True
print(False or False)   # False

# 非(not):取反
print(not True)         # False
print(not False)        # True

什么算"真"?

# 这些都是 False
bool(0)         # False
bool(0.0)       # False
bool("")        # False(空字符串)
bool([])        # False(空列表)
bool({})        # False(空字典)
bool(None)      # False

# 其他的都是 True
bool(1)         # True
bool(-1)        # True
bool("hello")   # True
bool([0])       # True(列表有元素)

什么时候用布尔值?

  • 开关状态(开/关、是/否)
  • 条件判断
  • 验证结果(成功/失败)

5. None —— 空值

表示"什么都没有"或"不存在"。

result = None      # 还没有结果

# 常见用途:
# 1. 函数没有返回值时
def greet():
    print("Hello")
    # 没有 return,默认返回 None

# 2. 表示"无"的状态
user = get_user(999)    # 用户不存在时返回 None
if user is None:
    print("用户不存在")

# 3. 作为默认值
def search(query, limit=None):
    if limit is None:
        limit = 10    # 默认查询10条

None vs 0 vs 空字符串:

# 它们不一样!
value1 = None       # 没有值
value2 = 0          # 值是0
value3 = ""         # 值是空字符串

# 判断是否是 None
if value is None:           # ✅ 推荐
if value == None:           # ❌ 不推荐

类型转换

# 字符串转数字
num_str = "123"
num = int(num_str)          # 123(整数)
num = float("3.14")         # 3.14(浮点数)

# 数字转字符串
age = 18
age_str = str(age)          # "18"

# 布尔转换
bool(1)         # True
bool(0)         # False
bool("")        # False
bool("hello")   # True

# 查看类型
x = 123
print(type(x))              # <class 'int'>
print(type(x).__name__)     # 'int'

四、列表(List)—— 有序的盒子们

什么是列表?

列表就是一排有顺序的盒子,每个盒子里放一样东西。

索引:     0       1       2       3
       ┌───────┬───────┬───────┬───────┐
       │ "苹果" │ "香蕉" │ "橙子" │ "葡萄" │
       └───────┴───────┴───────┴───────┘
索引:    -4      -3      -2      -1
  • 索引从 0 开始(第一个是0,不是1)
  • 负数索引从后往前数(-1是最后一个)

创建列表

# 创建列表
fruits = ["苹果", "香蕉", "橙子"]
numbers = [1, 2, 3, 4, 5]
mixed = ["小明", 18, True, 99.9]    # 可以放不同类型

# 空列表
empty1 = []
empty2 = list()

# 创建相同元素的列表
zeros = [0] * 5       # [0, 0, 0, 0, 0]

访问元素

fruits = ["苹果", "香蕉", "橙子", "葡萄"]

# 用索引取元素
print(fruits[0])      # 苹果(第1个)
print(fruits[2])      # 橙子(第3个)
print(fruits[-1])     # 葡萄(最后1个)
print(fruits[-2])     # 橙子(倒数第2个)

# 索引超出范围会报错
print(fruits[10])     # IndexError: list index out of range

切片 —— 取出一部分

fruits = ["苹果", "香蕉", "橙子", "葡萄", "西瓜"]

# 语法:列表[开始:结束](不包含结束位置)
print(fruits[1:3])    # ["香蕉", "橙子"](索引1到2)
print(fruits[:3])     # ["苹果", "香蕉", "橙子"](从头取3个)
print(fruits[2:])     # ["橙子", "葡萄", "西瓜"](从索引2到最后)
print(fruits[::2])    # ["苹果", "橙子", "西瓜"](每隔1个取1个)
print(fruits[::-1])   # ["西瓜", "葡萄", "橙子", "香蕉", "苹果"](反转)

# 切片不会报错,超出范围会自动调整
print(fruits[2:100])  # ["橙子", "葡萄", "西瓜"]

修改列表

fruits = ["苹果", "香蕉", "橙子"]

# 修改元素
fruits[0] = "西瓜"
print(fruits)         # ["西瓜", "香蕉", "橙子"]

# 添加元素
fruits.append("葡萄")           # 加到最后
print(fruits)         # ["西瓜", "香蕉", "橙子", "葡萄"]

fruits.insert(1, "草莓")         # 插入到位置1
print(fruits)         # ["西瓜", "草莓", "香蕉", "橙子", "葡萄"]

# 删除元素
fruits.remove("香蕉")            # 删除指定值
print(fruits)         # ["西瓜", "草莓", "橙子", "葡萄"]

del fruits[0]                    # 删除指定位置
print(fruits)         # ["草莓", "橙子", "葡萄"]

last = fruits.pop()              # 删除并返回最后一个
print(last)           # 葡萄
print(fruits)         # ["草莓", "橙子"]

item = fruits.pop(0)             # 删除并返回指定位置
print(item)           # 草莓

列表常用操作

fruits = ["苹果", "香蕉", "橙子", "香蕉"]

# 长度
print(len(fruits))              # 4

# 查找
print("苹果" in fruits)          # True
print("西瓜" in fruits)          # False
print(fruits.index("香蕉"))      # 1(第一个香蕉的位置)
print(fruits.count("香蕉"))      # 2(香蕉出现2次)

# 排序
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
numbers.sort()                  # 排序(修改原列表)
print(numbers)        # [1, 1, 2, 3, 4, 5, 6, 9]

numbers.reverse()               # 反转
print(numbers)        # [6, 9, 5, 4, 3, 2, 1, 1]

# 排序不修改原列表
numbers = [3, 1, 4, 1, 5]
sorted_numbers = sorted(numbers)
print(numbers)        # [3, 1, 4, 1, 5](不变)
print(sorted_numbers) # [1, 1, 3, 4, 5]

# 清空
fruits.clear()
print(fruits)         # []

列表合并

list1 = [1, 2, 3]
list2 = [4, 5, 6]

# 用 + 合并
combined = list1 + list2
print(combined)       # [1, 2, 3, 4, 5, 6]

# 用 extend
list1.extend(list2)
print(list1)          # [1, 2, 3, 4, 5, 6]

# 用 append(注意区别!)
list1 = [1, 2, 3]
list1.append(list2)
print(list1)          # [1, 2, 3, [4, 5, 6]](整个列表作为一个元素)

列表推导式 —— 快速创建列表

# 传统写法
squares = []
for i in range(5):
    squares.append(i ** 2)
print(squares)        # [0, 1, 4, 9, 16]

# 列表推导式
squares = [i ** 2 for i in range(5)]
print(squares)        # [0, 1, 4, 9, 16]

# 带条件
evens = [i for i in range(10) if i % 2 == 0]
print(evens)          # [0, 2, 4, 6, 8]

# 带条件表达式
labels = ["偶数" if i % 2 == 0 else "奇数" for i in range(5)]
print(labels)         # ["偶数", "奇数", "偶数", "奇数", "偶数"]

什么时候用列表?

  • 存储一组数据
  • 需要保持顺序
  • 需要频繁增删
  • 存储消息列表、用户列表等

五、字典(Dict)—— 用名字找值

什么是字典?

列表用编号找东西,字典用名字找东西。

就像电话簿:

姓名        电话
─────────────────
小明    →  138xxxx
小红    →  139xxxx
小刚    →  137xxxx

用名字(键)就能找到电话(值)。

创建字典

# 创建字典:{键: 值, 键: 值, ...}
person = {
    "name": "小明",
    "age": 18,
    "city": "北京"
}

# 空字典
empty1 = {}
empty2 = dict()

# 从列表创建
keys = ["a", "b", "c"]
values = [1, 2, 3]
d = dict(zip(keys, values))
print(d)              # {"a": 1, "b": 2, "c": 3}

访问值

person = {"name": "小明", "age": 18, "city": "北京"}

# 用键访问
print(person["name"])           # 小明
print(person["age"])            # 18

# 键不存在会报错!
print(person["phone"])          # KeyError: 'phone'

# 用 get() 更安全
print(person.get("name"))       # 小明
print(person.get("phone"))      # None(不存在返回 None)
print(person.get("phone", "无")) # 无(指定默认值)

修改字典

person = {"name": "小明", "age": 18}

# 添加/修改
person["city"] = "北京"          # 添加新键值对
person["age"] = 19              # 修改已有值
print(person)
# {"name": "小明", "age": 19, "city": "北京"}

# 删除
del person["city"]
print(person)         # {"name": "小明", "age": 19}

age = person.pop("age")          # 删除并返回值
print(age)            # 19
print(person)         # {"name": "小明"}

# 更新(合并另一个字典)
person = {"name": "小明", "age": 18}
extra = {"city": "北京", "job": "学生"}
person.update(extra)
print(person)
# {"name": "小明", "age": 18, "city": "北京", "job": "学生"}

遍历字典

person = {"name": "小明", "age": 18, "city": "北京"}

# 遍历键
for key in person:
    print(key)
# name, age, city

# 遍历键(更明确)
for key in person.keys():
    print(key)

# 遍历值
for value in person.values():
    print(value)
# 小明, 18, 北京

# 遍历键值对(最常用)
for key, value in person.items():
    print(f"{key}: {value}")
# name: 小明
# age: 18
# city: 北京

字典推导式

# 传统写法
squares = {}
for i in range(5):
    squares[i] = i ** 2
print(squares)        # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# 字典推导式
squares = {i: i ** 2 for i in range(5)}
print(squares)        # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# 带条件
even_squares = {i: i ** 2 for i in range(10) if i % 2 == 0}
print(even_squares)   # {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}

嵌套字典

# 字典里套字典
users = {
    "user1": {
        "name": "小明",
        "age": 18
    },
    "user2": {
        "name": "小红",
        "age": 20
    }
}

print(users["user1"]["name"])    # 小明

# 字典里套列表
person = {
    "name": "小明",
    "hobbies": ["游泳", "阅读", "游戏"]
}
print(person["hobbies"][0])      # 游泳

# 列表里套字典
students = [
    {"name": "小明", "score": 90},
    {"name": "小红", "score": 85},
    {"name": "小刚", "score": 95}
]
print(students[0]["name"])       # 小明

什么时候用字典?

  • 存储配置信息
  • API 返回的 JSON 数据
  • 需要用名字快速查找
  • 存储实体信息(用户、商品等)

六、条件判断 —— 让程序做决定

if 语句

让程序根据条件选择执行不同的代码。

age = 18

if age >= 18:
    print("成年人")

语法要点:

  1. if 后面跟条件,末尾有冒号 :
  2. 条件成立执行的代码要缩进(4个空格)
  3. 条件的结果必须是布尔值(True/False)

if-else

age = 15

if age >= 18:
    print("成年人")
else:
    print("未成年")

if-elif-else

多条件判断。

score = 85

if score >= 90:
    print("优秀")
elif score >= 80:
    print("良好")
elif score >= 60:
    print("及格")
else:
    print("不及格")

注意: elifelse if 的缩写,Python 只有 elif

比较运算符

符号 含义 示例 结果
== 等于 1 == 1 True
!= 不等于 1 != 2 True
> 大于 2 > 1 True
< 小于 1 < 2 True
>= 大于等于 2 >= 2 True
<= 小于等于 1 <= 2 True

重要: == 是比较,= 是赋值!

a = 5       # 赋值:把5给a
a == 5      # 比较:a等于5吗?(True)

逻辑运算符

age = 25
has_license = True

# and:两个都真才真
if age >= 18 and has_license:
    print("可以开车")

# or:有一个真就真
day = "周六"
if day == "周六" or day == "周日":
    print("周末")

# not:取反
is_member = False
if not is_member:
    print("请先注册")

常用判断技巧

# 判断是否在范围内
age = 25
if 18 <= age <= 60:          # 链式比较
    print("工作年龄")

# 判断列表是否为空
items = []
if items:                     # 有元素为True
    print("列表不为空")
else:
    print("列表为空")

# 判断列表是否包含元素
fruits = ["苹果", "香蕉"]
if "苹果" in fruits:
    print("有苹果")

# 判断字典是否包含键
person = {"name": "小明"}
if "name" in person:
    print("有name键")

# 判断是否为空值
result = None
if result is None:
    print("没有结果")

三元表达式

简写的 if-else。

age = 20

# 传统写法
if age >= 18:
    status = "成年"
else:
    status = "未成年"

# 三元表达式
status = "成年" if age >= 18 else "未成年"

# 在打印中使用
print(f"状态:{'成年' if age >= 18 else '未成年'}")

七、循环 —— 重复做事

for 循环

遍历一个序列,对每个元素做同样的事。

fruits = ["苹果", "香蕉", "橙子"]

for fruit in fruits:
    print(f"我喜欢{fruit}")

# 输出:
# 我喜欢苹果
# 我喜欢香蕉
# 我喜欢橙子

执行过程:

第1次循环:fruit = "苹果" → 打印 "我喜欢苹果"
第2次循环:fruit = "香蕉" → 打印 "我喜欢香蕉"
第3次循环:fruit = "橙子" → 打印 "我喜欢橙子"
循环结束

range() 函数

生成一个数字序列。

# range(n):0 到 n-1
for i in range(5):
    print(i)
# 0, 1, 2, 3, 4

# range(start, stop):start 到 stop-1
for i in range(2, 5):
    print(i)
# 2, 3, 4

# range(start, stop, step):步长
for i in range(0, 10, 2):
    print(i)
# 0, 2, 4, 6, 8

# 倒序
for i in range(5, 0, -1):
    print(i)
# 5, 4, 3, 2, 1

常用循环技巧

# 遍历索引
fruits = ["苹果", "香蕉", "橙子"]
for i in range(len(fruits)):
    print(f"{i}: {fruits[i]}")
# 0: 苹果
# 1: 香蕉
# 2: 橙子

# 同时获取索引和值(推荐)
for index, fruit in enumerate(fruits):
    print(f"{index}: {fruit}")

# 从指定索引开始
for index, fruit in enumerate(fruits, start=1):
    print(f"{index}: {fruit}")
# 1: 苹果
# 2: 香蕉
# 3: 橙子

# 同时遍历多个列表
names = ["小明", "小红", "小刚"]
ages = [18, 20, 19]
for name, age in zip(names, ages):
    print(f"{name}: {age}岁")
# 小明: 18岁
# 小红: 20岁
# 小刚: 19岁

# 遍历字典
person = {"name": "小明", "age": 18}
for key, value in person.items():
    print(f"{key}: {value}")

while 循环

条件为真时一直执行。

count = 0
while count < 5:
    print(count)
    count += 1
# 0, 1, 2, 3, 4

# 死循环(需要用 break 退出)
while True:
    answer = input("输入q退出:")
    if answer == "q":
        break

break 和 continue

# break:跳出整个循环
for i in range(10):
    if i == 5:
        break           # 到5就停止
    print(i)
# 0, 1, 2, 3, 4

# continue:跳过本次,继续下一次
for i in range(5):
    if i == 2:
        continue        # 跳过2
    print(i)
# 0, 1, 3, 4

for-else 和 while-else

循环正常结束(没有 break)时执行 else。

# 查找元素
fruits = ["苹果", "香蕉", "橙子"]
target = "西瓜"

for fruit in fruits:
    if fruit == target:
        print(f"找到{target}")
        break
else:
    print(f"没找到{target}")
# 输出:没找到西瓜

循环嵌套

# 打印九九乘法表
for i in range(1, 10):
    for j in range(1, i + 1):
        print(f"{j}×{i}={i*j}", end=" ")
    print()  # 换行

# 输出:
# 1×1=1
# 1×2=2 2×2=4
# 1×3=3 2×3=6 3×3=9
# ...

八、函数 —— 封装代码块

什么是函数?

函数是一段可重复使用的代码,给它一个名字,随时可以调用。

就像菜谱:

  • 菜谱名 = 函数名
  • 材料 = 参数
  • 菜 = 返回值
# 定义函数
def greet():
    print("你好!")

# 调用函数
greet()      # 你好!
greet()      # 你好!

参数

把数据传给函数。

def greet(name):
    print(f"你好,{name}!")

greet("小明")     # 你好,小明!
greet("小红")     # 你好,小红!

多个参数

def add(a, b):
    return a + b

result = add(3, 5)
print(result)    # 8

# 按位置传参
add(3, 5)        # a=3, b=5

# 按关键字传参
add(a=3, b=5)    # 明确指定
add(b=5, a=3)    # 顺序不重要

返回值

函数执行完返回结果。

def add(a, b):
    return a + b       # 返回计算结果

result = add(3, 5)
print(result)          # 8

# 没有返回值的函数
def say_hello():
    print("Hello")

x = say_hello()        # 打印 Hello
print(x)               # None

# 返回多个值(实际是元组)
def get_info():
    name = "小明"
    age = 18
    return name, age

n, a = get_info()      # 解包
print(n)               # 小明
print(a)               # 18

默认参数

def greet(name, greeting="你好"):
    print(f"{greeting},{name}!")

greet("小明")                    # 你好,小明!
greet("小明", "早上好")           # 早上好,小明!
greet("小明", greeting="晚上好")  # 晚上好,小明!

可变参数

# *args:接收任意数量的位置参数
def add_all(*numbers):
    total = 0
    for n in numbers:
        total += n
    return total

print(add_all(1, 2, 3))        # 6
print(add_all(1, 2, 3, 4, 5))  # 15

# **kwargs:接收任意数量的关键字参数
def print_info(**info):
    for key, value in info.items():
        print(f"{key}: {value}")

print_info(name="小明", age=18, city="北京")
# name: 小明
# age: 18
# city: 北京

变量作用域

# 全局变量
total = 100

def add(n):
    # 局部变量
    local = 10
    return total + n + local

print(add(5))      # 115
# print(local)     # 报错!局部变量外部不可见

# 修改全局变量
count = 0

def increment():
    global count    # 声明使用全局变量
    count += 1

increment()
print(count)        # 1

函数作为参数

def apply(func, value):
    return func(value)

def double(x):
    return x * 2

result = apply(double, 5)
print(result)       # 10

# 使用 lambda(匿名函数)
result = apply(lambda x: x * 2, 5)
print(result)       # 10

常用内置函数

函数 作用 示例
len() 长度 len([1,2,3]) → 3
max() 最大值 max(1, 5, 3) → 5
min() 最小值 min(1, 5, 3) → 1
sum() 求和 sum([1,2,3]) → 6
abs() 绝对值 abs(-5) → 5
round() 四舍五入 round(3.5) → 4
sorted() 排序 sorted([3,1,2]) → [1,2,3]
reversed() 反转 list(reversed([1,2,3])) → [3,2,1]
any() 任一为真 any([False, True]) → True
all() 全部为真 all([True, False]) → False

九、模块 —— 使用外部代码

什么是模块?

模块就是一个 .py 文件,里面有别人写好的代码。

导入方式

# 导入整个模块
import math
print(math.sqrt(16))    # 4.0

# 导入并起别名
import math as m
print(m.pi)             # 3.14159...

# 从模块导入特定内容
from math import sqrt, pi
print(sqrt(16))         # 4.0
print(pi)               # 3.14159...

# 导入所有(不推荐)
from math import *

常用内置模块

# os:操作系统
import os
print(os.getcwd())              # 当前目录
print(os.listdir())             # 目录内容
os.makedirs("new_dir")          # 创建目录

# sys:Python 解释器
import sys
print(sys.version)              # Python 版本
print(sys.path)                 # 模块搜索路径

# datetime:日期时间
from datetime import datetime
now = datetime.now()
print(now)                      # 2026-03-29 12:00:00
print(now.strftime("%Y-%m-%d")) # 2026-03-29

# json:JSON 处理
import json
data = {"name": "小明", "age": 18}
json_str = json.dumps(data)     # 转成 JSON 字符串
data2 = json.loads(json_str)    # 解析 JSON

# random:随机数
import random
print(random.randint(1, 10))    # 1-10 随机整数
print(random.choice([1,2,3]))   # 随机选择一个
random.shuffle([1,2,3])         # 打乱顺序

# time:时间
import time
print(time.time())              # 时间戳
time.sleep(2)                   # 等待2秒

第三方模块

# 安装
pip install telethon

# 指定版本
pip install telethon==1.34.0

# 从文件安装
pip install -r requirements.txt

# 卸载
pip uninstall telethon

# 查看已安装
pip list
# 使用第三方模块
from telethon import TelegramClient

client = TelegramClient(session, api_id, api_hash)

十、异常处理 —— 处理错误

什么是异常?

程序运行出错时会"抛出异常",如果不处理,程序会崩溃。

# 不处理异常
result = 10 / 0
# ZeroDivisionError: division by zero
# 程序崩溃!

try-except

捕获并处理异常。

try:
    result = 10 / 0
except ZeroDivisionError:
    print("除数不能为0")
# 程序继续运行,不崩溃

多个异常

try:
    num = int(input("请输入数字:"))
    result = 10 / num
except ValueError:
    print("输入的不是数字")
except ZeroDivisionError:
    print("不能输入0")

捕获异常信息

try:
    result = 10 / 0
except Exception as e:
    print(f"出错了:{e}")
    print(f"错误类型:{type(e).__name__}")
# 出错了:division by zero
# 错误类型:ZeroDivisionError

else 和 finally

try:
    num = int(input("请输入数字:"))
except ValueError:
    print("输入错误")
else:
    # 没有异常时执行
    print(f"你输入了 {num}")
finally:
    # 无论是否有异常都执行
    print("程序结束")

主动抛出异常

def set_age(age):
    if age < 0:
        raise ValueError("年龄不能为负数")
    return age

try:
    set_age(-5)
except ValueError as e:
    print(e)    # 年龄不能为负数

十一、类和对象 —— 面向对象编程

什么是类?什么是对象?

  • :图纸、模板、设计图
  • 对象:根据图纸造出来的东西
类 = 汽车设计图
对象 = 具体的一辆汽车

类 = Dog
对象 = 你家的狗、我家的狗

定义类

class Dog:
    # 类属性(所有实例共享)
    species = "狗"

    # 构造函数(创建对象时调用)
    def __init__(self, name, age):
        # 实例属性(每个实例独有)
        self.name = name
        self.age = age

    # 实例方法
    def bark(self):
        print(f"{self.name}:汪汪汪!")

    def info(self):
        print(f"{self.name},{self.age}岁,是{self.species}")

# 创建对象
my_dog = Dog("旺财", 3)
your_dog = Dog("来福", 2)

# 访问属性
print(my_dog.name)       # 旺财
print(your_dog.age)      # 2

# 调用方法
my_dog.bark()            # 旺财:汪汪汪!
my_dog.info()            # 旺财,3岁,是狗

`self` 是什么?

self 代表对象自己

class Person:
    def __init__(self, name):
        self.name = name    # self.name = 这个对象的name属性

    def say_hello(self):
        print(f"我是{self.name}")

p1 = Person("小明")
p1.say_hello()    # 我是小明(self 是 p1)

p2 = Person("小红")
p2.say_hello()    # 我是小红(self 是 p2)

类属性 vs 实例属性

class Dog:
    # 类属性
    species = "狗"
    count = 0

    def __init__(self, name):
        # 实例属性
        self.name = name
        Dog.count += 1      # 每创建一个对象,count+1

d1 = Dog("旺财")
d2 = Dog("来福")

print(d1.name)      # 旺财(实例属性)
print(d2.name)      # 来福(实例属性)
print(Dog.species)  # 狗(类属性)
print(Dog.count)    # 2(创建了2个对象)

继承

class Animal:
    def __init__(self, name):
        self.name = name

    def eat(self):
        print(f"{self.name}在吃东西")

# Dog 继承 Animal
class Dog(Animal):
    def bark(self):
        print(f"{self.name}:汪汪汪!")

# Cat 继承 Animal
class Cat(Animal):
    def bark(self):
        print(f"{self.name}:喵喵喵!")

dog = Dog("旺财")
dog.eat()       # 旺财在吃东西(继承自 Animal)
dog.bark()      # 旺财:汪汪汪!(Dog 自己的方法)

cat = Cat("咪咪")
cat.eat()       # 咪咪在吃东西
cat.bark()      # 咪咪:喵喵喵!

特殊方法

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    # 打印时的显示
    def __str__(self):
        return f"({self.x}, {self.y})"

    # 加法
    def __add__(self, other):
        return Point(self.x + other.x, self.y + other.y)

    # 长度
    def __len__(self):
        return int((self.x ** 2 + self.y ** 2) ** 0.5)

p1 = Point(3, 4)
p2 = Point(1, 2)

print(p1)           # (3, 4)(调用 __str__)
print(p1 + p2)      # (4, 6)(调用 __add__)
print(len(p1))      # 5(调用 __len__)

十二、异步编程 —— async/await

同步 vs 异步

# 同步:一件一件做
做饭()      # 等30分钟
洗衣服()    # 等20分钟
扫地()      # 等10分钟
# 总共:60分钟

# 异步:同时开始
await 做饭()     # 开始
await 洗衣服()   # 开始(不用等饭做好)
await 扫地()     # 开始
# 总共:30分钟(最长的那个)

async def

定义异步函数。

import asyncio

# 普通函数
def normal_func():
    return "结果"

# 异步函数
async def async_func():
    await asyncio.sleep(1)
    return "结果"

await

等待异步操作完成,只能在 async def 内使用。

import asyncio

async def fetch_data():
    print("开始获取...")
    await asyncio.sleep(2)    # 等待2秒(模拟网络请求)
    print("获取完成!")
    return "数据"

async def main():
    result = await fetch_data()
    print(f"结果是:{result}")

# 运行异步函数
asyncio.run(main())

并发执行

import asyncio

async def task(name, seconds):
    print(f"{name} 开始,需要 {seconds} 秒")
    await asyncio.sleep(seconds)
    print(f"{name} 完成!")
    return f"{name}的结果"

async def main():
    # 串行执行(一个一个来)
    # await task("A", 2)
    # await task("B", 1)
    # await task("C", 3)
    # 总共:6秒

    # 并发执行(同时开始)
    results = await asyncio.gather(
        task("A", 2),
        task("B", 1),
        task("C", 3)
    )
    # 总共:3秒(最长的那个)
    print(results)

asyncio.run(main())

# 输出:
# A 开始,需要 2 秒
# B 开始,需要 1 秒
# C 开始,需要 3 秒
# B 完成!
# A 完成!
# C 完成!
# ['A的结果', 'B的结果', 'C的结果']

异步上下文管理器

import asyncio

class AsyncTimer:
    async def __aenter__(self):
        self.start = asyncio.get_event_loop().time()
        return self

    async def __aexit__(self, *args):
        elapsed = asyncio.get_event_loop().time() - self.start
        print(f"耗时:{elapsed:.2f}秒")

async def main():
    async with AsyncTimer():
        await asyncio.sleep(1)

asyncio.run(main())    # 耗时:1.00秒

十三、文件操作

读取文件

# 读取全部
with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read()
print(content)

# 按行读取
with open("data.txt", "r", encoding="utf-8") as f:
    for line in f:
        print(line.strip())    # strip() 去除换行符

# 读取所有行到列表
with open("data.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()

写入文件

# 覆盖写入
with open("output.txt", "w", encoding="utf-8") as f:
    f.write("Hello\n")
    f.write("World\n")

# 追加写入
with open("output.txt", "a", encoding="utf-8") as f:
    f.write("新的一行\n")

# 写入多行
lines = ["第一行\n", "第二行\n", "第三行\n"]
with open("output.txt", "w", encoding="utf-8") as f:
    f.writelines(lines)

文件模式

模式 说明
r 读取(默认)
w 写入(覆盖)
a 追加
x 创建(文件存在则报错)
b 二进制模式
+ 读写模式
# 二进制文件
with open("image.png", "rb") as f:
    data = f.read()

with open("copy.png", "wb") as f:
    f.write(data)

十四、实用技巧汇总

字符串处理

# 分割
text = "苹果,香蕉,橙子"
fruits = text.split(",")    # ["苹果", "香蕉", "橙子"]

# 连接
fruits = ["苹果", "香蕉", "橙子"]
text = ",".join(fruits)     # "苹果,香蕉,橙子"

# 去除空白
text = "  hello  "
print(text.strip())         # "hello"(两边)
print(text.lstrip())        # "hello  "(左边)
print(text.rstrip())        # "  hello"(右边)

# 替换
text = "I like Java"
print(text.replace("Java", "Python"))  # "I like Python"

# 大小写
text = "Hello World"
print(text.lower())         # "hello world"
print(text.upper())         # "HELLO WORLD"
print(text.title())         # "Hello World"

# 判断开头结尾
filename = "test.py"
print(filename.endswith(".py"))  # True
print(filename.startswith("test"))  # True

列表技巧

# 统计
numbers = [1, 2, 3, 2, 4, 2, 5]
print(numbers.count(2))     # 3(2出现3次)

# 查找
print(numbers.index(3))     # 2(3在索引2)

# 去重(保留顺序)
unique = list(dict.fromkeys(numbers))
print(unique)               # [1, 2, 3, 4, 5]

# 扁平化
nested = [[1, 2], [3, 4], [5]]
flat = [x for sub in nested for x in sub]
print(flat)                 # [1, 2, 3, 4, 5]

# 分组
from itertools import batched
data = [1, 2, 3, 4, 5, 6, 7]
groups = list(batched(data, 3))
print(groups)               # [(1, 2, 3), (4, 5, 6), (7,)]

字典技巧

# 默认值
from collections import defaultdict
word_count = defaultdict(int)
words = ["apple", "banana", "apple", "orange"]
for word in words:
    word_count[word] += 1
print(dict(word_count))     # {'apple': 2, 'banana': 1, 'orange': 1}

# 有序字典
from collections import OrderedDict
od = OrderedDict()
od['a'] = 1
od['b'] = 2
print(od)                   # OrderedDict([('a', 1), ('b', 2)])

# 合并字典(Python 3.9+)
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
merged = d1 | d2
print(merged)               # {'a': 1, 'b': 3, 'c': 4}

解包技巧

# 列表解包
a, b, c = [1, 2, 3]
print(a, b, c)              # 1 2 3

# 扩展解包
first, *middle, last = [1, 2, 3, 4, 5]
print(first)                # 1
print(middle)               # [2, 3, 4]
print(last)                 # 5

# 交换变量
a, b = 1, 2
a, b = b, a
print(a, b)                 # 2 1

# 忽略值
a, _, c = [1, 2, 3]         # _ 是占位符,表示不关心这个值

链式调用

# 判断非空
name = None
result = name or "默认名"
print(result)               # 默认名

# 判断范围
age = 25
if 18 <= age <= 60:
    print("工作年龄")

# 安全调用
person = {"name": "小明"}
city = person.get("address", {}).get("city", "未知")
print(city)                 # 未知

十五、代码风格指南

缩进

  • 使用 4 个空格,不用 Tab
  • 同一代码块必须对齐
# 正确
if True:
    print("Hello")
    print("World")

# 错误
if True:
    print("Hello")
  print("World")    # 缩进不一致

命名规范

类型 规范 示例
变量/函数 小写+下划线 user_name, get_data()
常量 大写+下划线 MAX_SIZE, API_KEY
驼峰命名 TelegramBot, UserInfo
私有属性 下划线开头 _client, _instance
私有属性(强) 双下划线开头 __password

注释

# 单行注释

"""
多行注释
用于函数或类的说明
"""

def calculate(x, y):
    """
    计算两个数的和

    Args:
        x: 第一个数
        y: 第二个数

    Returns:
        两数之和
    """
    return x + y

空行

import os

# 导入和代码之间空两行


def func1():
    pass


def func2():
    # 函数内逻辑块之间空一行
    data = load_data()

    result = process(data)

    return result


# 类之间空两行
class MyClass:
    def method1(self):
        pass

    def method2(self):
        pass

十六、快速参考卡

数据类型

str     "hello"         # 字符串
int     123             # 整数
float   3.14            # 浮点数
bool    True / False    # 布尔值
list    [1, 2, 3]       # 列表
dict    {"a": 1}        # 字典
tuple   (1, 2, 3)       # 元组(不可变列表)
set     {1, 2, 3}       # 集合(不重复)
None    None            # 空值

运算符

# 算术
+  -  *  /  //  %  **

# 比较
==  !=  >  <  >=  <=

# 逻辑
and  or  not

# 成员
in  not in

# 身份
is  is not

常用函数

print()      # 打印
input()      # 输入
len()        # 长度
type()       # 类型
int()        # 转整数
str()        # 转字符串
list()       # 转列表
dict()       # 转字典
range()      # 数字序列
enumerate()  # 带索引遍历
zip()        # 并行遍历
sorted()     # 排序
reversed()   # 反转
sum()        # 求和
max()        # 最大值
min()        # 最小值
any()        # 任一为真
all()        # 全部为真

格式化字符串

name = "小明"
age = 18

# f-string
f"姓名:{name}"
f"年龄:{age}"
f"明年:{age + 1}岁"
f"价格:{99.9:.2f}元"
f"编号:{5:03d}"

下一步

恭喜你学完了 Python 基础!现在可以开始阅读项目代码了:

推荐学习顺序:

00_Python基础入门.md     ← 你在这里
        ↓
01_config_py讲解.md      配置文件(最简单)
        ↓
02_login_py讲解.md       登录工具(异步编程)
        ↓
03_bot_sender_py讲解.md  核心类(类和对象)
        ↓
04_api_server_py讲解.md  API服务(综合应用)

祝你学习顺利!