Je vois des questions si souvent, il devrait y avoir une réponse ultime à tous, ce qui déclenche automatiquement chaque fois que print
et None
sont tous deux présents dans une seule question ...
Alors que la réponse à la question lui-même est trivial, ce que, je pense, vous devez vraiment comprendre est une différence entre un side effect et un valeur de retour. Par exemple:
a = 10
def three(x):
global a
a += x #side effect
print x #side effect
return 3 #returning
La valeur nos three()
de retour de la fonction est 3. Il a également deux effets secondaires: la modification d'une variable globale a
et l'impression. Ceux-ci sont appelés effets secondaires car ils modifient quelque chose en dehors de la fonction: la variable a
et l'état de l'écran, respectivement.
Dans votre exemple:
def print0(s):
print s
il n'y a pas de valeur de retour explicite, seul un effet secondaire (impression). En d'autres termes, il imprime quelque chose sur l'écran, puis ne renvoie rien. Ce rien est appelé None
en Python. Si vous l'appelez comme ceci:
a = print0(3)
il imprime 3 dans la console. Mais quelle est la valeur de a
maintenant?
>>> print a
None
Maintenant à la compréhension de la liste. C'est un concept emprunté à la programmation fonctionnelle (Lisp, etc.) où il s'appelle map
. Il y a encore la fonction map
en Python, de sorte que les deux lignes suivantes sont équivalentes:
[print0(s) for s in seqs]
map(print0, seqs)
Ce qu'ils font tous les deux est de prendre les éléments de la liste d'entrée (seqs
), un par un, en appliquant la fonction (print0
) à chaque d'entre eux et de mettre les résultats (valeurs de retour), un par un, dans la liste de sortie, qu'ils reviennent. Chaque fois qu'ils appellent votre print0
fonction, il affiche son argument s
sur l'écran (un effet secondaire) et ne renvoie rien (None
), qui est mis dans la liste de sortie par la compréhension de la liste ou map
. Si vous le faites dans la console interactive Python, ce résultat apparaît dans la sortie ([None, None]
), sinon - il est toujours produit par l'interpréteur et immédiatement rejeté, sauf si vous le passez en argument à une autre instruction. Ce qui nous amène à votre dernière ligne de code et le message TypeError
. Vous passez votre fonction à une autre fonction, qui attend une chaîne, elle ne se soucie pas des effets secondaires que votre fonction peut produire.Le contexte est pas tout à fait clair pour moi, mais vous devriez probablement définir votre fonction comme ceci:
def print0(s):
return str(s)
Maintenant, au lieu d'imprimer s
à l'écran, il convertit en string
puis retours il. Notez que si vous les appelez à l'intérieur de l'interpréteur interactif tout comme print0(s)
, il semble qu'ils produisent le même effet, ce qui peut être déroutant. Cependant, si vous faites a = print0(s)
, vous verrez que a
est différent. Dans certaines langues, la dernière valeur calculée devient automatiquement la valeur de retour, mais avec Python qui est pas le cas pour les fonctions régulières:
def times_three(x):
x*3
retours None
. Cependant, il y a aussi lambda-fonctions, pour lesquelles cette est le cas:
times_three = lambda x: x*3
times_three(5) #returns 15
. .. Parce que vous ne renvoyez rien ... –
les deux extraits sont sémantiquement différents: l'un est juste une boucle for-avec une instruction d'impression tandis que l'autre, vous créez une liste avec la compréhension de liste en utilisant une fonction qui ne renvoie rien (aucun –
En plus de ce qui a été proposé dans les réponses, si vous ne voulez pas voir les 'None's, rejeter la valeur de l'expression:' _ = [print0 (s) for s in seqs] '. – DyZ