Une histoire qui a trébuché sur un calcul de comparaison

Quand j'ai essayé de réduire la quantité de code en l'écrivant de manière agréable à l'aide de l'opérateur de comparaison, je suis tombé dans un endroit inattendu, je vais donc le laisser comme un mémorandum.

environnement

Public cible

moi même

Liste des opérateurs

python a les opérateurs de comparaison suivants, qui sont utilisés pour les instructions conditionnelles telles que le branchement.

opérateur résultat
x < y Vrai si x est inférieur à y
x <= y Vrai si x est inférieur ou égal à y
x > y Vrai si x est supérieur à y
x >= y Vrai si x est supérieur ou égal à y
x == y Vrai si les valeurs de x et y sont égales
x != y Vrai si les valeurs x et y ne sont pas égales
x is y Vrai si x et y sont le même objet
x is not y Vrai si x et y ne sont pas le même objet
x in y Vrai si x est contenu dans y
x not in y Vrai si x n'est pas inclus dans y

Il existe d'autres opérateurs logiques tels que les suivants, et il est possible de créer une instruction conditionnelle avec un degré élevé de liberté en les combinant.

opérateur résultat
x and y Renvoie y lorsque x est vrai et y est également vrai. Renvoie x lorsque x est faux
x or y Renvoie x lorsque x est vrai. Renvoie y lorsque x est faux
not x Renvoie False si x est True, True si x est False

Comment vérifier si le résultat d'un opérateur logique est valide

Dans le cas de «et» ou «ou», il est important que le côté gauche soit vrai ou faux. Vous pouvez facilement vérifier cela avec bool.

bool Bien sûr, True et False renverront le même résultat.

>>> bool(True)
True
>>> bool(False)
False

Valeur numérique

Dans le cas du type numérique, True est renvoyé à l'exception de 0.

>>> bool(1)
True
>>> bool(0)
False
>>> bool(-1)
True
>>> bool(0.5)
True
>>> bool(1j)
True
>>> bool(0j)
False
>>> bool(-1j)
True

Chaîne

Le type de chaîne est True si le caractère est présent.

>>> bool('')
False
>>> bool('hoge')
True
>>> bool(' ')
True

Notez que cela ne cherche pas si une ** instance de str a été créée **.

>>> type('')
<class 'str'>

None Aucun n'est également traité comme faux.

>>> bool(None)
False

Tableau

Le tableau renvoie True lorsqu'il y a un ou plusieurs éléments.

>>> bool([])
False
>>> bool([""])
True
>>> bool([None])
True

Point de trébuchement

Comme nous l'avons vu, c'est assez facile, mais la mise en garde est que ** les éléments ne renvoient pas toujours True lorsqu'ils existent **.

Avant d'expliquer ce que cela signifie, j'ai résumé ci-dessous les conditions pour devenir Faux.

>>> bool(False)
False
>>> bool(0)
False
>>> bool('')
False
>>> bool(None)
False
>>> bool([])
False

Pour autant que je puisse voir cela, s'il n'y a pas de contenu, il est probable que ce soit faux.

J'ai donc exécuté le code suivant.

>>> import numpy as np
>>> hoge = None
>>> fuga = True
>>> if fuga:
...     hoge = np.arange(10)
>>> bazz = hoge if hoge else list(range(10))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

** Erreur de jour de pluie! ** ** Ce que je voulais personnellement faire, c'est qu'il y ait une fonction qui génère un ndarray lorsque l'expression conditionnelle (fuga) est True, et une autre fonction détermine si hoge est généré et le régénère ou le laisse tel quel. Je voulais l'utiliser.

En guise de solution, j'ai utilisé Aucun comme critère au lieu de vérifier si une instance a été créée.

>>> import numpy as np
>>> hoge = None
>>> fuga = True
>>> if fuga:
...     hoge = np.arange(10)
>>> bazz = hoge if hoge is not None else list(range(10))
>>> bazz
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

Cependant, dans ce cas, hoge est retourné même si quelque chose d'autre que ndarray est généré dans hoge, donc si vous voulez le limiter à ndarray, vous devez le considérer ...

Postscript (10/03/2020)

Il existe une fonction intégrée appelée ʻis instance` pour vérifier si le contenu de hoge est ndarray, donc vous pouvez vérifier en l'utilisant.

>>> hoge = np.arange(10)
>>> hoge
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>
>>> isinstance(hoge, np.ndarray)
True
>>>
>>> hoge = None
>>> fuga = True
>>> if fuga:
...     hoge = np.arange(10)
...
>>>
>>> bazz = hoge if isinstance(hoge, np.ndarray) else list(range(10))
>>> bazz
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>
>>> bazz = hoge if isinstance(hoge, list) else list(range(10))
>>> bazz
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Bavarder

J'ai été surpris que False soit retourné lorsque la bibliothèque externe a été jugée par bool. Eh bien, je ne suis pas doué pour essayer d'écrire étrangement ... J'ai bien conscience que je n'ai pas assez de connaissances pour le maîtriser, mais je veux me consacrer chaque jour sans me décourager (・ ∀ ・)

référence

Comment écrire une branche conditionnelle par instruction if en Python

Recommended Posts

Une histoire qui a trébuché sur un calcul de comparaison
Histoire de trébucher sur l'installation de matplotlib
Une histoire qui réduit l'effort de fonctionnement / maintenance
L'histoire de la création d'un package qui accélère le fonctionnement de Juman (Juman ++) & KNP
Un mémo sur lequel je suis tombé par hasard en faisant une citation RT sur Twitter Bot
Une histoire que Seaborn était facile, pratique et impressionnée
Une histoire qui a eu du mal avec l'ensemble commun HTTP_PROXY = ~
Je suis tombé sur l'utilisation de MoviePy, alors prenez note
Une histoire à laquelle j'étais accro chez np.where
Une histoire qui a analysé la livraison de Nico Nama.
Une histoire qui a arrêté mon cœur après la mise à niveau d'OpenStack
Une histoire qui était terrible si SELinux était correctement désactivé
Une erreur survenue lors de l'apprentissage de YOLO avec Google Colab
[Python] Une histoire qui semblait tomber dans un piège à contourner