首页 > 编程语言 > 详细

python yield在函数中起返回值中的使用

时间:2020-06-06 09:15:43      阅读:73      评论:0      收藏:0      [点我收藏+]

yield有许多用法,原理真的搞不清,个人用了代码比较的方法,总算大致理解它作为函数返回时所起的作用:

题目:

技术分享图片

假设题目要求得到每个排列的结果:

考虑组合(非排列),为了避免重复,就如题中举例,划分数有大到小排列,比如6=5+1,这样1+5就不行
递归:从6里取2作为第一个的话,剩余4再划分时,不能超过2,这样就不会出现3,2,1,然后2,3,1再来一遍的情况:

用了yield作为return使用的程序:

def fulldivision(n,limit):
    if n==1 or n == 0:
        yield [n,]
    else:
        for i in range(min(n,limit),0,-1):
            for result in fulldivision(n-i,i):
                yield [i,] + result
c = 0
for res in fulldivision(6,6):
        c += 1
        print (Solution %d:  % c,res)

不用yield,手动拼接列表,然后返回的程序(为了对比,保持了原来yield,只是注释掉)

def fulldivision(n,limit):
    res = None        #这里要res要初始化
    if n==1 or n == 0:
        #yield [n,]
        return ((n,),)
    else:
        for i in range(min(n,limit),0,-1):
            for result in fulldivision(n-i,i):
            #    yield [i,] + result
                if res == None:      #这里要None判别
                    res = (((i,) + result),)
                else:
                    res =  res + (((i,) + result),)
    return res
            
c = 0
for res in fulldivision(6,6):
        c += 1
        print (Solution %d:  % c,res)

两个程序结果一样:

Solution 1:  (6, 0)
Solution 2:  (5, 1)
Solution 3:  (4, 2, 0)
Solution 4:  (4, 1, 1)
Solution 5:  (3, 3, 0)
Solution 6:  (3, 2, 1)
Solution 7:  (3, 1, 1, 1)
Solution 8:  (2, 2, 2, 0)
Solution 9:  (2, 2, 1, 1)
Solution 10:  (2, 1, 1, 1, 1)
Solution 11:  (1, 1, 1, 1, 1, 1)

python yield在函数中起返回值中的使用

原文:https://www.cnblogs.com/nocomment/p/13053239.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!