2017-06-20 5 views
1

Ich habe eine Generatorfunktion, die die Leistung einer Liste ergibt. Ich habe ein paar Print-Statements drin, aber wenn ich das Projekt leite, druckt keiner von ihnen etwas. Wenn ich eine Funktion schreibe, die nur 'test' druckt, funktioniert es aber. Könnte jemand bitte helfen?Generator Funktion funktioniert nicht 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

Iterierte powerSet (Liste) – haifzhan

+3

Es ist eine sehr schlechte Idee, den Namen eines eingebauten Namens wie 'list' als Variable in Ihrem eigenen Code zu verwenden. Der natürliche Weg, einen Generator wie diesen zu konsumieren, wäre 'list (generator (was auch immer))', aber da du den Namen 'list' zurückgestuft hast, wird das nicht richtig funktionieren. – Blckknght

Antwort

1
powerSet(list) 

Dies gibt den Generator, nicht auf die Reihe von Werten. Um die Werte zu bekommen, ich glaube, Sie so etwas wie das Verständnis wollen unter:

>>> 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

Generatoren erfordern Iteration so würden ihre Werte generiert werden:

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

etwas tun wie folgt aus:

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'] 

Oder, wenn Sie ein groupped Elemente benötigen:

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']] 
Verwandte Themen