什么是迭代器
"""
什么叫迭代器--->实现了迭代器协议的对象
迭代器协议---->两个魔术方法
__iter__--->返回迭代器对象
__next__--->从迭代器获取下一个迭代值
"""
class FibIter:
def __init__(self, max_count):
self.a, self.b = 0, 1
self.cur_count = 0
self.max_count = max_count
def __iter__(self):
return self
def __next__(self):
if self.cur_count < self.max_count:
self.a, self.b = self.b, self.a + self.b
self.cur_count += 1
return self.a
raise StopIteration
F = FibIter(20)
for value in F:
print(value)
什么是生成器
"""
什么叫生成器 -> 迭代器语法的升级版
"""
def fib(max_count):
a, b = 0, 1
for _ in range(max_count):
a, b = b, a + b
yield a
f = fib(20)
for value in f:
print(value)
协作并发
"""
并行 / 并发 ---> 多任务在同时执行
~多线程---->GIL---->无法使用多核特性
~多进程---->启动多个Python解释器来执行一个代码--->可以利用CPU的多核特性
--->一般写爬虫不适用多进程,因为爬虫是I/0密集型任务
"""
"""
协程 ---> co-routine --> 相互协作的子程序
生成器经过预激活就可以成为协程(跟其他子程序进行协作 ---> 协作式并发)
"""
def calc_average():
total, counter = 0, 0
avg_value = None
while True:
curr_value = yield avg_value
total += curr_value
counter += 1
avg_value = total / counter
def main():
calc = calc_average()
print(calc.send(None))
print(calc.send(20))
print(calc.send(30))
print(calc.send(40))
if __name__ == '__main__':
main()