def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError :
yield nested
能否详细说明下yield这个语句到底是怎么运行的,加入在yield element下再加句print element(nested=【1,【2,【3】】】),为什么结果会是1,2,2,3,3,3。。
初学python,想问些关于yield等等的问题
答案:2 悬赏:50 手机版
解决时间 2021-02-10 06:37
- 提问者网友:疯子也有疯子的情调
- 2021-02-09 21:16
最佳答案
- 五星知识达人网友:神也偏爱
- 2021-02-09 22:23
关于yield,楼下kanchi240说的完全正确。我就不补充了。
想说的是。你这个用yield的函数的逻辑可能存在问题。入口参数nested是一个数组,函数里for sublist in nested被执行的时候,如果nested被改变就不合理,会产生一个异常,也许你设计的初衷就是如此。
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError :
yield nested
if __name__=="__main__":
for x in flatten(nested=[1,[2,[3]]]):
print x,type(x)输出结果是
1 <type 'int'>
2 <type 'int'>
3 <type 'int'>
你这个好象又是递归函数。分解一下步骤是这样子。
1. flatten(nested=[1,[2,[3]]])
2. sublist=1
3. for element in flatten(sublist):此处在子调用异常,输出1, 但是它被递归函数的循环再次yield。
4. 下面依次类推。
我把程序修改了一下,可能看起来更清晰。
def flatten(nested,level=0):
try:
for sublist in nested:
print "sublist:",sublist,type(sublist)
for element in flatten(sublist,level+1):
print level,"yield",element
yield element
except TypeError :
print level,'yield type error',nested,type(nested)
yield nested
if __name__=="__main__":
for x in flatten(nested=[1,[2,[3]]]):
print x,type(x)输出结果是
sublist: 1 <type 'int'>
1 yield type error 1 <type 'int'>
0 yield 1
1 <type 'int'>
sublist: [2, [3]] <type 'list'>
sublist: 2 <type 'int'>
2 yield type error 2 <type 'int'>
1 yield 2
0 yield 2
2 <type 'int'>
sublist: [3] <type 'list'>
sublist: 3 <type 'int'>
3 yield type error 3 <type 'int'>
2 yield 3
1 yield 3
0 yield 3
3 <type 'int'>
想说的是。你这个用yield的函数的逻辑可能存在问题。入口参数nested是一个数组,函数里for sublist in nested被执行的时候,如果nested被改变就不合理,会产生一个异常,也许你设计的初衷就是如此。
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError :
yield nested
if __name__=="__main__":
for x in flatten(nested=[1,[2,[3]]]):
print x,type(x)输出结果是
1 <type 'int'>
2 <type 'int'>
3 <type 'int'>
你这个好象又是递归函数。分解一下步骤是这样子。
1. flatten(nested=[1,[2,[3]]])
2. sublist=1
3. for element in flatten(sublist):此处在子调用异常,输出1, 但是它被递归函数的循环再次yield。
4. 下面依次类推。
我把程序修改了一下,可能看起来更清晰。
def flatten(nested,level=0):
try:
for sublist in nested:
print "sublist:",sublist,type(sublist)
for element in flatten(sublist,level+1):
print level,"yield",element
yield element
except TypeError :
print level,'yield type error',nested,type(nested)
yield nested
if __name__=="__main__":
for x in flatten(nested=[1,[2,[3]]]):
print x,type(x)输出结果是
sublist: 1 <type 'int'>
1 yield type error 1 <type 'int'>
0 yield 1
1 <type 'int'>
sublist: [2, [3]] <type 'list'>
sublist: 2 <type 'int'>
2 yield type error 2 <type 'int'>
1 yield 2
0 yield 2
2 <type 'int'>
sublist: [3] <type 'list'>
sublist: 3 <type 'int'>
3 yield type error 3 <type 'int'>
2 yield 3
1 yield 3
0 yield 3
3 <type 'int'>
全部回答
- 1楼网友:琴狂剑也妄
- 2021-02-09 22:50
包含yield关键字的函数叫生成器,直接调用不会执行函数,c= flatten(),使用next方法触发生成器,c.next()执行到yield 函数暂停,返回element,直到再次调用next方法,继续执行,直到迭代完所有元素
再看看别人怎么说的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