Die Geschichte von Python und die Geschichte von NaN

Adventskalender der Universität Kinki 2019, Tag 10 Ich war sehr überrascht, dass der Adventskalender, den ich mit einem leichten Gefühl begann, den ganzen Tag gefüllt war. Ich bin allen Beteiligten sehr dankbar, danke.

In diesem Artikel zeige ich Ihnen, was ich mit Python gemacht habe. Außerdem werde ich das verlassen, was ich recherchiert habe, als ich von NaN abhängig war. Ich möchte auf mich selbst zurückblicken und andererseits Lehrer werden.

== und ist

Nachdem sich ein Bekannter an Python gewöhnt hatte und versuchte, im pythonischen Stil zu schreiben, sagte er: "In Python ist es modischer, die Gleichwertigkeit mit" ist "zu beurteilen!", Und ich habe alle "==" durch "ist" ersetzt. .. Dann scheint es richtig zu funktionieren, aber ...

== Verhaltensunterschied zwischen ist und ist == bestimmt, ob die Werte gleich sind is bestimmt, ob die Objekt-IDs gleich sind

Selbst wenn die Python-Zeichenfolgen und -Listen denselben Wert haben, kann die Objekt-ID unterschiedlich sein. (Ich habe das Gefühl, dass die Zeichenkette bei der Eingabe von Japanisch mit "ist" seltsam ist.) Wenn Sie also mit "ist" urteilen, wird "Falsch" zurückgegeben, auch wenn der Wert derselbe ist, und Sie werden süchtig danach.

left = "Python"
# ==Beurteilung
left == "Python"
# > True
#ist Urteil
left is "Python"
# > False

Referenzkopie des 2D-Arrays

Python kann Strings und Arrays mit * multiplizieren.

"Oder ein" * 10
# 'Ora Ora Ora Ora Ora Ora Ora Ora Ora'
[0] * 10
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Wenn Sie es jedoch als zweidimensionales Array damit generieren, geraten Sie in die Falle der Referenzkopie. Ich habe das nicht bemerkt und es schmolz lange ... Ich denke, es ist besser, in Listeneinschlussnotation zu schreiben, ohne sie seitlich zu tragen.

two_d_list = [[0] * 10] * 10
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

# [0,0]Ich möchte nur den Wert von hinzufügen
two_d_list[0][0] += 1
# [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]

zur Aussage

Im Gegensatz zu C in Python ist die for-Anweisung ein Mechanismus, der über Sequenztypen iteriert. Also bin ich süchtig danach, Folgendes zu tun.

  1. Auch wenn die Zielliste wie "i" in der Mitte geändert wird, wird sie nicht wiedergegeben.
  2. Wenn Sie das Sequenzobjekt in der Schleife von innen anhängen, handelt es sich um eine Endlosschleife.

Ich denke, ich muss den ersten aufgeben ... Die zweite kann mithilfe der Slice-Notation gelöst werden

num_list = list(range(1, 4))
#Es macht keinen Sinn, mit der Zielliste in der Mitte zu spielen
for i in num_list:
  print(i)
  i += 1
# 1
# 2
# 3

#Mit Scheiben in einer Schleife anhängen
for i in num_list[:]:
  num_list.append(i)
# [1, 2, 3, 1, 2, 3]

Python-Interpreter

Wenn Sie eine kleine Berechnung haben oder etwas ausprobieren möchten, rufen Sie häufig den Python-Interprinter von Ihrem Terminal aus an. Wenn Sie jedoch die Eingabetaste drücken, können Sie nicht mehr zurückgehen und häufig sagen: "Oh, ich habe einen Fehler im Variablennamen gemacht" oder "Oh, ich habe einen Fehler im Einzug gemacht". Also fing ich an, "ipython" zu verwenden. ipython wird empfohlen, da es dem Standardinterprinter als interaktive Umgebung überlegen ist, in der Sie Befehle in einer Umgebung ausführen können, in der Sie Code in Zellen ausführen, mit denen Sie in jupyter notebook vertraut sind.

Modul der GCD-Funktion von Version 3.4 oder niedriger

Dies hängt hauptsächlich mit AtCoder zusammen, aber wenn die Python-Version 3.4 oder niedriger ist, befindet sich die Funktion gcd nicht im Mathematikmodul (die aktuelle AtCoder Python 3-Version ist 3.4).

Die Funktion "gcd" befindet sich seit 3.5 im Mathematikmodul, und frühere Versionen befinden sich im Modul "Brüche" und müssen verwendet werden. Es mag trivial sein, aber es war ein ziemlicher Wettkampfprofi, der die Zeit von einer Minute und einer Sekunde verpasst hat.

# 3.Dies kann nicht für 4 oder weniger verwendet werden
from math import gcd
# 3.Verwenden Sie dies vor 4(3.Nicht empfohlen nach 5)
from fractions import gcd

NaN

a bit pattern of a single-precision or double-precision real number data type that is a result of an invalid floating point operation. Übersetzung: Bitmuster vom realen Datentyp mit einfacher oder doppelter Genauigkeit, das das Ergebnis einer ungültigen Gleitkommaoperation ist Aus IEEE 754

Ich habe immer gedacht, dass die Funktion, die NaN in Pandas bestimmt, df.isnan () (?) Ist. Es ist eigentlich "df.isnull ()". Math.isnan () und numpy.isnan () sind auch nützlich für die individuelle Bestimmung.

Bonus (eher das Hauptthema)

np.nan == np.nan # is always False! Use special numpy functions instead.

