L'histoire de Python et l'histoire de NaN

Calendrier de l'Avent de l'Université de Kinki 2019 Jour 10 J'ai été très surpris que le calendrier de l'Avent, que j'ai commencé avec une sensation de légèreté, soit rempli toute la journée. Je suis très reconnaissant à tous ceux qui ont participé, merci.

Dans cet article, je vais vous montrer ce que j'ai fait avec Python. Aussi, je laisserai ce que j'ai recherché quand j'étais accro à NaN. J'aimerais regarder en arrière sur moi-même et devenir professeur d'autre part.

== et est

Après s'être habitué à Python, en essayant d'écrire Pythonic, une connaissance a dit: "En Python, il est plus à la mode de juger de l'équivalence avec ʻis!", Et j'ai remplacé tout == par ʻis. .. Ensuite, cela semble fonctionner correctement, mais ...

== Différence de comportement entre is et is == détermine si les valeurs sont égales détermine si les identifiants des objets sont égaux

Même si les chaînes et les listes Python ont la même valeur, l'identifiant de l'objet peut être différent. (Je pense que ʻis est étrange quand le japonais est entré dans la chaîne de caractères), donc si vous faites un jugement avec ʻis, False sera retourné même si la valeur est la même, et vous en serez accro.

left = "python"
# ==Jugement
left == "python"
# > True
#est le jugement
left is "python"
# > False

Copie de référence du tableau 2D

Python peut multiplier les chaînes et les tableaux avec «*».

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

Cependant, si vous le générez comme un tableau à deux dimensions avec cela, vous tomberez dans le piège de la copie de référence. Je n'ai pas remarqué cela et ça a fondu pendant longtemps ... Je pense qu'il vaut mieux écrire en notation d'inclusion de liste sans la porter de côté.

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]Je veux ajouter uniquement la valeur de
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]

pour déclaration

Contrairement à C en Python, l'instruction for est un mécanisme qui itère sur les types de séquence. Donc, je suis accro à faire ce qui suit.

  1. Même si la liste cible telle que ʻi` est modifiée au milieu, elle n'est pas reflétée.
  2. Si vous ajoutez à l'objet séquence dans la boucle de l'intérieur, ce sera une boucle infinie.

Je pense que je dois abandonner le premier ... Le second peut être résolu en utilisant la notation de tranche

num_list = list(range(1, 4))
#Il ne sert à rien de jouer avec la liste cible au milieu
for i in num_list:
  print(i)
  i += 1
# 1
# 2
# 3

#Ajouter dans une boucle à l'aide de tranches
for i in num_list[:]:
  num_list.append(i)
# [1, 2, 3, 1, 2, 3]

Interpréteur Python

Si vous avez un petit calcul ou quelque chose que vous voulez essayer, vous appelez souvent l'interpréteur Python depuis votre terminal. Cependant, une fois que vous appuyez sur Entrée, vous ne pouvez pas revenir en arrière et dire souvent: "Oh, j'ai fait une erreur dans le nom de la variable" ou "Oh, j'ai fait une erreur dans le retrait." J'ai donc commencé à utiliser ʻi python`. ipython est recommandé car il est supérieur à l'interpréteur par défaut en tant qu'environnement interactif où vous pouvez exécuter des commandes dans un environnement où vous exécutez du code dans des cellules que vous connaissez dans jupyter notebook.

Module de la fonction gcd de la version 3.4 ou inférieure

Ceci est principalement lié à AtCoder, mais si la version Python est 3.4 ou inférieure, la fonction gcd n'est pas dans le module math (la version actuelle d'AtCoder Python 3 est 3.4).

La fonction gcd est placée dans le module mathématique depuis 3.5, et les versions antérieures sont dans le module fractions et doivent être utilisées. C'est peut-être anodin, mais c'était un peu un pro de la compétition qui a raté le temps d'une minute et une seconde.

# 3.Cela ne peut pas être utilisé pour 4 ou moins
from math import gcd
# 3.Utilisez ceci avant 4(3.Non recommandé après 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. Traduction: modèle binaire de type de données réel à simple ou double précision résultant d'une opération en virgule flottante non valide Depuis IEEE 754

J'ai toujours pensé que la fonction qui détermine NaN dans Pandas est df.isnan () (?) C'est en fait «df.isnull ()». Math.isnan () et numpy.isnan () sont également utiles pour la détermination individuelle.

Bonus (plutôt le sujet principal)

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

