2017-06-20 68 views
1

我有一個發電機功能,產生列表的功率集。我在裏面放了一些打印語句,但是當我運行這個項目時,他們都沒有打印任何東西。如果我編寫一個只打印「測試」的函數,它可以工作。有人可以幫忙嗎?發電機功能不工作python

def powerSet(items): 
    print 'test' 
    N = len(items) 
    print N 
    for i in range(2**N): 
     combo = [] 
     for j in range(N): 
      if (i >> j) % 2 == 1: 
       combo.append(items[j]) 
     print combo 
     yield combo 

list = ['a', 'b', 'c'] 
powerSet(list) 
+0

迭代powerSet(list) – haifzhan

+3

在你自己的代碼中使用像'list'這樣的內建名稱作爲變量是一個非常糟糕的主意。像這樣消耗一個生成器的自然方式是'list(generator(whatever))',但是因爲你已經反彈了名字'list',那實際上並不能正常工作。 – Blckknght

回答

1
powerSet(list) 

這將返回發電機,而不是一系列值。爲了獲取值,我想你想的東西像下面的理解:

>>> powerSet(list) 
<generator object powerSet at 0x7f486b44ab90> 
>>> [p for p in powerSet(list)] 
test 
3 
[] 
['a'] 
['b'] 
['a', 'b'] 
['c'] 
['a', 'c'] 
['b', 'c'] 
['a', 'b', 'c'] 
[[], ['a'], ['b'], ['a', 'b'], ['c'], ['a', 'c'], ['b', 'c'], ['a', 'b', 'c']] 
1

發電機需要反覆如此,就可以產生自己的價值觀:

def powerSet(items): 
    N = len(items) 
    for i in range(2**N): 
     combo = [] 
     for j in range(N): 
      if (i >> j) % 2 == 1: 
       combo.append(items[j]) 
     yield combo 

list = ['a', 'b', 'c'] 
for x in powerSet(list): 
    print(x) 
1

做這樣的事情:

def powerSet(items): 
    N = len(items) 
    for i in range(2**N): 
     for j in range(N): 
      if (i >> j) % 2 == 1 
       yield items[j] 

>>> list(powerSet(['a', 'b', 'c'])) 
['a', 'b', 'a', 'b', 'c', 'a', 'c', 'b', 'c', 'a', 'b', 'c'] 

或者,如果你需要一個細分電子郵件元素:

def powerSet(items): 
    N = len(items) 
    for i in range(2**N): 
     combo = [] 
     for j in range(N): 
      if (i >> j) % 2 == 1: 
       combo.append(items[j]) 
     yield combo 

>>> list(powerSet(['a', 'b', 'c'])) 
[[], ['a'], ['b'], ['a', 'b'], ['c'], ['a', 'c'], ['b', 'c'], ['a', 'b', 'c']]