生成器
一、什么是生成器
自定义的迭代器对象,就是用函数语法来声明生成器,用yield关键字取缔 return关键字来返回值,参数没有多少变化
有yield关键字的函数,函数名(),不是调用函数,而是生成得到生成器对象,生成器对象就是迭代器对象,可以通过__next__()进行取值
二、生成器的执行流程
def fn(): yield 1 yield 3 yield 5 obj = fn() print(obj.__next__()) # 1 从开始往下执行,遇到第一个yield停止,拿到第一个yield的返回值 print(obj.__next__()) # 3 从上一次停止的yield往下执行,在再遇到yield的地方停止,拿到当前yield的返回值 print(obj.__next__()) # 5 print(obj.__next__()) # StopIteration 以此类推,直到无法获得下一个yield,抛出StopIteration异常 # 可以直接被for循环遍历 for v in fn(): print v # 生成器表达式 res = (i for i in range(1,100000000) if i != 4) # 生成器表达式 print(res) # <generator object <genexpr> at 0x00000208F8E01E08> # 生成器对象不会主动执行任何一行代码 # 必须通过.__next__()触发代码的运行
三、生成器的send方法
send的工作原理 # 1. send发送信息给当前停止的yield # 2. 再去调用__next__()方法,生成器接着往下指向,返回下一个yield值并停止 persons = ['张三','李四','王五','赵六','钱七'] def order(persons): for i in range(len(persons)): if i == 0: print('%s在面试' % persons[0]) else: print('%s叫%s去面试' % (name, persons[i])) print('%s面试完毕' % persons[i]) name = yield persons[i] obj = order(persons) for i in range(len(persons)): if i == 0: p = obj.__next__() else: p = obj.send(p) ==>>>>> 张三在面试 张三面试完毕 张三叫李四去面试 李四面试完毕 李四叫王五去面试 王五面试完毕 王五叫赵六去面试 赵六面试完毕 赵六叫钱七去面试 钱七面试完毕
四、yeild与return区别
1. 有yield关键字的函数,函数名() 不是调用函数,而是生成得到 生成器对象,生成器对象就是迭代器对象,可以通过 __next__() 进行取值
2. yield后面跟的值就是调用迭代器.__next__()方法你能得到的值
3. yield既可以返回一个值也可以返回多个值 并且多个值也是按照元组的形式返回
yield
1.帮你提供了一种自定义生成器方式
2.会帮你将函数的运行状态暂停住
3.可以返回值与return之间异同点
相同点:都可以返回值,并且都可以返回多个
不同点:
yield可以返回多次值,而return只能返回一次函数立即结束
yield还可以接受外部传入的值