永发信息网

初学python,想问些关于yield等等的问题

答案:2  悬赏:50  手机版
解决时间 2021-02-10 06:37
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。。
最佳答案
关于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关键字的函数叫生成器,直接调用不会执行函数,c= flatten(),使用next方法触发生成器,c.next()执行到yield 函数暂停,返回element,直到再次调用next方法,继续执行,直到迭代完所有元素 再看看别人怎么说的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
尹顺物流地址好找么,我有些事要过去
喜欢玩语聊大厅是什么心理?
昌乐县乔馆镇下庄村村民委员会地址在什么地方
宝鸡文理学院那个专业比较好,好就业?
圆通速递代理点地址在什么地方,我要处理点事
不锈钢焊点用什么抛光
一壶春怎么去啊,有知道地址的么
人民防空地下室的防毒通道是指:[2011-100]
林徽因丈夫 于丹讲座
阴阳师今天购买的体力,可以明天领取吗
关于虎跑泉
宝宝晚上睡觉都是躺着喝奶,对以后的听力有影
天湖丽景我想知道这个在什么地方
从四平路同济到浦东八佰伴怎么走?具体公交及
取小名,带木,有什么意见?男孩,中秋前一天
推荐资讯
长治市医学影像技术专业人员紧缺吗?此专业与
形容朦朦胧胧的诗句
欧麦司(大合店)地址有知道的么?有点事想过去
为什么我走在路上前面有路人档我路了可我却不
马哥栗子怎么去啊,我要去那办事
从徐州到丰县走高速怎么走,从那入口,到哪出
红太阳旅行社有限公司怎么去啊,我要去那办事
洋号湾在哪里啊,我有事要去这个地方
【指手画脚的意思】指手画脚和指手划脚,哪个
笔记本出现伪黑屏,开机的瞬间经常,之后马上
什邡市公安局城东派出所地址在什么地方,想过
轻舞飞扬音乐吧怎么去啊,我要去那办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?