Python中的生成器、迭代器、装饰器详解
生成器
生成器是可以迭代的,但只能迭代一次,因为他们并不把所有的值都放在内存中,而是在运行时生成值。生成器是一种特殊的迭代器,使用yield语句返回值。定义一个生成器的方式是将函数中的返回语句换成yield语句。
下面是一个简单的生成器示例,生成器函数gnum()使用yield语句生成一个简单的数列:
def gnum():
yield 1
yield 2
yield 3
yield 4
yield 5
print(list(gnum()))
输出为:
[1, 2, 3, 4, 5]
迭代器
迭代器是一个可以记住遍历位置的对象。在Python中,迭代器对象有一个__next__()方法返回序列的下一个对象,在没有后续元素时抛出StopIteration异常。
我们可以使用iter()函数将可迭代对象转换成迭代器。下面是一个简单的迭代器示例,给定一个列表,使用迭代器返回其中的元素:
lst = [1, 2, 3, 4, 5]
lst_i = iter(lst)
while True:
try:
print(next(lst_i))
except StopIteration:
break
输出为:
1
2
3
4
5
迭代器使用场景很多,比如for循环遍历序列对象,文件的读取等等。
装饰器
在 python 中,我们可以使用装饰器来改变或扩展一个函数的功能,使用方法是在函数的定义前加上@装饰器名即可。
下面是一个简单的装饰器示例,实现一个简单的函数计时器:
import time
def timer(func):
def wrapper(*args, **kw):
start_time = time.time()
func(*args, **kw)
end_time = time.time()
print(f'{func.__name__} takes {end_time-start_time:.6f}s')
return wrapper
@timer
def test():
time.sleep(1)
test()
输出为:
test takes 1.001225s
这个装饰器函数将函数用函数包装起来,并将耗时打印出来。
有如上示例的带参数装饰器,还有类装饰器等更加复杂的装饰器,它们都具有提高代码可重用性和可维护性的优势,是 Python 中非常重要的概念之一。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中的生成器、迭代器、装饰器详解 - Python技术站