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


yield有許多用法,原理真的搞不清,個人用了代碼比較的方法,總算大致理解它作為函數返回時所起的作用:

在下面例子中,用yield生成器來提高速度(只要函數內有yield,就是生成器了,或者叫迭代器,這個就不糾結了,他只是定義了我要用這個邏輯去找想要的結果,實際定義生成器時,代碼並沒有執行,執行是取回的時候發生,並且不是一次全部取回,或許是取回其中一個結果,一看已經對了,后面的執行就沒有必要了,python也不會去執行了)

LeetCode37題解(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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM