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

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

在下面例子中,用yield生成器来提高速度(只要函数内有yield,就是生成器了,或者叫迭代器,这个就不纠结了,他只是定义了我要用这个逻辑去找想要的结果,实际定义生成器时,代码并没有执行,执行是取回的时候发生,并且不是一次全部取回,或许是取回其中一个结果,一看已经对了,后面的执行就没有必要了,python也不会去执行了)

题目:


将一个正整数n表示成一系列的正整数之和:
n=n1+n2+.....+nx(n>n, 3n,>1,k >1)被称做正整数n的一个划分。一个正整数n可能存在着不同的划分,例如正整数6的

全部的划分为:
6-6
6-5+1
6-4+26-4+1+1
6=3+36-3+2+1 6-3+1+1+1
6-2+2+26-2+2+1+16-2+1+1+1+1
6=1+1+1+1+1+1

【分析】
正整数n的不同的划分的个数称为该正整数n的划分数。例如正整数6的划分数为11。
编写一个程序,计算输入的正整数n的划分数。


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

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

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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,只是注释掉)

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值