列表推导式提供了一种简洁的创建列表的方式。它允许你基于现有的可迭代对象(如列表、元组、范围等),通过一个表达式和一个循环来生成新的列表。
语法结构:[表达式 for 变量 in 可迭代对象 if 条件],其中if条件部分是可选的。
例如,生成一个包含1到10的平方的列表:
squares = [i ** 2 for i in range(1, 11)]print(squares)
如果只想获取偶数的平方,可以添加条件:
even_squares = [i ** 2 for i in range(1, 11) if i % 2 == 0]print(even_squares)
9. 字典推导式
类似于列表推导式,字典推导式提供了一种简洁的创建字典的方法。
语法结构:{键表达式: 值表达式 for 变量 in 可迭代对象 if 条件}
例如,创建一个字典,键为1到5的数字,值为这些数字的平方:
square_dict = {i: i ** 2 for i in range(1, 6)}print(square_dict)
10. 生成器
生成器是一种特殊的迭代器,它不会一次性生成所有的值,而是按需生成,这在处理大量数据时非常节省内存。
生成器函数:通过yield关键字定义的函数,它返回一个生成器对象。例如:
def fibonacci_generator(): a, b = 0, 1 while True: yield a a, b = b, a + bfib = fibonacci_generator()for _ in range(10): print(next(fib))
生成器表达式:类似于列表推导式,但使用圆括号。例如,生成1到10的平方的生成器:
square_generator = (i ** 2 for i in range(1, 11))for square in square_generator: print(square)
11. Lambda 函数(匿名函数)
Lambda函数是一种小型的、没有函数名的函数,通常用于需要一个简单函数但又不想使用def关键字定义的场景。
语法结构:lambda 参数: 表达式
例如,定义一个简单的加法Lambda函数:
add = lambda a, b: a + bresult = add(3, 5)print(result)
Lambda函数常与map()、filter()等函数一起使用。例如,使用map()和Lambda函数将列表中的每个元素翻倍:
nums = [1, 2, 3, 4]doubled = list(map(lambda x: x * 2, nums))print(doubled)
使用filter()和Lambda函数过滤出列表中的偶数:
even_nums = list(filter(lambda x: x % 2 == 0, nums))print(even_nums)
12. 装饰器
装饰器是一种特殊的Python语法,它允许你修改函数或类的行为,而无需直接修改它们的源代码。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。
简单装饰器示例:
def my_decorator(func): def wrapper(): print(”在函数执行前做一些事情”) func() print(”在函数执行后做一些事情”) return wrapper@my_decoratordef say_hello(): print(”Hello!”)say_hello()
在这个例子中,@my_decorator语法将say_hello函数传递给my_decorator函数,my_decorator返回一个新的函数wrapper,并替换原来的say_hello函数。这样,在调用say_hello时,就会先执行wrapper函数中添加的额外逻辑,再执行原来say_hello函数的逻辑。
装饰器在日志记录、性能测量、权限验证等方面有广泛应用。
13. 上下文管理器
上下文管理器用于管理资源的分配和释放,确保在代码块执行前后正确地获取和释放资源,比如文件的打开与关闭、数据库连接的建立与断开等。
with语句:是Python中使用上下文管理器的主要方式。以文件操作为例,前面文件操作部分提到的使用with打开文件,它会在代码块结束时自动关闭文件,无需手动调用file.close()。即使代码块中发生异常,with语句也能确保资源正确释放。
try: withopen('example.txt', 'r') asfile: content = file.read()# 这里可以对读取的内容进行处理# 如果发生异常,文件会自动关闭except FileNotFoundError: print(”文件未找到”)
- 自定义上下文管理器:通过定义类并实现
__enter__和__exit__方法来创建自定义上下文管理器。例如,模拟一个简单的资源管理场景:
class Resource: def __init__(self): print(”初始化资源”) def __enter__(self): print(”进入上下文,获取资源”) return self def __exit__(self, exc_type, exc_value, traceback): print(”退出上下文,释放资源”) if exc_type is not None: print(f”处理异常: {exc_type}, {exc_value}”) return True# 返回True表示异常已处理,不会向上传播with Resource() as res: print(”在上下文中使用资源”)# 这里可能会引发异常 raise ValueError(”模拟异常”)
在上述代码中,Resource类实现了上下文管理器协议。__enter__方法在进入with代码块时被调用,__exit__方法在离开with代码块时被调用,无论是否发生异常。如果发生异常,__exit__方法会接收到异常类型、异常值和追溯信息。通过返回True,可以告诉Python异常已在__exit__方法中处理,不再向上传播。
14. 模块的高级用法
- 包(Packages):包是一种管理Python模块命名空间的方式,它通过目录结构来组织相关模块。在包的根目录下必须有一个
__init__.py文件(在Python 3.3及之后版本,该文件可以为空,但存在该文件能确保包的兼容性)。例如,有如下目录结构:
my_package/ __init__.py module1.py subpackage/ __init__.py module2.py
在module1.py和module2.py中定义了相应的函数或类后,可以通过以下方式导入:
# 导入my_package.module1from my_package import module1module1.some_function()# 导入my_package.subpackage.module2from my_package.subpackage import module2module2.some_class()
sys.path与模块搜索路径:Python在导入模块时,会按照sys.path中的路径顺序查找模块。sys.path是一个包含目录路径的列表,可以通过import sys; print(sys.path)查看。当导入一个模块时,Python会依次在sys.path中的目录中查找对应的模块文件。如果自定义模块不在默认的搜索路径中,可以将其所在目录添加到sys.path中,不过这种方法在脚本结束后就会失效。更推荐的方式是将模块所在目录添加到环境变量PYTHONPATH中,这样在所有Python脚本中都能正确导入该模块。
15. 类型提示(Type Hints)
从Python 3.5开始引入了类型提示,它允许在代码中为函数参数和返回值添加类型注释,提高代码的可读性和可维护性,也有助于静态类型检查工具(如mypy)发现潜在的类型错误。
def add_numbers(a: int, b: int) -> int: return a + b
这里表明add_numbers函数期望接收两个int类型的参数,并返回一个int类型的值。
- 变量类型提示:也可以对变量进行类型提示,虽然Python是动态类型语言,变量的类型可以在运行时改变,但类型提示有助于理解代码意图。例如:
name: str = ”Alice”age: int = 25
类型提示并不会改变Python动态类型的本质,在运行时不会进行强制类型检查,但对于大型项目和团队协作开发,它能提供很多便利,帮助开发者更好地理解代码逻辑和避免类型相关的错误。