2017-10-08 2 views
-3

J'essaie de comprendre quand devrait-on utiliser la compréhension de la liste. beaucoup de temps, c'est pratique et économisez des lignes. Mais parfois, cela ne fonctionne pas comme prévu?Python liste compréhension transformer

si j'ai:

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

je peux utiliser une boucle

for i in listA: 
    print(i) 

évidemment, cela me donnera:

1 
2 
3 
4 

si je tente:

print(i for i in listA) 

mais cela ne me donnera pas le même résultat?

<generator object <genexpr> at 0x102a3b3b8> 

Comment dois-je comprendre cela?

Ma question supplémentaire est: Si j'ai une boucle for suivie d'une ligne de codes, peut-on toujours l'écrire d'une certaine manière en utilisant la compréhension?

Répondre

1

Vous n'avez pas de compréhension de liste. Vous avez transmis une expression de générateur à print(). La fonction print() ne parcourt pas les arguments que vous passez; il envoie seulement la conversion str() à stdout.

Si vous voulez envoyer toutes les valeurs dans le générateur à print(), utilisez *(...):

print(*(i for i in listA)) 

Ici c'est surpuissant, vous pouvez simplement faire la même chose pour les valeurs listA:

print(*listA) 

Les deux imprimeront les valeurs avec le séparateur par défaut, un espace. Si vous voulez avoir des nouvelles lignes, dites print() utiliser \n comme séparateur:

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

Et non, pas chaque boucle for est apte à être convertie en une compréhension de liste. Une compréhension de liste crée un nouvel objet de liste, et pas toutes les listes de construction de boucles.

Si vous avez une liste de la forme:

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

alors vous pouvez le convertir à une compréhension de la liste:

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

Vous pouvez effectuer les opérations suivantes:

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

Un générateur est un objet pouvant être itéré. Ce n'est pas destiné à être imprimé.

Liste compréhensions se présentent sous deux formes, avec et sans parenthèses:

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

Le premier produit un objet iterator tandis que l'autre produit une liste réelle.

Pour votre problème, vous pouvez faire:

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

En général, il faut éviter la liste compréhensions quand ils font le code obscur. Pourquoi ne pas utiliser une boucle simple?