NaN hat eine Eigenschaft, dass es im numerischen Vergleich False und eine äquivalente Operation mit allem zurückgibt (es ist auch von dieser Eigenschaft, dass es im Vergleich zu sich selbst False zurückgibt), aber als Referenz verglichen wird, ist kein numerischer Vergleich. Dieser Grundsatz gilt nicht. Python hat jedoch zwei Arten von NaN, math.nan und numpy.nan, die unterschiedliche Objekt-IDs haben.

#Vergleich zwischen NaNs mit ist
math.nan is math.nan
# True

#NaN im Mathematikmodul
id(math.nan)
# 4538852576
#NaN in der Numpy-Bibliothek
id(np.nan)
# 4569389960

Diese können jedoch jedes NaN mit einer Funktion in einer separaten Bibliothek korrekt bestimmen.

#Jeder isnan()NaN kann anhand der Funktion richtig beurteilt werden
math.isnan(np.nan) and np.isnan(math.nan)
# True

Ich war neugierig, um welche Art von Implementierung es sich handelt, also habe ich nachgeschlagen.

Implementierung von math.isnan

Die Implementierung von math.nan scheint der Implementierung von C aus [cpython] zu folgen (https://github.com/python/cpython/blob/c4cacc8c5eab50db8da3140353596f38a01115ca/Include/pymath.h). Informationen zur Implementierung von C finden Sie auf dieser Site.

#define Py_IS_NAN(X) isnan(X)

Implementierung von numpy.nan

NumPy-Kernbibliotheken zeigt, dass es der C99-Implementierung folgt.

.. c:function:: int npy_isnan(x) This is a macro, and is equivalent to C99 isnan: works for single, double and extended precision, and return a non 0 value is x is a NaN.

Mit anderen Worten, die Objekt-ID ist unterschiedlich, aber die ursprüngliche Implementierung ist in C dieselbe, sodass sie gleich funktioniert. Irgendwie habe ich es erwartet, aber ich bin froh, wenn ich es tatsächlich bestätigen kann!

abschließend

Die Frist für die Anzeigenpflege ist begrenzt, aber iCould ist schlecht, da es auch die Sicherung behindert und 3 Tage für die Sicherung von etwa 25 G benötigt.

Recommended Posts

Die Geschichte von Python und die Geschichte von NaN
Die Geschichte von Python ohne Inkrement- und Dekrementoperatoren.
Die Geschichte der Manipulation globaler Python-Variablen
Die Geschichte, deep3d auszuprobieren und zu verlieren
Die Geschichte der Verarbeitung A von Blackjack (Python)
der Zen von Python
Die Geschichte von sys.path.append ()
Die Geschichte, wie man Python ausführt und die Ergebnisse anzeigt, ohne vim zu schließen
Die Geschichte, dass die Lernkosten von Python niedrig sind
Zusammenfassung der Unterschiede zwischen PHP und Python
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Angeben des Bereichs von Ruby- und Python-Arrays
Vergleichen Sie die Geschwindigkeit von Python Append und Map
Bildverarbeitung? Die Geschichte, Python für zu starten
Die Geschichte des Lesens von HSPICE-Daten in Python
Berücksichtigung der Stärken und Schwächen von Python
Die Geschichte des Baus von Zabbix 4.4
Auf dem Weg zum Ruhestand von Python2
Über die Funktionen von Python
Quellinstallation und Installation von Python
Die Kraft der Pandas: Python
Der Prozess der Installation von Atom und der Ausführung von Python
Python - Erläuterung und Zusammenfassung der Verwendung der 24 wichtigsten Pakete
Visualisieren Sie den Bereich der internen und externen Einfügungen mit Python
Die Geschichte von FileNotFound im Python open () -Modus = 'w'
Referenz und Änderung der rekursiven Python-Obergrenze
Ich habe mir die Versionen von Blender und Python angesehen
Die Geschichte der automatischen Sprachkonvertierung von TypeScript / JavaScript / Python
Umgebungskonstruktion von Python und OpenCV
Die Geschichte der Implementierung des Themas Facebook Messenger Bot mit Python
Installation von SciPy und matplotlib (Python)
[Python] Der Stolperstein des Imports
[Python] Herons Formelfunktionalisierung und Berechnung der maximalen Fläche
Erster Python 3 ~ Der Beginn der Wiederholung ~
Sakura Die Geschichte, wie die Python-Flasche im Internet funktioniert hat
Die Geschichte der Teilnahme an AtCoder
Die Geschichte der Einführung von Jedi (automatisches Vervollständigungspaket von Python) in Emacs
Existenz aus Sicht von Python
pyenv-change die Python-Version von virtualenv
NaN Geschichte
Dies und das von Python-Eigenschaften
Die Geschichte eines Rubinisten, der mit Python :: Dict-Daten mit Pycall kämpft
Die Geschichte des "Lochs" in der Akte
[Python] Die potenzielle Feldplanung von Python Robotics verstehen
Überprüfung der Grundlagen von Python (FizzBuzz)
Der Prozess, Python-Code objektorientiert zu machen und zu verbessern
Der Websocket von toio (nodejs) und python / websocket stellen keine Verbindung her.
Ich möchte die Natur von Python und Pip kennenlernen
[Tipps] Probleme und Lösungen bei der Entwicklung von Python + Kivy
[Python] Tensorflow 2.0 unterstützte Python 3.8 nicht, daher die Geschichte des Downgrades von Python
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Die Geschichte des erneuten Bereitstellens des Anwendungsservers
Seltsame und schreckliche Python-Fehlergeschichte
Informationen zur Grundlagenliste der Python-Grundlagen
Geschichte der Potenznäherung von Python