python yield

本文深入探讨了迭代器和生成器的概念,解释了两者之间的关键区别。迭代器用于遍历集合中的元素,而生成器则是一种特殊的迭代器,能够按需生成数据,有效节省内存。文章还详细介绍了Python中的yield关键字,以及如何使用yield和send方法控制生成器的执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、迭代器

可迭代对象,一般能用在 for … in … 中的对象,都是迭代器。迭代器将所有数据都保存在内存中,比如list。

2、生成器

用法上可以理解为只能迭代一轮的迭代器,不把所有数据都保存在内存中,实时生成数据,节省内存。
如下代码所示,首先定义一个名叫“mygenerator”的生成器。第一轮迭代,顺序输出生成器生成的数据;第二轮迭代,因为数据都已生成,因此没有输出

mygenerator = (x for x in range(3))
print "mygenerator is %s" % mygenerator
# out: 
# mygenerator is <generator object <genexpr> at 0x00000000043BDD80>

print "first iteration, output:"
for i in mygenerator:
    print i
# out:
# first iteration, output:
# 0
# 1
# 2

print "second iteration, output:"
for i in mygenerator:
    print i
# out:
# second iteration, output:

3、yield

yield只能用在函数内部调用函数后将返回一个生成器

生成器都有一个next()方法,第一次调用next,相当于启动生成器,会从生成器函数代码的第一行开始执行,一直执行到yield语句,并返回yield后面的值。再次调用next()方法,会从yield后面一条语句开始执行,再次遇到yield停止并返回yield后面的值。

函数内部可以执行几次yield语句,就可以调用几次next方法,即能从该生成器函数获得几次值。

def mygenerator():
    print "hi, I'm a mygenerator"
    print "yield 1 execute"
    yield 1
    print "yield 2 exec"
    yield 2
    print "yield 3 exec"
    yield 3
    
d = mygenerator()
print d
# out: 
# generator object mygenerator at 0x000000000347E288>

k = d.next()
# out:
# hi, I'm a mygenerator
# yield 1 execute
print k
# out:
# 1

k = d.next()
# out: 
# yield 2 exec
print k
# out:
# 2

k = d.next()
# out:
# yield 3 exec
print k
# out:
# 3

4、yield生成器的send(value) 方法

send(value) 和 next() 功能基本一致,都能获得生成器的下一个值,区别在于send方法同时可以传递一个值到生成器内部。
send(None) 和 next() 作用完全相同。

send()执行时,会先为上一条yield语句的等号左侧赋值(注意等号右侧的yield已经执行过,不会再执行),然后接着执行到下一条yield语句。第一次执行生成器时,由于没有更早的yield语句来赋值,因此只能用send(None)或next方法。

def mygenerator():
    print "hi, I'm a mygenerator"
    print "yield 1 execute"
    value_from_send = yield 1
    print "value_from_send is %s" % value_from_send
    print "yield 2 exec"
    yield 2

d = mygenerator()
k = d.send(None)
# out: 
# hi, I'm a mygenerator
# yield 1 execute
print k
# out: 
# 1

k = d.send(100)
# out: 
# value_from_send is 100
# yield 2 exec
print k
# out: 
# 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值