yield有許多用法,原理真的搞不清,個人用了代碼比較的方法,總算大致理解它作為函數返回時所起的作用:
在下面例子中,用yield生成器來提高速度(只要函數內有yield,就是生成器了,或者叫迭代器,這個就不糾結了,他只是定義了我要用這個邏輯去找想要的結果,實際定義生成器時,代碼並沒有執行,執行是取回的時候發生,並且不是一次全部取回,或許是取回其中一個結果,一看已經對了,后面的執行就沒有必要了,python也不會去執行了)
題目:
假設題目要求得到每個排列的結果:
考慮組合(非排列),為了避免重復,就如題中舉例,划分數有大到小排列,比如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)