生成器

一、什么是生成器

自定义的迭代器对象,就是用函数语法来声明生成器,用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还可以接受外部传入的值

 

posted on 2020-05-15 23:27  软饭攻城狮  阅读(73)  评论(0)    收藏  举报

导航