装饰器、迭代器和生成器是 Python 中的高级功能,它们分别用于扩展函数或方法的功能、遍历容器元素和创建简洁的迭代器。
装饰器
装饰器是一个用于修改或扩展函数或方法的功能的函数。装饰器接受一个函数作为参数,并返回一个新的函数,新函数通常会在原函数的基础上添加一些额外的功能。装饰器的常见用途包括日志记录、性能测试、权限检查等。
def demo_decorator(func):
def hh(*args, **kwargs):
print("Before function call")
result = func(*args, **kwargs)
print("After function call")
return hh
return wrapper
@demo_decorator
def a_function():
print("Inside function")
a_function()
'''
结果:
Before function call
Inside function
After function call
'''
底层:本质上是一个高阶函数,作为闭包,内部函数调外部函数引用,并返回内部函数。在调用被修饰的函数时,实际上是在调用装饰器返回的新函数。
闭包是指一个函数即使离开作用域后,也能够记录并访问其定义的作用域中的局部变量。常用于创建具特定行为的函数,允许不用全局变量保留函数的状态。Python 中,闭包可通过定义嵌套函数并捕获外部作用域变量来实现。
迭代器
迭代器是 Python 中用于遍历容器(如列表、元组、集合等)元素的对象。迭代器实现了 __iter__()
和 __next__()
方法,提供了一种统一的遍历容器元素的接口,使得你可以在 for
循环和其他迭代方法中使用它。
class DemoIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
# 使用自定义的迭代器遍历列表
my_list = [1, 2, 3, 4, 5]
iterator = DemoIterator(my_list)
for item in iterator:
print(item)
'''
1
2
3
4
5
'''
底层:依赖于 __iter__()
和 __next__()
方法。当在 for
循环中使用迭代器时,Python 首先调用 __iter__()
方法获取迭代器对象,然后反复调用 __next__()
方法获取容器的下一个元素,直到遇到 StopIteration
异常,表示迭代已完成。
大多数情况下,不需手动实现迭代器。只有创建自定义容器类型时,可能需实现迭代器接口。
可迭代对象(Iterable)是 Python 中具一定遍历规则的对象,可以在 for
循环或其他迭代方法中使用。
-
可迭代对象实现了
__iter__()
方法。当for
循环或其他迭代方法中使用可迭代对象时,Python 会自动调用该方法。__iter__()
方法返回一个迭代器对象,用于遍历容器的元素。 -
迭代器对象实现了
__next__()
方法。每次迭代时,Python 会调用这个方法来获取容器的下一个元素。当没更多的元素可供迭代时,__next__()
方法应抛出一个StopIteration
异常,通知 Python 结束迭代。
生成器
生成器是一种特殊的迭代器,它允许使用更简洁的方式创建迭代器。生成器使用 yield
语句生成一系列的值,而不是显式地实现 __iter__()
和 __next__()
方法。当生成器函数被调用时,它会返回一个生成器对象,该对象可用于遍历生成的值。
def demo_generator(n):
i = 0
while i < n:
yield i
i += 1
for item in demo_generator(5):
print(item)
'''
0
1
2
3
4
'''
底层:依赖于 yield
语句和生成器函数。生成器函数被调用时,会返回一个生成器对象,实际上是一个迭代器,它会在每次迭代时自动保存函数的状态(包括局部变量、指令指针等),并在下一次迭代时从上次中断的地方继续执行。遇到 yield
语句时,生成器会暂停函数的执行,并将 yield
语句后的值作为迭代的当前值返回。当再次调用 next()
函数时,生成器会从上次暂停的地方恢复执行,直到遇到下一个 yield
语句或抛出 StopIteration
异常。
yield
是 Python 中的一个关键字,用于实现生成器。在底层,yield
的实现依赖于 Python 的协程(coroutine)机制。当一个生成器函数包含 yield
语句时,它会被编译器识别为一个生成器,而不是普通的函数。生成器函数的执行不同于普通函数,它可以在执行过程中暂停和恢复,保持当前的状态。