永发信息网

python中yield和return究竟有什么区别,怎么用

答案:2  悬赏:30  手机版
解决时间 2021-12-21 08:24
python中yield和return究竟有什么区别,怎么用
最佳答案
常看到别人使用或讨论yield语法,能搜到的中文解释却不多,今天决心搞定yield,把暂时的理解贴到这里.

搞定yield之前: 叠代器(iterator)

发现yield: 生成器(constructor)

使用yield: 递归调用

1. iterator

叠代器最简单例子应该是数组下标了,且看下面的c++代码:

int array[10];

for ( int i = 0; i < 10; i++ )

printf("%d ", array[i]);

叠代器工作在一个容器里(array[10]),它按一定顺序(i++)从容器里取出值(array[i])并进行操作(printf("%d ", array[i])。

上面的代码翻译成python:

array = [i for i in range(10)]

for i in array:

print i,

for i in array干了什么(别乱想)?首先,array作为一个list是个容器,其次list这个内建类型有默认的next行为,python发现这些之后采 取的秘密的没被各位看到的动作是:拿出array这丫容器的叠代器,从里面next一下把值给i供for循环主体处置,for把这个值print了。

现在的问题是数据可以做容器叠代,代码可以吗?

怎么不行,碗碟可以用来放菜,wk们不就联想出用nt盛吗,当然我们的yield不会那么yellow + bt

2. constructor

怎么把函数变成constructor? 在函数体里有yield就行了!

def gen():
print 'enter'
yield 1
print 'next'
yield 2
print 'next again'

for i in gen():
print i

各位!python看到gen函数里出现yield,知道可以用next了,问题是怎么对代码这个容器玩next?

从容器里拿到iterator的时候它还什么也不是,处在容器入口处,对于数组来说就是下标为-1的地方,对于函数来说就是函数入口嘛事没干,但是万事俱备就欠next。

开始for i in g,next让itreator爬行到yield语句存在的地方并返回值,

再次next就再爬到下一个yield语句存在的地方并返回值,依次这样直到函数返回(容器尽头)。
您一定看出来上面代码的输出是:

enter
1
next
2
next again

如果没看出来请不要往下看了免得反被yield搞定。

3. 使用yield

yield的代码叠代能力不但能打断函数执行还能记下断点处的数据,下次next书接上回,这正是递归函数需要的。

例如中序遍历二叉树:

(应该是David Mertz写的)

def inorder(t):
if t:
for x in inorder(t.left):
yield x
yield t.label
for x in inorder(t.right):
yield x

for n in inorder(tree)

print n

当然yield这种代码next的能力还可以用在其它方面,发现拍案的在贴咯。
全部回答
常看到别人使用或讨论yield语法,能搜到的中文解释却不多,今天决心搞定yield,把暂时的理解贴到这里. 搞定yield之前:叠代器(iterator) 发现yield:生成器(constructor) 使用yield:递归调用 1.iterator 叠代器最简单例子应该是数组下标了,且看下面的c++代码: int array[10]; for ( int i = 0; i < 10; i++ ) printf("%d ",array[i]); 叠代器工作在一个容器里(array[10]),它按一定顺序(i++)从容器里取出值(array[i])并进行操作(printf("%d ",array[i]). 上面的代码翻译成python: array = [i for i in range(10)] for i in array: print i, for i in array干了什么(别乱想)?首先,array作为一个list是个容器,其次list这个内建类型有默认的next行为,python发现这些之后采 取的秘密的没被各位看到的动作是:拿出array这丫容器的叠代器,从里面next一下把值给i供for循环主体处置,for把这个值print了. 现在的问题是数据可以做容器叠代,代码可以吗? 怎么不行,碗碟可以用来放菜,wk们不就联想出用nt盛吗,当然我们的yield不会那么yellow + bt 2.constructor 怎么把函数变成constructor?在函数体里有yield就行了! def gen(): print 'enter' yield 1 print 'next' yield 2 print 'next again' for i in gen(): print i 各位!python看到gen函数里出现yield,知道可以用next了,问题是怎么对代码这个容器玩next? 从容器里拿到iterator的时候它还什么也不是,处在容器入口处,对于数组来说就是下标为-1的地方,对于函数来说就是函数入口嘛事没干,但是万事俱备就欠next. 开始for i in g,next让itreator爬行到yield语句存在的地方并返回值, 再次next就再爬到下一个yield语句存在的地方并返回值,依次这样直到函数返回(容器尽头). 您一定看出来上面代码的输出是: enter 1 next 2 next again 如果没看出来请不要往下看了免得反被yield搞定. 3.使用yield yield的代码叠代能力不但能打断函数执行还能记下断点处的数据,下次next书接上回,这正是递归函数需要的. 例如中序遍历二叉树: (应该是david mertz写的) def inorder(t): if t: for x in inorder(t.left): yield x yield t.label for x in inorder(t.right): yield x for n in inorder(tree) print n 当然yield这种代码next的能力还可以用在其它方面 【t。sdm】
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
蚕蛹什么味道
鄢陵县许昌泰洁洗衣地址在什么地方,想今天过
自由行的话带26寸行李箱旅游,方便吗
单选题Hisunclemadeafilm________hiss
好听的小区名字
4号加油站地址在什么地方,想过去办事,
抛光车间主任总结感言
瓷肌cc霜哪款是亮白的
模块结构图是什么
哀叹的近义词
求教,漫步者h290耳机怎么煲机,谢谢、、、、
形容得意的四字成语
求余秋雨写的《信客》的主要内容和读后感
古人说衣食住行,为什么衣是首位
单选题关于放射性同位素的说法,正确的是A.放
推荐资讯
十年春,齐师伐我。公将战,曹刿请见。其乡人
把钱放在支付宝里安全吗?
它在桌子上英语怎么说
红土地超市这个地址在什么地方,我要处理点事
苏台德地区现在是在哪个国家
(1)8a+a2-1-a2-7a+6(2)2(2m-3n)+6n.
一个园林技术员想创业,出路何在?
华为技术有限公司作为高科技的民营企业研制出
在深圳报电大大专一年费用多少?
什么叫磁盘空间不足
独山县烟草专卖局稽查大队客户服务中心在什么
一条路的飞翔阅读答案
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?