web-dev-qa-db-fra.com

Lambda Python avec soulignement pour une dispute?

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é.

69
laycat

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
113
user1907906

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.

6
Łukasz Rogalski

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.

6
miku

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 ..)

4
hyades

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
3
haccks

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 defsf 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.

2
IdleCustard