Que fait le code suivant?
a = lambda _:True
D'après ce que j'ai lu et testé dans l'invite interactive, il semble que ce soit une fonction qui renvoie toujours True
.
Est-ce que je comprends bien? J'espère comprendre pourquoi un trait de soulignement (_
) a également été utilisé.
Le _
est le nom de la variable. Essayez-le (Ce nom de variable est généralement le nom d'une variable ignorée. Un espace réservé pour ainsi dire.)
Python:
>>> l = lambda _: True
>>> l()
<lambda>() missing 1 required positional argument: '_'
>>> l("foo")
True
Donc, ce lambda nécessite un argument. Si vous voulez un lambda sans argument qui retourne toujours True
, procédez comme suit:
>>> m = lambda: True
>>> m()
True
Le trait de soulignement est une convention Python pour nommer une variable inutilisée (par exemple, les outils d'analyse statiques ne la signalent pas comme une variable inutilisée). Dans votre cas, l'argument lambda est inutilisé, mais l'objet créé est une fonction à argument unique qui retourne toujours True
. Votre lambda est donc quelque peu analogue à fonction constante en maths.
il semble que ce soit une fonction qui retourne True malgré tout.
Oui, c'est une fonction (ou lambda) qui renvoie True. Le nderscore , qui est généralement un espace réservé pour une variable ignorée, est inutile dans ce cas.
Un exemple d'utilisation pour une telle fonction (qui ne fait presque rien):
dd = collections.defaultdict(lambda: True)
Lorsqu'il est utilisé comme argument de defaultdict , vous pouvez utiliser True
comme valeur par défaut générale.
Lambda signifie une fonction. La déclaration ci-dessus est identique à l'écriture
def f(_):
return True
Pour lambda, une variable doit être présente. Donc, vous passez une variable appelée _
(Vous pouvez également passer x
, y
..)
Souligner _
est un identifiant valide et est utilisé ici comme nom de variable. Il retournera toujours True
pour l'argument transmis à la fonction.
>>>a('123')
True
Ci-dessous la ligne de code en question:
a = lambda _:True
Il crée une fonction ayant un paramètre d'entrée: _
. Le soulignement est un choix assez étrange de nom de variable, mais ce n'est qu'un nom de variable. Vous pouvez utiliser _
N'importe où, même lorsque vous n'utilisez pas les fonctions lambda. Par exemple, au lieu de ...
my_var = 5
print(my_var)
Vous pouvez écrire:
_ = 5
print(_)
Cependant, il y avait une raison pour laquelle _
A été utilisé comme nom de paramètre plutôt que quelque chose comme x
ou input
. Nous y reviendrons dans un instant.
Premièrement, nous devons savoir que le mot-clé lambda construit une fonction similaire à def
, mais avec une syntaxe différente. La définition de la fonction lambda, a = lambda _:True
, Est similaire à l'écriture:
def a(_):
return True
Il crée une fonction nommée a
avec un paramètre d'entrée _
Et renvoie True
. On aurait tout aussi bien pu écrire a = lambda x:True
, Avec un x
au lieu d'un trait de soulignement. Cependant, la convention est d'utiliser _
Comme nom de variable lorsque nous n'avons pas l'intention d'utiliser cette variable. Considérer ce qui suit:
for _ in range(1, 11):
print('pear')
Notez que l'index de boucle n'est jamais utilisé à l'intérieur du corps de la boucle. Nous voulons simplement que la boucle s'exécute un nombre de fois spécifié. Comme winklerrr
l'a écrit, "le nom de la variable _
Est [...] comme une" variable jetable ", juste un espace réservé qui ne sert à rien."
De même, avec `` a = lambda x: True, le paramètre d'entrée n'est pas utilisé dans le corps de la fonction. L'argument d'entrée est sans importance, tant qu'il y en a un. L'auteur de cette fonction lambda a écrit _
Au lieu de quelque chose comme x
, pour indiquer que la variable ne serait pas utilisée.
Notez que les lambda ne ont un argument; Alors, écrit
a()
, générera une erreur.
Si vous voulez un lambda sans argument, écrivez quelque chose comme ceci:
bar = lambda: True
Maintenant, appeler bar()
, sans argument, fonctionnera parfaitement. Un lambda qui ne prend aucun argument ne doit pas toujours renvoyer la même valeur:
import random
process_fruit = lambda : random.random()
La fonction lambda ci-dessus est plus complexe que juste quelque chose qui retourne toujours la même constante.
Une raison pour laquelle les programmeurs utilisent parfois le mot-clé lambda
au lieu de def
est destinée à des fonctions particulièrement courtes et simples. Notez qu'une définition de lambda
peut généralement tenir sur une seule ligne, alors qu'il est difficile de faire la même chose avec une instruction def. Une autre raison d'utiliser lambda
au lieu de def
sf lorsque la fonction ne sera plus utilisée. Si nous ne voulons pas rappeler la fonction ultérieurement, il n'est pas nécessaire de lui attribuer un nom. Par exemple, considérons le code suivant:
def apply_to_each (transform, in_container): out_container = list () pour idx, élément dans énumération (conteneur, 0): out_container [idx] = transformation (élément) return out_container
Nous passons maintenant l'appel suivant:
squares = apply_to_each(lambda x: x**2 range(0, 101))
Notez que lambda x: x**2
N’est pas étiqueté. C'est parce que nous ne l'appellerons probablement pas plus tard, c'était juste quelque chose de court et simple dont nous avions besoin temporairement.
Le fait qu'il n'est pas nécessaire d'attribuer un nom aux fonctions lambda est la source d'un autre nom pour les décrire: "fonctions anonymes".
Notez également que les instructions lambda sont comme un appel de fonction dans la mesure où elles renvoient une référence à la fonction qu'elles créent. Ce qui suit est illégal:
apply_to_each(def foo(x): x**2 , range(0, 101))
Alors que apply_to_each(lambda x: x**2 range(0, 101))
va très bien.
Donc, nous utilisons lambda
au lieu de def
et _
Au lieu d'un nom de variable long lorsque nous voulons quelque chose de court, doux et que nous ne voudrons probablement plus utiliser plus tard.