python yeild生成器函数

1、生成器含义

        生成器函数是一种引用yield关键字的特殊函数,yield关键字实现的是“断点效果”,使函数暂定并挂起,待下一次迭代时继续执行。

        调用生成器函数时,不会立刻执行函数体,而是返回生成器对象。当对象通过生成器启动函数(例如send函数和next函数)时,才能够实现迭代效果。Yield关键字现的是断点效果)。生成器函数格式为:

# yield 生成器

def func1():
    print("port1")
    yield 1
    print("port2")
    yield 2

f1 = func1()
f1.__next__()

2、启动函数

        启动函数主要有__next__函数和send函数,通过启动函数执行迭代器函数,并依次返回迭代值。

1)next函数

        使用next函数会执行生成器函数内容,遇到yield关键字则暂停,待下次迭代时继续执行。例如:

# yield 生成器,目前生成器并没有迭代值可返回
def func1():
    print("port1")
    yield
    print("port2")
    yield

f1 = func1()
print("执行第一部分")
f1.__next__()
print("执行第二部分")
f1.__next__()

# 运行结果
# 执行第一部分
# port1
# 执行第二部分
# port2

2)Send函数

Send函数对于next函数,其优点在于能够传递参数。例如:

def fund3():
    num = 0
    num1 = yield num
    print(num)
    print("send传进来的值:",num1)
    num1 = yield num1 + 10

f3 = fund3()
f3_1 = f3.send(None) #首次使用send,需要传递None
print("第一个迭代值:",f3_1)
f3_2 = f3.send(1)
print("第二个迭代值:",f3_2)
# 运行结果
# 第一个迭代值: 0
# 0
# send传进来的值: 1
# 第二个迭代值: 11

3、生成器案例

import time


# 生产者与消费者案例
def product(c):
    # 消费者的生成器启动
    c.send(None)
    i = 1
    while i < 5:
        print("生产的第{}个包子".format(i))
        c.send(str(i))
        time.sleep(2)
        i = i + 1
    print("product_end")

def customer():
    while True:
        n = yield
        #print(n)
        if not n:
            print("customer_end")
            return
        print("消费的第{}个包子".format(n))

c = customer()
product(c)

# 运行结果
# 生产的第1个包子
# 消费的第1个包子
# 生产的第2个包子
# 消费的第2个包子
# 生产的第3个包子
# 消费的第3个包子
# 生产的第4个包子
# 消费的第4个包子
# product_end

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值