[PYTHON] Eine Geschichte, die auf eine Vergleichsberechnung stieß

Als ich versuchte, die Codemenge zu reduzieren, indem ich sie mit dem Vergleichsoperator auf nette Weise schrieb, stolperte ich an einer unerwarteten Stelle, sodass ich sie als Memorandum belassen werde.

Umgebung

Zielgruppe

mich selber

Liste der Operatoren

Python verfügt über die folgenden Vergleichsoperatoren, die für bedingte Anweisungen wie Verzweigungen verwendet werden.

Operator Ergebnis
x < y True, wenn x kleiner als y ist
x <= y True, wenn x kleiner oder gleich y ist
x > y True, wenn x größer als y ist
x >= y True, wenn x größer oder gleich y ist
x == y True, wenn die Werte von x und y gleich sind
x != y True, wenn x- und y-Werte nicht gleich sind
x is y True, wenn x und y dasselbe Objekt sind
x is not y True, wenn x und y nicht dasselbe Objekt sind
x in y True, wenn x in y enthalten ist
x not in y True, wenn x nicht in y enthalten ist

Es gibt andere logische Operatoren wie die folgenden, und es ist möglich, eine bedingte Anweisung mit einem hohen Freiheitsgrad zu erstellen, indem diese kombiniert werden.

Operator Ergebnis
x and y Gibt y zurück, wenn x True ist und y auch True ist. Gibt x zurück, wenn x False ist
x or y Gibt x zurück, wenn x True ist. Gibt y zurück, wenn x False ist
not x Gibt False zurück, wenn x True ist, True, wenn x False ist

So überprüfen Sie, ob das Ergebnis eines logischen Operators gültig ist

Im Fall von "und" und "oder" ist es wichtig, ob die linke Seite wahr oder falsch ist. Sie können dies leicht mit bool überprüfen.

bool Natürlich geben True und False das gleiche Ergebnis zurück.

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

Numerischer Wert

Beim numerischen Typ wird True mit Ausnahme von 0 zurückgegeben.

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

String

Der Zeichenfolgentyp ist True, wenn das Zeichen vorhanden ist.

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

Beachten Sie, dass dies nicht angezeigt wird, wenn eine ** Instanz von str ** erstellt wurde.

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

None Keiner wird auch als falsch behandelt.

>>> bool(None)
False

Array

Das Array gibt True zurück, wenn ein oder mehrere Elemente vorhanden sind.

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

Stolperpunkt

Wie wir gesehen haben, ist es ziemlich einfach, aber die Einschränkung ist, dass ** Elemente nicht immer True zurückgeben, wenn sie existieren **.

Bevor ich erkläre, was es bedeutet, habe ich die Bedingungen, um falsch zu werden, unten zusammengefasst.

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

Soweit ich das sehen kann, scheint es falsch zu sein, wenn es keinen Inhalt gibt.

Also habe ich den folgenden Code ausgeführt.

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

** Regentag Fehler! ** ** ** Was ich persönlich tun wollte, ist, dass es eine Funktion gibt, die ein ndarray erzeugt, wenn der bedingte Ausdruck (fuga) wahr ist, und eine andere Funktion bestimmt, ob hoge erzeugt wird und es entweder regeneriert oder so lässt, wie es ist Ich wollte es benutzen.

Als Lösung habe ich None als Kriterium verwendet, anstatt zu überprüfen, ob eine Instanz erstellt wurde.

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

In diesem Fall wird hoge jedoch zurückgegeben, auch wenn in hoge etwas anderes als ndarray generiert wird. Wenn Sie es also auf ndarray beschränken möchten, müssen Sie dies berücksichtigen ...

Nachtrag (2020/3/10)

Es gibt eine integrierte Funktion namens "isinstance", mit der Sie überprüfen können, ob der Inhalt von hoge ndarray ist. Sie können ihn also mithilfe dieser Funktion überprüfen.

>>> 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]

Plaudern

Ich war überrascht, dass False zurückgegeben wurde, als die externe Bibliothek von Bool beurteilt wurde. Nun, ich kann nicht gut versuchen, seltsam zu schreiben ... Mir ist klar, dass ich immer noch nicht genug Wissen habe, um es zu meistern, aber ich möchte mich jeden Tag widmen, ohne entmutigt zu werden (・ ∀ ・)

Referenz

Wie man eine bedingte Verzweigung mit einer if-Anweisung in Python schreibt

Recommended Posts

Eine Geschichte, die auf eine Vergleichsberechnung stieß
Stolpern Geschichte über die Installation von Matplotlib
Eine Geschichte, die den Aufwand für Betrieb / Wartung reduziert
Die Geschichte, ein Paket zu erstellen, das den Betrieb von Juman (Juman ++) & KNP beschleunigt
Ein Memo, auf das ich gestoßen bin, als ich ein Zitat RT auf Twitter Bot gemacht habe
Eine Geschichte, die Seaborn einfach, bequem und beeindruckt war
Die Geschichte, eine harte Zeit mit der gemeinsamen Menge HTTP_PROXY = ~ zu haben
Ich bin auf MoviePy gestoßen, machen Sie sich also eine Notiz
Eine Geschichte, von der ich bei np.where süchtig war
Eine Geschichte, die die Lieferung von Nico Nama analysierte.
Eine Geschichte, die mein Herz nach dem Upgrade von OpenStack gestoppt hat
Eine Geschichte, die schrecklich war, wenn SELinux richtig deaktiviert war
Ein Fehler, der beim Erlernen von YOLO mit Google Colab aufgetreten ist
[Python] Eine Geschichte, die in eine Rundungsfalle zu geraten schien