可迭代对象 ,最简单的理解就是可以使用for循环, 常见的可迭代对象包括列表、元组、字典、集合和字符串等。
迭代器 ,就是可迭代对象的升级版,不仅可以使用for循环还可以用next()函数取值,直到没有值可返回时引发 StopIteration
异常。
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
value = self.data[self.index]
self.index += 1
return value
else:
raise StopIteration
my_iterator = MyIterator([1, 2, 3])
for value in my_iterator:
print(value) # 输出 1 2 3
生成器 ,在迭代器的版本上再升级一版,生成器存储的不是值,而是一个代码逻辑。比如元组的推导式的返回值就是一个生成器。
from collections.abc import Iterator, Iterable, Generator
s = (i for i in range(1, 18))
print(isinstance(s, Iterable), isinstance(s, Iterator), isinstance(s, Generator), next(s))
相比较与迭代器,生成器的内存效率和代码简洁性方面都非常有用。
装饰器 ,装饰器是用于修改或增强函数或方法行为的函数。装饰器接收一个函数作为参数,并返回一个新的函数。它们常用于日志记录、访问控制、缓存等场景。
import time
import random
def cost_time(f):
def calc():
start = time.time()
f()
print(f'函数{f.__name__}消耗{time.time() - start}')
return calc
date = [random.randint(1, 10000) for i in range(10000)]
date1 = date.copy()
date2 = date.copy()
@cost_time
def my_sort():
date1.sort()
print(date1)
def my_sorted():
date3 = sorted(date2)
print(date3)
my_sorted = cost_time(my_sorted)
my_sort()
my_sorted()
经典装饰器,统计函数时间开销。