NaN a pour caractéristique de renvoyer False en comparaison numérique et calcul d'équivalence avec tout (c'est aussi à partir de cette caractéristique qu'il renvoie False en comparaison avec lui-même), mais est comparé par référence n'est pas une comparaison numérique. , Ce principe ne s'applique pas. Cependant, Python a deux types de NaN, math.nan et numpy.nan, qui ont des identifiants d'objet différents.

#Comparaison entre les NaN utilisant est
math.nan is math.nan
# True

#NaN dans le module mathématique
id(math.nan)
# 4538852576
#NaN dans la bibliothèque numpy
id(np.nan)
# 4569389960

Cependant, ceux-ci sont capables de déterminer correctement chaque NaN avec une fonction dans une bibliothèque distincte.

#Chaque isnan()NaN peut être jugé correctement par la fonction
math.isnan(np.nan) and np.isnan(math.nan)
# True

J'étais curieux de savoir de quel type de mise en œuvre il s'agissait, alors je l'ai recherché.

Implémentation de math.isnan

L'implémentation de math.nan semble suivre l'implémentation de C de cpython. Pour la mise en œuvre de C, reportez-vous à ce site.

#define Py_IS_NAN(X) isnan(X)

Implémentation de numpy.nan

Bibliothèques de base NumPy montre qu'elle suit l'implémentation C99.

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

En d'autres termes, l'identifiant de l'objet est différent, mais l'implémentation d'origine est la même en C, donc cela fonctionne de la même manière. Je m'y attendais d'une manière ou d'une autre, mais je suis content de pouvoir le confirmer!

en conclusion

La date limite pour la gestion des publicités a atteint une limite, mais iCould est mauvais car il a également entravé la sauvegarde et a pris 3 jours pour sauvegarder environ 25G.

Recommended Posts

L'histoire de Python et l'histoire de NaN
L'histoire de Python sans opérateurs d'incrémentation et de décrémentation.
L'histoire de la manipulation des variables globales Python
L'histoire d'essayer deep3d et de perdre
L'histoire du traitement A du blackjack (python)
le zen de Python
L'histoire de sys.path.append ()
L'histoire de l'exécution de python et de l'affichage des résultats sans fermer vim
L'histoire selon laquelle le coût d'apprentissage de Python est faible
Résumé des différences entre PHP et Python
La réponse de "1/2" est différente entre python2 et 3
Spécification de la plage des tableaux ruby et python
Comparez la vitesse d'ajout et de carte Python
Traitement d'image? L'histoire du démarrage de Python pour
L'histoire de la lecture des données HSPICE en Python
Prise en compte des forces et faiblesses de Python
L'histoire de la construction de Zabbix 4.4
Vers la retraite de Python2
À propos des fonctionnalités de Python
Installation source et installation de Python
Le pouvoir des pandas: Python
Le processus d'installation d'Atom et de l'exécution de Python
Python - Explication et résumé de l'utilisation des 24 meilleurs packages
Visualisez la gamme d'insertions internes et externes avec python
L'histoire de FileNotFound en Python open () mode = 'w'
Référence et modification de la limite supérieure récursive Python
J'ai vérifié les versions de Blender et Python
L'histoire de la conversion automatique du langage de TypeScript / JavaScript / Python
Construction d'environnement de python et opencv
L'histoire de la mise en œuvre du sujet Facebook Messenger Bot avec python
Installer SciPy et matplotlib (Python)
[Python] La pierre d'achoppement de l'importation
[Python] Fonctionnalisation de la formule de Heron et calcul de la surface maximale
First Python 3 ~ Le début de la répétition ~
Sakura L'histoire du fonctionnement de la bouteille Python sur Internet
L'histoire de la participation à AtCoder
L'histoire de l'introduction de Jedi (package de complétion automatique de python) dans emacs
Existence du point de vue de Python
pyenv-changer la version python de virtualenv
Histoire de NaN
Ceci et cela des propriétés python
L'histoire du rubyiste aux prises avec Python :: Dict data with pycall
L'histoire du "trou" dans le fichier
[Python] Comprendre le potentiel_field_planning de Python Robotics
Revue des bases de Python (FizzBuzz)
Le processus de création et d'amélioration du code Python orienté objet
Le websocket de toio (nodejs) et python / websocket ne se connecte pas.
Je veux connaître la nature de Python et pip
[Astuces] Problèmes et solutions dans le développement de python + kivy
[Python] Tensorflow 2.0 ne supportait pas Python 3.8, donc l'histoire de la rétrogradation de Python
Coexistence de Python2 et 3 avec CircleCI (1.0)
L'histoire du remontage du serveur d'application
Histoire d'erreur étrange et horrible de Python
À propos de la liste de base des bases de Python
Histoire d'approximation de puissance par Python