51 votes

pourquoi python `any` renvoie-t-il un booléen au lieu de la valeur

and et or renvoie le dernier élément évalué, mais pourquoi ne pas Python fonction intégrée any?

Je veux dire, c'est assez facile à mettre en œuvre soi-même comme cela, mais je suis toujours à gauche de vous demander pourquoi.

def any(l):
    for x in l:
        if x:
            return x
    return x

edit:

Pour ajouter à la réponse ci-dessous, voici une véritable citation de la même liste de diffusion de ye puissant empereur sur la question:

Si retourne toujours Vrai et le Faux ou le premier faling / passage élément? J'ai joué avec ça aussi avant les blogs, et réalisé que l' fin de cas (si la séquence est vide ou si tous les éléments ne passent pas le test) ne peut jamais être mis en oeuvre satisfaisante: la cueillette Aucune ne se sent bizarre si l'argument est un objet iterable de booléens, et de la cueillette Faux se sent bizarre si l'argument est un objet iterable non bool objets.

Guido van Rossum (page d'accueil: http://www.python.org/~guido/)

49voto

Steven Rumbalski Points 16838

Cette question est venue sur le Python du développeur de la liste de diffusion en 2005, lorsque Guido Van Rossum a proposé l'ajout d' any et all pour Python 2.5.

Le projet de loi Janssen a demandé qu'ils soient mis en œuvre comme

def any(S):
    for x in S:
        if x:
            return x
    return S[-1]

def all(S):
    for x in S:
        if not x:
            return x
    return S[-1]

Raymond Hettinger, qui en any et all, ont répondu abordant spécifiquement pourquoi any et all n'agissons pas comme and et or:

Au fil du temps, j'ai reçu des commentaires au sujet de ces et d'autres itertools recettes. Personne n'a contesté le Vrai/Faux les valeurs de retour dans les recettes ou dans Guido version.

Guido de version correspond à la normale de l'attente de tout être un prédicat. Aussi, il évite le genre d'erreurs/de la confusion que les gens actuellement l'expérience avec Python unique de mise en œuvre de "et" et "ou".

De retour le dernier élément n'est pas mal, c'est juste bizarre, inattendu, et non évidente. Résister à l'envie d'être délicat avec celui-ci.

La liste de diffusion en grande partie de cet avis, en laissant la mise en œuvre tel que vous le voyez aujourd'hui.

22voto

Weeble Points 6248

and et or peut être avantageusement définie d'une manière qui ils toujours le retour de l'un de leurs opérandes. Toutefois, any et all ne peut raisonnablement être définies toujours pour renvoyer une valeur à partir de leur séquence d'entrée: plus précisément, ils ne peuvent pas le faire lorsque la liste est vide. Les deux any et all actuellement, qui ont un résultat défini dans cette situation: any renvoie la valeur False et all renvoie la valeur True. Vous serez forcé de parfois de renvoyer une valeur booléenne et parfois retourne un élément de la séquence, ce qui le rend désagréable et surprenant de l'interface. Beaucoup mieux d'être simple et cohérente.

5voto

Ned Batchelder Points 128913

J'ai posé cette même question sur le langage python-idées, et a dit que la raison était que pour tout() et tous les() retourner la valeur lorsque la séquence est vide, et que ces valeurs doivent être Faux et Vrai. Cela semble être un argument faible pour moi.

Les fonctions ne peuvent pas changer maintenant, mais je pense qu'ils seraient plus utile et mieux analogues de l' and et or des opérateurs qu'ils généraliser, si ils sont retournés à la première vraie-ish ou de faux-ish valeur qu'ils ont rencontrés.

3voto

agf Points 45052

Le comportement de l' and et or existe pour des raisons historiques.

Avant de Python avait un ternaire / fonctionnement de l'expression conditionnelle, vous avez utilisé and et or si vous souhaitez utiliser une valeur sur une condition. Une telle expression peut être réécrit avec l'expression conditionnelle de la syntaxe:

true_val if condition else false_val

Essentiellement, ils sont surchargés avec deux fonctions, et pour des raisons de compatibilité, ils n'ont pas été modifiés.

C'est pas une raison pour surcharger les autres opérations. any semble comme il devrait vous dire si oui ou non une condition est vraie pour tout élément, qui est un booléen, donc il doit retourner un bool.

0voto

cmh Points 4290

Any renvoie un booléen, car il traite efficacement son argument est une liste de booléens avant d'examiner si l'une d'entre eux sont de vrai. C' est le retour de l'élément qu'il évalue, mais cela arrive à être un bool.

Quand vous voulez utiliser votre version d' any? Si c'est sur une liste de booléens alors que vous avez déjà la réponse correcte. Sinon vous êtes juste de protection contre l' None et peut être exprimée comme:

filter(lambda x: x != None, l)[0]

ou:

[x for x in l if x != None][0]

Qui est plus une déclaration d'intention.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X