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)
原文:https://www.cnblogs.com/nocomment/p/13053239.html