web-dev-qa-db-fra.com

Python boucle pour l'intérieur de lambda

Dans mon code, je dois simplifier autant que possible ma ligne de code. EDIT: Je pense que je ne suis pas assez clair - il doit s'agir d'une seule ligne de code. J'ai besoin de mettre une boucle for dans une expression lambda, quelque chose comme ça:

x = lambda x: (for i in x : print i)

Je ne sais tout simplement pas comment y arriver. Merci!

11
Fernando Retimo

Étant donné qu'une boucle for est une instruction (tout comme print, dans Python 2.x), vous ne pouvez pas l'inclure dans une expression lambda. Au lieu de cela, vous besoin d'utiliser la méthode write sur sys.stdout avec la méthode join.

x = lambda x: sys.stdout.write("\n".join(x) + "\n")
14
chepner

Pour ajouter à la réponse de chepner pour Python 3.0, vous pouvez également faire:

x = lambda x: list(map(print, x))

Bien sûr, ce n'est que si vous avez les moyens d'utiliser Python> 3 à l'avenir ... semble un peu plus propre à mon avis, mais il a également une valeur de retour étrange, mais vous ' re le jetant probablement de toute façon.

Je vais juste laisser ceci ici pour référence.

6
Dair

Juste au cas où, si quelqu'un cherche un problème similaire ...

La plupart des solutions présentées ici sont sur une seule ligne et sont assez lisibles et simples. Je voulais juste en ajouter un de plus qui ne nécessite pas l'utilisation de lambda (je suppose que vous essayez d'utiliser lambda juste pour en faire un code d'une ligne). Au lieu de cela, vous pouvez utiliser une simple compréhension de liste.

[print(i) for i in x]

BTW, les valeurs de retour seront une liste sur Aucun s.

6
Vikas

les réponses d'Anon et de Chepner sont sur la bonne voie. Python 3.x a une fonction d'impression et c'est ce dont vous aurez besoin si vous souhaitez incorporer l'impression dans une fonction (et, a fortiori, lambdas).

Cependant, vous pouvez obtenir la fonction d'impression très facilement dans python 2.x en important depuis le futur module de la bibliothèque standard. Check it out:

>>>from __future__ import print_function
>>>
>>>iterable = ["a","b","c"]
>>>map(print, iterable)
a
b
c
[None, None, None]
>>>

Je suppose que cela semble un peu bizarre, alors n'hésitez pas à affecter le retour à _ si vous souhaitez supprimer la sortie de [None, None, None] (vous êtes intéressé par les effets secondaires uniquement, je suppose):

>>>_ = map(print, iterable)
a
b
c
>>>
2
Moradology

Si vous êtes comme moi, vous voulez juste imprimer une séquence dans un lambda, sans obtenir la valeur de retour (liste de None).

x = range(3)
from __future__ import print_function           # if not python 3
pra = lambda seq=x: map(print,seq) and None     # pra for 'print all'
pra()
pra('abc')
1
qeatzy