生成器:自定义的迭代器对象
# -- 就是用函数语法来声明生成器,用yield关键字取代return关键字来返回值,参数没有多少变化# 总结:有yield关键字的函数,函数名() 不是调用函数,而是生成得到 生成器对象,生成器对象就是迭代器对象,可以通过 __next__() 进行取值# 执行流程:def fn(): yield 1 yield 3 yield 5obj = fn()obj.__next__() # 从开始往下执行,遇到第一个yield停止,拿到yield的返回值obj.__next__() # 从上一次停止的yield往下执行,在再遇到的yield时停止,拿到当前停止的yield的返回值# ... # 以此类推,直到无法获得下一个yield,抛StopIteration异常# 可以直接被for循环遍历for v in fn(): print v #案例一:创建生成器,从其取值,依次得到1! 2! 3! ...def jiecheng(): ji = 1 count = 1 while True: ji *= count yield ji count += 1 obj = jiecheng()print(obj.__next__())print(obj.__next__())print(obj.__next__()) # 可以无限取# 案例二:def jiecheng_num(num): ji = 1 for i in range(1, num + 1): ji *= i yield ji # ...obj = jiecheng_num(3)print(obj.__next__())print(obj.__next__())print(obj.__next__())print(obj.__next__()) # 有异常了for v in jiecheng_num(5): print(v) # 会自动处理异常停止# 案例三:def my_range(num): # => [0, 1, 2, ..., num - 1] count = 0 while count < num: yield count count += 1for v in my_range(10): print(v, end=' ')print(list(my_range(10)))