本文整理 Python 3.x 入门课程中的常用语法和示例,覆盖基础语法、分支、循环、函数、数据容器、文件、异常与模块。课程材料中的重复章节已合并到本页;示例按 Python 语法重新校订。
变量名绑定到对象;对象有类型。列表、字典和集合可以原地修改,字符串、数字和元组不可原地修改。元组如果包含列表,列表本身仍可以修改。
章节导航
一、基础语法
1. 字面量、变量与对象
字面量是直接写在代码里的值,例如整数、浮点数、字符串、布尔值和空值。赋值会让变量名指向一个对象;再次赋值会改变名称绑定的对象。
count = 10
message = "hello"
count = "ten" # count 现在绑定到字符串对象变量名本身没有固定类型,对象有类型。需要在多个位置复用的值可以放进有意义的变量或常量名中。
MAX_RETRIES = 3
print(type(MAX_RETRIES)) # <class 'int'>2. 常见内置类型与可变性
| 类型 | 示例 | 可变性 |
|---|---|---|
| int、float、complex、bool | 10、3.14、2j、True | 不可变 |
| NoneType | None | 不可变 |
| str | "Python" | 不可变 |
| tuple | (1, "a") | 元组本身不可变;其中的可变对象仍可修改 |
| list | [1, 2, 3] | 可变 |
| dict | {"name": "Tom"} | 可变 |
| set | {1, 2, 3} | 可变 |
可以用 type() 查看对象类型。bool 是 int 的子类,但编写普通业务代码时通常把它当作独立的布尔类型使用。
浮点数通常只能近似表示十进制小数,因此 0.1 + 0.2 不一定精确等于 0.3。比较计算结果时可使用误差范围;需要十进制精确运算时可了解 decimal.Decimal。
print(type(123))
print(type(True))3. 类型转换与真值判断
常见转换函数有 int()、float()、str() 和 bool()。转换是否成功取决于输入内容;例如 int("abc") 会抛出 ValueError。
age = int("18")
price = float("19.9")
text = str(100)在 if 和 while 条件中,None、False、数字零,以及空字符串、空列表、空元组、空字典和空集合的真值为假;大多数其他对象的真值为真。bool("False") 的结果是 True,因为这个字符串不是空字符串。
bool(0) # False
bool("") # False
bool([]) # False
bool("False") # True4. 运算符
算术运算符
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
| +、-、* | 加、减、乘 | 5 + 3 | 8 |
| / | 真除法 | 10 / 3 | 约 3.333 |
| // | 向下取整除法 | 10 // 3 | 3 |
| % | 取余 | 10 % 3 | 1 |
| ** | 幂 | 2 ** 3 | 8 |
// 是向负无穷方向取整,因此 -7 // 3 的结果是 -3。
比较与逻辑运算符
比较运算符包括 ==、!=、<、<=、>、>=,结果是 True 或 False。== 比较值是否相等;is 比较两个名称是否指向同一个对象,初学时不要把二者混用。
逻辑运算符必须使用小写的 and、or、not。and 和 or 会短路求值;它们返回操作数之一,不保证返回布尔值。
age = 20
has_ticket = True
print(age >= 18 and has_ticket)
print(not has_ticket)赋值
x = 10
x += 5 # 等价于 x = x + 5
x //= 3
a = b = 0
left, right = 1, 2
left, right = right, left # 交换两个名称绑定的值5. 字符串
字符串是不可变的 Unicode 文本序列。可以用单引号、双引号或三引号创建字符串。
single = 'hello'
double = "world"
multi_line = """第一行
第二行"""常见转义包括 \n(换行)、\t(制表符)、\(反斜杠)、\'(单引号)和 \"(双引号)。
字符串格式化可以使用 f-string、str.format() 或旧式 % 格式化;新代码通常优先使用 f-string。
name = "Alice"
price = 19.99
print(f"{name} 的商品价格是 {price:.2f} 元")
print(f"{1_000_000:,}") # 1,000,000常用字符串操作:
text = " Python 基础 "
print(text.strip()) # 去除两端空白,返回新字符串
print(text.replace("基础", "入门"))
print("a,b,c".split(",")) # ['a', 'b', 'c']
print("banana".count("a"))
print(len("Python"))6. 注释与文档字符串
井号开始单行注释。函数、类或模块的第一条字符串表达式可以作为文档字符串。
# 计算两个数的和
def add(a, b):
"""返回 a 与 b 的和。"""
return a + b二、逻辑判断
input() 返回字符串。需要数字时先转换,并考虑输入不合法时可能出现的 ValueError。
name = input("请输入名字:")
try:
age = int(input("请输入年龄:"))
except ValueError:
print("年龄请输入整数")
else:
if age >= 18:
print(f"{name} 已成年")
else:
print(f"{name} 未成年")if、elif、else 按顺序检查条件;遇到第一个为真的分支后,其余分支不会执行。条件之间不一定天然互斥,判断顺序会影响结果。
score = 85
if score >= 90:
print("优秀")
elif score >= 60:
print("及格")
else:
print("不及格")Python 用缩进表示代码块。通常使用 4 个空格,并在同一个代码块中保持一致。
三、循环
1. while
while 在条件为真时重复执行。需要有限次循环时,确保循环中的状态会改变,最终能够离开循环。
count = 0
while count < 5:
print(count)
count += 12. for 与 range
for 用于逐个处理可迭代对象中的元素,例如字符串、列表、元组或 range。range(start, stop, step) 生成整数序列,包含 start、不包含 stop。
for number in range(1, 5):
print(number) # 1、2、3、43. break 与 continue
break 结束最近一层 for 或 while 循环;continue 跳过当前这一次迭代,进入最近一层循环的下一次迭代。
for number in range(1, 6):
if number == 2:
continue
if number == 5:
break
print(number)四、函数
1. 定义、调用与返回值
函数把一段操作组织成可复用的代码。return 将结果交回调用方;执行到函数末尾而没有 return 时,返回 None。
def add(a, b):
"""返回两个数的和。"""
return a + b
result = add(2, 3)
print(result) # 5函数可以有多个 return;执行到一个 return 后,当前函数调用立即结束。
2. 作用域
函数内赋值的名称通常是局部名称。要在函数中重新绑定模块级名称,需要显式声明 global;更常见的做法是把状态作为参数传入并用返回值传出。
def add_tax(price, rate):
return price * (1 + rate)
total = add_tax(100, 0.06)3. 文档字符串与参数
函数的文档字符串放在函数体第一行。普通参数可按位置或关键字传入;定义时有默认值的参数可以省略。
def greet(name, greeting="你好"):
"""用指定问候语称呼某人。"""
return f"{greeting},{name}"
print(greet("小明"))
print(greet(name="小红", greeting="早上好"))定义函数时,带默认值的参数应放在没有默认值的参数之后。不要把可变对象(如列表)直接用作默认值,因为默认值只在函数定义时创建一次。
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items五、数据容器
列表、元组、字符串是序列,可以按位置索引和切片。字典按键查找值;集合用于保存不重复元素和进行集合运算。
| 类型 | 可变 | 有序性 | 索引 | 常见用途 |
|---|---|---|---|---|
| list | 可变 | 保持插入顺序 | 整数索引 | 需要增删改的序列 |
| tuple | 不可变容器 | 保持顺序 | 整数索引 | 固定结构的数据、打包多个返回值 |
| str | 不可变 | 保持字符顺序 | 整数索引 | 文本 |
| set | 可变 | 不保证顺序 | 不支持索引 | 去重、成员测试、集合运算 |
| dict | 可变 | 按插入顺序遍历(Python 3.7+) | 用键访问 | 键值映射 |
字典键和集合元素必须可哈希。常见的数字、字符串和仅包含可哈希元素的元组可以作为键;列表、字典和集合不能作为键。元组是否可哈希取决于它所包含的元素。
1. 列表 list
numbers = [10, 20, 30]
print(numbers[0]) # 10
print(numbers[-1]) # 30
print(numbers[0:2]) # [10, 20],结束位置不包含在结果中
numbers.append(40)
numbers.extend([50, 60])
numbers.insert(1, 15)
numbers[0] = 5
removed = numbers.pop() # 删除并返回最后一个元素
numbers.remove(15) # 删除第一个值为 15 的元素
print(numbers.count(20))del 可按索引或切片删除元素;clear() 清空列表。用 for 元素 in 列表 遍历列表;需要同时取得索引时可用 enumerate()。
for index, value in enumerate(numbers):
print(index, value)2. 元组 tuple
元组本身不可增删或替换元素;如果它包含列表等可变对象,该对象仍可被修改。单元素元组需要末尾逗号。
point = (3, 4)
single = ("Python",)
x, y = point
print(x, y)元组常用 count() 和 index()。多个值可以通过逗号打包为元组,return 1, 2 会返回一个二元组。
3. 字符串 str 与切片
字符串可以按索引读取,但不能通过索引直接修改字符。切片语法是 序列[start:stop:step],stop 不包含在结果中;省略值时使用默认边界。
text = "Python"
print(text[0]) # P
print(text[1:4]) # yth
print(text[::-1]) # nohtyP4. 集合 set
集合不保留可依赖的元素顺序,不支持索引,并自动去重。空集合用 set() 创建;{} 创建的是空字典。set.pop() 移除并返回一个任意元素,不应当依赖具体返回哪一个。
languages = {"C", "Python", "Python"}
other = {"Python", "Linux"}
languages.add("Rust")
languages.discard("C") # 元素不存在时也不会报错
print(languages | other) # 并集
print(languages & other) # 交集
print(languages - other) # 差集remove() 在元素不存在时会抛出 KeyError;discard() 不会。集合支持 for 遍历,不支持按位置索引。
5. 字典 dict
字典中的键唯一;用已有键赋值会替换对应的值。空字典可以写成 {} 或 dict()。
person = {"name": "Tom", "age": 18}
person["name"] = "Tim"
person["city"] = "上海"
age = person.get("age") # 键不存在时默认返回 None
removed_age = person.pop("age") # 删除键并返回对应的值遍历键、值和键值对:
scores = {"语文": 90, "数学": 95}
for subject in scores:
print(subject, scores[subject])
for subject, score in scores.items():
print(subject, score)字典嵌套可用于表达分组数据。下面把所有等级为 1 的员工升一级并增加工资:
employees = {
"王力宏": {"department": "科技部", "wage": 3000, "level": 1},
"周杰伦": {"department": "市场部", "wage": 5000, "level": 2},
"张学友": {"department": "科技部", "wage": 4000, "level": 1},
}
for employee in employees.values():
if employee["level"] == 1:
employee["level"] += 1
employee["wage"] += 10006. 容器通用操作
len() 返回元素数量。max() 和 min() 要求参与比较的元素之间可比较;对字典调用时比较的是键。list()、tuple()、set() 和 dict() 可用于创建或转换容器,转换规则取决于输入类型。set() 转换会去重。
sorted(iterable, reverse=True) 返回新列表,不会原地修改原容器。对字典排序时默认处理键。
values = [3, 1, 2]
ordered = sorted(values)
descending = sorted(values, reverse=True)六、函数进阶
1. 多返回值与解包
def get_point():
return 3, 4
x, y = get_point()
print(type(get_point())) # <class 'tuple'>2. 可变参数
args 收集额外的位置参数为元组;*kwargs 收集额外的关键字参数为字典。
def show_members(group, *members):
print(f"{group} 的成员:")
for member in members:
print(member)
show_members("学习小组", "小林", "小周")def show_profile(**profile):
print(profile)
show_profile(age=18, city="上海")3. 函数作为参数与 lambda
函数也是对象,可以作为参数传给另一个函数。lambda 用于定义只包含一个表达式的匿名函数;复杂逻辑应使用 def。
def apply(compute, left, right):
return compute(left, right)
def add(left, right):
return left + right
print(apply(add, 1, 2))
print(apply(lambda left, right: left + right, 1, 2))4. ATM 练习
下面是简化的菜单练习。它用字符串读取选项,避免把菜单输入转换成整数;金额输入的错误处理可在掌握异常后继续补充。
def main():
name = input("请输入姓名:")
balance = 5000
while True:
print(f"\n{name},欢迎使用 ATM")
print("1. 查询余额")
print("2. 存款")
print("3. 取款")
print("4. 退出")
choice = input("请选择:")
if choice == "1":
print(f"当前余额:{balance} 元")
elif choice == "2":
amount = int(input("存入金额:"))
if amount > 0:
balance += amount
print(f"存款成功,当前余额:{balance} 元")
else:
print("金额必须大于 0")
elif choice == "3":
amount = int(input("取出金额:"))
if 0 < amount <= balance:
balance -= amount
print(f"取款成功,当前余额:{balance} 元")
else:
print("金额无效或余额不足")
elif choice == "4":
print("再见")
break
else:
print("无效选项,请重新选择")
if __name__ == "__main__":
main()七、文件操作
open() 打开文件。文本模式常用 r(读取)、w(写入并清空原内容)、a(追加);在模式后加 b 表示二进制模式。文本文件应按实际编码明确指定 encoding。二进制模式读写 bytes,不能指定 encoding。
with 语句会在代码块结束时关闭文件,即使处理中途发生异常也会执行清理。
with open("README.md", "r", encoding="utf-8") as file:
for line in file:
print(line.rstrip())常用读取方法:
with open("notes.txt", "r", encoding="utf-8") as file:
all_text = file.read() # 读取剩余全部内容readline() 读取一行;readlines() 把剩余行一次性读入列表,大文件通常更适合逐行遍历。write() 写入字符串,并返回写入的字符数。
统计文件中某个单词出现次数的简化示例:
with open("word.txt", "r", encoding="utf-8") as file:
text = file.read()
print(text.count("itheima"))八、异常、模块与包
1. 异常处理
语法错误通常在程序运行前被发现;异常是在运行过程中发生的错误。使用 try、except 处理预期内且能够恢复的异常。优先捕获具体异常;不要用空的 except 隐藏未知问题。
try:
age = int(input("年龄:"))
except ValueError:
print("请输入有效整数")
else:
print(f"输入的年龄是 {age}")
finally:
print("输入处理结束")else 在 try 代码块没有异常时执行;finally 用于无论是否异常都需要执行的清理逻辑。未被当前 except 处理的异常会继续向调用方传播。
2. 模块
模块通常是包含 Python 代码的 .py 文件,可以定义函数、类和变量。常见导入方式:
import math
from pathlib import Path推荐明确导入需要的名称;from module import * 会把多个名称放入当前命名空间,容易产生冲突。
直接运行模块文件时,__name__ 的值为 "__main__";模块被导入时,__name__ 通常是模块名。常见入口写法:
def main():
print("程序从入口运行")
if __name__ == "__main__":
main()3. 包
常规包通常是包含 __init__.py 的目录,里面可以再放模块和子包。现代 Python 也支持没有 __init__.py 的命名空间包;初学项目可先按常规包组织。
my_package/
__init__.py
helpers.py安装第三方包时,建议在当前 Python 环境中运行:
python -m pip install 包名九、对象引用与拷贝
赋值不会复制对象,而是让另一个变量名也指向同一个对象。对象可变时,通过任一名称修改它,另一名称看到的也是修改后的对象。
source = [1, [2, 3]]
alias = source
alias[0] = 10
print(source) # [10, [2, 3]]浅拷贝会创建新的外层容器,但内部元素仍引用原对象;深拷贝会递归复制内部对象。深拷贝可能复制过多数据,通常只在确实需要相互独立的嵌套结构时使用。
import copy
source = [1, [2, 3]]
shallow = copy.copy(source)
deep = copy.deepcopy(source)
source[0] = 10
source[1].append(4)
print(shallow) # [1, [2, 3, 4]]:外层独立,嵌套列表共享
print(deep) # [1, [2, 3]]:嵌套列表也已复制列表、字典和集合也分别提供 .copy() 浅拷贝方法。是否需要深拷贝,取决于嵌套对象是否也必须独立。
十、常用内置函数
内置函数可直接调用,不需要先导入。abs() 返回绝对值;sum() 对数值可迭代对象求和;min() 与 max() 分别查找最小值和最大值。
print(abs(-10)) # 10
print(sum([1, 2, 3])) # 6
print(min(5, 4, 6)) # 4
print(max(5, 4, 6)) # 6zip() 按位置组合多个可迭代对象,返回迭代器。默认在最短的输入耗尽时停止;需要查看全部结果时,可用 list() 将结果转换为列表。
numbers = [1, 2, 3]
letters = ["a", "b", "c"]
print(list(zip(numbers, letters)))
# [(1, 'a'), (2, 'b'), (3, 'c')]可用 dir(builtins) 查看内置命名空间中的名称;日常编程通常直接查阅文档或使用所需函数即可。
留言