Python 学习笔记
📚 学习路线图
基础入门
- 变量与数据类型(int, float, str, bool)
- 输入输出(input, print)
- 运算符(算术、比较、逻辑、赋值)
- 字符串操作
流程控制
- 条件语句(if-elif-else)
- 循环(for, while)
- break、continue、pass
数据结构
- 列表(List)
- 元组(Tuple)
- 字典(Dictionary)
- 集合(Set)
函数
- 函数定义与调用
- 参数(位置、关键字、默认、可变)
- 返回值
- 作用域
- Lambda 表达式
面向对象
- 类与对象
- 属性与方法
- 继承
- 多态
- 封装
进阶
- 虚拟环境(venv)
- 装饰器(Decorator)
- 生成器(Generator)
- 迭代器(Iterator)
- 异常处理
- 文件操作
- 模块与包
基础语法
Hello World
python
print("Hello World")变量与数据类型
python
# 整数
age = 25
# 浮点数
height = 1.75
# 字符串
name = "张三"
# 布尔值
is_student = True
# 类型转换
num_str = "100"
num = int(num_str) # "100" -> 100
price = 3.14159
price_rounded = round(price, 2) # 3.14字符串操作
python
s = "Hello World"
# 索引与切片
print(s[0]) # 'H'
print(s[-1]) # 'd'
print(s[0:5]) # 'Hello'
print(s[::-1]) # 'dlroW olleH' (反转)
# 常用方法
print(s.lower()) # 'hello world'
print(s.upper()) # 'HELLO WORLD'
print(s.split()) # ['Hello', 'World']
print(" hello ".strip()) # 'hello' (去除空格)列表
python
# 创建列表
fruits = ["apple", "banana", "cherry"]
# 访问元素
print(fruits[0]) # 'apple'
print(fruits[-1]) # 'cherry'
# 修改元素
fruits[1] = "orange"
# 添加元素
fruits.append("grape")
fruits.insert(1, "pear")
# 删除元素
fruits.remove("apple")
del fruits[0]
popped = fruits.pop()
# 切片
print(fruits[1:3]) # 取索引 1-2 的元素
print(fruits[:2]) # 取前两个元素
# 常用方法
print(len(fruits)) # 列表长度
print("apple" in fruits) # 判断元素是否存在
# 列表推导式
squares = [x**2 for x in range(5)] # [0, 1, 4, 9, 16]字典
python
# 创建字典
person = {
"name": "张三",
"age": 25,
"city": "北京"
}
# 访问元素
print(person["name"]) # '张三'
print(person.get("age")) # 25
print(person.get("job", "未知")) # '未知'(键不存在时返回默认值)
# 修改/添加元素
person["age"] = 26
person["job"] = "工程师"
# 删除元素
del person["city"]
job = person.pop("job")
# 常用方法
print(person.keys()) # dict_keys(['name', 'age'])
print(person.values()) # dict_values(['张三', 26])
print(person.items()) # dict_items([('name', '张三'), ('age', 26)])
# 遍历字典
for key, value in person.items():
print(f"{key}: {value}")流程控制
条件语句
python
score = 85
if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 60:
print("及格")
else:
print("不及格")循环
python
# for 循环
for i in range(5):
print(i) # 0, 1, 2, 3, 4
# 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
# while 循环
count = 0
while count < 5:
print(count)
count += 1
# 循环控制
for i in range(10):
if i == 3:
continue # 跳过本次循环
if i == 7:
break # 退出循环
print(i)函数
python
# 基本函数定义
def greet(name):
return f"Hello, {name}!"
print(greet("张三")) # Hello, 张三!
# 默认参数
def greet(name, greeting="Hello"):
return f"{greeting}, {name}!"
print(greet("张三")) # Hello, 张三!
print(greet("张三", "你好")) # 你好, 张三!
# 可变参数
def sum_all(*numbers):
return sum(numbers)
print(sum_all(1, 2, 3)) # 6
print(sum_all(1, 2, 3, 4, 5)) # 15
# 关键字参数
def create_user(name, **kwargs):
user = {"name": name}
user.update(kwargs)
return user
print(create_user("张三", age=25, city="北京"))
# {'name': '张三', 'age': 25, 'city': '北京'}
# Lambda 表达式
square = lambda x: x**2
print(square(5)) # 25
# 排序示例
students = [("张三", 25), ("李四", 20), ("王五", 22)]
students.sort(key=lambda x: x[1]) # 按年龄排序
print(students) # [('李四', 20), ('王五', 22), ('张三', 25)]面向对象
python
# 定义类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
return f"你好,我是{self.name},今年{self.age}岁"
def birthday(self):
self.age += 1
print(f"{self.name} 生日快乐!现在 {self.age} 岁了")
# 创建对象
person = Person("张三", 25)
print(person.greet()) # 你好,我是张三,今年25岁
person.birthday() # 张三 生日快乐!现在 26 岁了
# 继承
class Student(Person):
def __init__(self, name, age, school):
super().__init__(name, age)
self.school = school
def greet(self):
return f"我是{self.school}的学生{self.name},今年{self.age}岁"
student = Student("李四", 20, "清华大学")
print(student.greet()) # 我是清华大学的学生李四,今年20岁虚拟环境
为什么需要虚拟环境
Python 虚拟环境可以为每个项目创建独立的 Python 环境,避免不同项目之间的依赖冲突。
使用 venv
bash
# 创建虚拟环境
python -m venv venv
# macOS/Linux 激活虚拟环境
source venv/bin/activate
# Windows 激活虚拟环境
venv\Scripts\activate
# 退出虚拟环境
deactivate
# 删除虚拟环境
rm -rf venv # macOS/Linux
rmdir /s venv # Windows激活虚拟环境后,命令行前面会显示 (venv) 提示符。
requirements.txt
requirements.txt 文件用于记录项目的所有依赖。
生成 requirements.txt
bash
# 导出当前环境所有已安装的包
pip freeze > requirements.txt
# 只导出项目直接依赖(推荐)
pip install pipreqs
pipreqs . --encoding=utf8安装 requirements.txt 中的依赖
bash
# 安装所有依赖
pip install -r requirements.txt
# 使用国内镜像加速
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simplerequirements.txt 示例
# requirements.txt
flask==3.0.0
requests==2.31.0
pytest==7.4.3
python-dotenv==1.0.0pip 常用命令
bash
# 安装包
pip install package_name
pip install package_name==1.0.0 # 指定版本
pip install package_name>=1.0.0,<2.0.0 # 版本范围
# 卸载包
pip uninstall package_name
# 查看已安装的包
pip list
pip list --format=freeze
# 查看包信息
pip show package_name
# 升级包
pip install --upgrade package_name
# 清理缓存
pip cache purge
# 配置国内镜像(永久)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple常用国内镜像源
| 镜像源 | 地址 |
|---|---|
| 清华大学 | https://pypi.tuna.tsinghua.edu.cn/simple |
| 阿里云 | https://mirrors.aliyun.com/pypi/simple |
| 中科大 | https://pypi.mirrors.ustc.edu.cn/simple |
| 豆瓣 | https://pypi.douban.com/simple |
装饰器
什么是装饰器
装饰器是一个接受函数作为参数并返回新函数的函数。它可以在不修改原函数代码的情况下,为函数添加额外的功能。
基本装饰器
python
def my_decorator(func):
"""装饰器模板"""
def wrapper(*args, **kwargs):
# 函数执行前的操作
print(f"正在调用函数: {func.__name__}")
# 执行原函数
result = func(*args, **kwargs)
# 函数执行后的操作
print(f"函数 {func.__name__} 执行完毕")
return result
return wrapper
@my_decorator
def say_hello(name):
return f"Hello, {name}!"
print(say_hello("张三"))
# 输出:
# 正在调用函数: say_hello
# 函数 say_hello 执行完毕
# Hello, 张三!保留原函数元数据
使用 functools.wraps 装饰 wrapper 函数,保留原函数的元数据(如 __name__、__doc__ 等):
python
import functools
def my_decorator(func):
@functools.wraps(func) # 保留原函数元数据
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
@my_decorator
def greet(name):
"""打招呼函数"""
return f"Hello, {name}!"
print(greet.__name__) # greet(没有 @wraps 会是 wrapper)
print(greet.__doc__) # 打招呼函数带参数的装饰器
python
def repeat(times):
"""重复执行函数的装饰器"""
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(3)
def say_hello():
print("Hello!")
say_hello()
# 输出:
# Hello!
# Hello!
# Hello!类装饰器
python
class CountCalls:
"""统计函数调用次数的类装饰器"""
def __init__(self, func):
self.func = func
self.count = 0
def __call__(self, *args, **kwargs):
self.count += 1
print(f"函数 {self.func.__name__} 已被调用 {self.count} 次")
return self.func(*args, **kwargs)
@CountCalls
def greet(name):
return f"Hello, {name}!"
print(greet("张三")) # 函数 greet 已被调用 1 次
print(greet("李四")) # 函数 greet 已被调用 2 次常用装饰器示例
1. 计时装饰器
python
import time
import functools
def timer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 执行时间: {end - start:.4f}秒")
return result
return wrapper
@timer
def slow_function():
time.sleep(1)
return "完成"
print(slow_function())2. 日志装饰器
python
def log(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
args_repr = [repr(a) for a in args]
kwargs_repr = [f"{k}={v!r}" for k, v in kwargs.items()]
signature = ", ".join(args_repr + kwargs_repr)
print(f"调用 {func.__name__}({signature})")
try:
result = func(*args, **kwargs)
print(f"{func.__name__} 返回 {result!r}")
return result
except Exception as e:
print(f"{func.__name__} 抛出异常: {e!r}")
raise
return wrapper
@log
def divide(a, b):
return a / b
print(divide(10, 2))
print(divide(10, 0)) # 会显示异常信息3. 缓存装饰器
python
def cache(func):
"""简单的缓存装饰器"""
cached_results = {}
@functools.wraps(func)
def wrapper(*args):
if args in cached_results:
return cached_results[args]
result = func(*args)
cached_results[args] = result
return result
return wrapper
@cache
def fib(n):
if n < 2:
return n
return fib(n - 1) + fib(n - 2)
print(fib(10)) # 计算并缓存
print(fib(10)) # 从缓存中读取内置装饰器
@property - 将方法转换为属性
python
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def age(self):
"""获取年龄"""
return self._age
@age.setter
def age(self, value):
"""设置年龄,带验证"""
if value < 0:
raise ValueError("年龄不能为负数")
self._age = value
@age.deleter
def age(self):
"""删除年龄"""
print("删除年龄属性")
del self._age
person = Person("张三", 25)
print(person.age) # 25(像访问属性一样调用方法)
person.age = 26 # 调用 setter
del person.age # 调用 deleter@staticmethod - 静态方法
python
class MathUtils:
@staticmethod
def add(a, b):
"""静态方法不需要 self 参数"""
return a + b
@staticmethod
def multiply(a, b):
return a * b
print(MathUtils.add(1, 2)) # 3
print(MathUtils.multiply(3, 4)) # 12@classmethod - 类方法
python
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def from_birth_year(cls, name, birth_year):
"""类方法的第一个参数是 cls(类本身)"""
age = 2026 - birth_year
return cls(name, age)
def greet(self):
return f"我是{self.name},今年{self.age}岁"
person = Person.from_birth_year("张三", 2000)
print(person.greet()) # 我是张三,今年26岁多个装饰器
python
def bold(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
return f"<b>{func(*args, **kwargs)}</b>"
return wrapper
def italic(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
return f"<i>{func(*args, **kwargs)}</i>"
return wrapper
# 装饰器从下往上执行
@bold
@italic
def greet(name):
return f"Hello, {name}!"
print(greet("张三")) # <b><i>Hello, 张三!</i></b>单例模式装饰器
python
def singleton(cls):
"""确保一个类只有一个实例"""
instances = {}
@functools.wraps(cls)
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
@singleton
class Database:
def __init__(self):
print("创建数据库连接")
db1 = Database() # 创建数据库连接
db2 = Database() # 不会再次创建
print(db1 is db2) # True权限验证装饰器
python
def require_permission(permission):
"""检查用户权限的装饰器"""
def decorator(func):
@functools.wraps(func)
def wrapper(user, *args, **kwargs):
if permission not in user.permissions:
raise PermissionError(f"需要 {permission} 权限")
return func(user, *args, **kwargs)
return wrapper
return decorator
class User:
def __init__(self, name, permissions):
self.name = name
self.permissions = permissions
@require_permission("delete")
def delete_user(admin, user_id):
print(f"删除用户 {user_id}")
admin = User("管理员", ["read", "write", "delete"])
guest = User("访客", ["read"])
delete_user(admin, 1) # 删除用户 1
delete_user(guest, 1) # PermissionError: 需要 delete 权限装饰器最佳实践
- 始终使用
@functools.wraps:保留原函数的元数据 - 装饰器应该是可配置的:使用带参数的装饰器
- 保持装饰器简单:复杂的逻辑放在被装饰的函数中
- 考虑性能:装饰器会增加函数调用的开销
参考资源
python
# 基本装饰器
def my_decorator(func):
def wrapper():
print("函数执行前")
func()
print("函数执行后")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
# 输出:
# 函数执行前
# Hello!
# 函数执行后
# 带参数的装饰器
def timer(func):
import time
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 执行时间: {end - start:.4f}秒")
return result
return wrapper
@timer
def slow_function():
import time
time.sleep(1)
return "完成"
print(slow_function())异常处理
python
try:
num = int(input("请输入数字: "))
result = 10 / num
print(f"结果: {result}")
except ValueError:
print("请输入有效的数字!")
except ZeroDivisionError:
print("除数不能为零!")
except Exception as e:
print(f"发生错误: {e}")
else:
print("计算成功!")
finally:
print("程序结束")文件操作
python
# 写入文件
with open("test.txt", "w", encoding="utf-8") as f:
f.write("Hello, World!\n")
f.write("这是第二行")
# 读取文件
with open("test.txt", "r", encoding="utf-8") as f:
content = f.read() # 读取全部内容
print(content)
with open("test.txt", "r", encoding="utf-8") as f:
lines = f.readlines() # 读取所有行
for line in lines:
print(line.strip())
# 逐行读取(大文件推荐)
with open("test.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip())推荐资源
官方文档
- Python 官方文档 - 最权威的参考资料
- Python 官方教程
学习网站
- 廖雪峰 Python 教程
- 菜鸟教程 Python
- Real Python(英文,适合进阶)
书籍推荐
- 《Python 编程:从入门到实践》(入门首选)
- 《Python 基础教程》(经典教材)
- 《流畅的 Python》(进阶必读)