2017-10-08 5 views
-3

Ich versuche zu verstehen, wann sollte man Listenverständnis verwenden. viel Zeit, es ist bequem und speichern Sie Zeilen. Aber manchmal funktioniert es nicht wie erwartet?Python Liste Verständnis transform

wenn ich:

listA = ['1', '2', '3', '4'] 

ich eine for-Schleife verwenden können

for i in listA: 
    print(i) 

offensichtlich dies gibt mir:

1 
2 
3 
4 

was ist, wenn ich versuche:

print(i for i in listA) 

aber das wird mir nicht das gleiche Ergebnis geben?

<generator object <genexpr> at 0x102a3b3b8> 

Wie soll ich das verstehen?

Meine zusätzliche Frage ist: Wenn ich eine for-Schleife gefolgt von einer Zeile von Codes habe, kann man es immer auf eine Weise schreiben mit Verständnis?

Antwort

1

Sie haben kein Listenverständnis. Sie haben einen Generatorausdruck an print() übergeben. Die Funktion print() iteriert nicht über Argumente, die Sie übergeben; es sendet nur die str() Umwandlung zu stdout.

Wenn Sie alle Werte im Generator zu print() schicken wollen, verwenden *(...):

print(*(i for i in listA)) 

Hier, das ist übertrieben, man konnte nur in listA für die Werte gleich tun:

print(*listA) 

Beide werden die Werte mit dem Standardtrennzeichen, einem Leerzeichen, ausgeben. Wenn Sie wollten Zeilenumbrüche haben, sagen print()\n als Trennzeichen zu verwenden:

print(*(i for i in listA), sep='\n') 
print(*listA, sep='\n') 

Und nein, nicht jede for Schleife ist geeignet, um eine Liste Verständnis umgewandelt zu werden. Ein Listenverständnis erstellt ein neues Listenobjekt, und nicht alle Loops erstellen Listen.

Wenn Sie eine Liste der Form haben:

some_name = [] 
for <target> in <iterable>: 
    some_name.append(<expression>) 

dann können Sie das auf eine Liste Verständnis umwandeln:

some_name = [<expression> for <target> in <iterable>] 
0

Sie tun können, die folgenden:

listA = ['1', '2', '3', '4'] 
# option 1 
print(*listA, sep='\n') 
# option 2 
for p in listA: print (p) 
1

Ein Generator ist ein Objekt, über das iteriert werden kann. Es ist nicht beabsichtigt, gedruckt zu werden.

Liste Comprehensions kommt in zwei Formen, mit und ohne Klammern:

print(i for i in listA) 
print([i for i in listA]) 

Die erste erzeugt ein Iterator-Objekt, während die andere eine aktuelle Liste erzeugt.

Für Ihr Problem, das Sie tun können:

print(*listA, sep='\n') 

Im Allgemeinen Listenkomprehensionen sollte vermieden werden, wenn sie Code dunkel machen. Warum nicht eine einfache for-Schleife verwenden?