我正在撰寫一個函式,給定一個陣列,它回傳一個可能排列的串列。我想出了以下方法,效果很好:
def _permutate(elems):
if len(elems) <= 1:
yield elems
else:
for i in range(len(elems)):
for perm in _permutate(elems[:i] elems[i 1:]):
yield [elems[i]] perm
所以跑步print(list(_permutate([2, 1, 3])))給了我:[[2, 1, 3], [2, 3, 1], [1, 2, 3], [1, 3, 2], [3, 2, 1], [3, 1, 2]]
但我想知道在后臺實際發生了什么......我知道一個遞回函式會添加到一個堆疊中,直到它達到它的基本情況,然后在堆疊中向下作業以給你一個結果,然后一個生成器函式暫停計算它是第一個 yield 并回傳一個生成器,您必須回圈遍歷該生成器才能獲得每個 yield 的結果,但是我真的很困惑將兩者放在一起時會發生什么。
用除錯陳述句重寫函式
def _permutate(elems):
if len(elems) <= 1:
print(elems) # NEW
yield elems
else:
for i in range(len(elems)):
for perm in _permutate(elems[:i] elems[i 1:]):
print("NEW", [elems[i]], perm) # NEW
yield [elems[i]] perm
然后運行
gen = _permutate([1,2,3,4,5])
print('NEXT', next(gen))
print('NEXT', next(gen))
print('NEXT', next(gen))
print('NEXT', next(gen))
print('NEXT', next(gen))
print('NEXT', next(gen))
print('NEXT', next(gen))
更清楚地顯示了正在發生的事情:
[5]
NEW [4] [5]
NEW [3] [4, 5]
NEW [2] [3, 4, 5]
NEW [1] [2, 3, 4, 5]
NEXT [1, 2, 3, 4, 5]
[4]
NEW [5] [4]
NEW [3] [5, 4]
NEW [2] [3, 5, 4]
NEW [1] [2, 3, 5, 4]
NEXT [1, 2, 3, 5, 4]
[5]
NEW [3] [5]
NEW [4] [3, 5]
NEW [2] [4, 3, 5]
NEW [1] [2, 4, 3, 5]
NEXT [1, 2, 4, 3, 5]
[3]
NEW [5] [3]
NEW [4] [5, 3]
NEW [2] [4, 5, 3]
NEW [1] [2, 4, 5, 3]
NEXT [1, 2, 4, 5, 3]
[4]
NEW [3] [4]
NEW [5] [3, 4]
NEW [2] [5, 3, 4]
NEW [1] [2, 5, 3, 4]
NEXT [1, 2, 5, 3, 4]
[3]
NEW [4] [3]
NEW [5] [4, 3]
NEW [2] [5, 4, 3]
NEW [1] [2, 5, 4, 3]
NEXT [1, 2, 5, 4, 3]
[5]
NEW [4] [5]
NEW [2] [4, 5]
NEW [3] [2, 4, 5]
NEW [1] [3, 2, 4, 5]
NEXT [1, 3, 2, 4, 5]
Found an article 
uj5u.com熱心網友回復:
我做了一個實驗來說明生成器的流程是如何作業的:
def _permutate(elems):
if len(elems) <= 1:
print(elems) # NEW
yield elems
else:
for i in range(len(elems)):
for perm in _permutate(elems[:i] elems[i 1:]):
print([elems[i]] perm) # NEW
yield [elems[i]] perm
# NEW
gen = _permutate([1,2,3,4,5])
print('NEXT', next(gen))
print('NEXT', next(gen))
print('NEXT', next(gen))
print('NEXT', next(gen))
print('NEXT', next(gen))
print('NEXT', next(gen))
print('NEXT', next(gen))
輸出:
[5]
[4, 5]
[3, 4, 5]
[2, 3, 4, 5]
[1, 2, 3, 4, 5]
NEXT [1, 2, 3, 4, 5]
[4]
[5, 4]
[3, 5, 4]
[2, 3, 5, 4]
[1, 2, 3, 5, 4]
NEXT [1, 2, 3, 5, 4]
[5]
[3, 5]
[4, 3, 5]
[2, 4, 3, 5]
[1, 2, 4, 3, 5]
NEXT [1, 2, 4, 3, 5]
[3]
[5, 3]
[4, 5, 3]
[2, 4, 5, 3]
[1, 2, 4, 5, 3]
NEXT [1, 2, 4, 5, 3]
[4]
[3, 4]
[5, 3, 4]
[2, 5, 3, 4]
[1, 2, 5, 3, 4]
NEXT [1, 2, 5, 3, 4]
[3]
[4, 3]
[5, 4, 3]
[2, 5, 4, 3]
[1, 2, 5, 4, 3]
NEXT [1, 2, 5, 4, 3]
[5]
[4, 5]
[2, 4, 5]
[3, 2, 4, 5]
[1, 3, 2, 4, 5]
NEXT [1, 3, 2, 4, 5]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/359899.html
