Aujourd'hui est une continuation des bases de Python, mais aujourd'hui les bases sont terminées.
Cliquez ici pour la dernière fois [Vous deviendrez ingénieur dans 100 jours - Jour 32 - Python - Bases du langage Python 7] (https://qiita.com/otupy/items/9e70a3b36f32fccacadf)
Le langage python est un langage de programmation «orienté objet». Alors, qu'est-ce que «orienté objet»?
Dans le langage python, tout ce qui est géré est le concept d '«objet». Toutes les données stockées dans les variables sont également traitées comme «objet».
** Objet chaîne **
Par exemple, si vous affectez la chaîne de caractères ʻabc à la variable ʻa
,
Cette variable «a» devient un «objet de type chaîne».
#Objet de type chaîne
a = 'abc'
print(a)
abc
** Fonctions et méthodes **
Ensuite, déclarons la variable type de liste`` l
et l'élément.
Alors cette variable «l» devient un «objet de type liste», En même temps, la fonction «méthode» de l '«objet liste» peut être utilisée.
#Définir le type de liste
lis1 = [1,2,3]
#Méthode du type de liste
lis1.append(4)
print(lis1)
[1, 2, 3, 4]
À proprement parler, «fonction» et «méthode» sont différentes. Pour faire simple, ajoutez des données sous forme de liste de type ʻappend` Etc. sont des opérations sur l '«objet liste» lui-même Elle sera traitée comme une «méthode».
En «orienté objet», il est défini par un objet
Une fonction qui s'écrit de la même manière qu'une fonction est appelée une méthode
.
D'autres sont appelés fonctions.
Si vous créez un "objet de type chaîne de caractères", La fonction de l'objet peut être considérée comme une "méthode".
** Concept de pensée objet **
«Orienté objet» est un langage de programmation composé de quelque chose «objet». Les objets incluent des variables, des types de données, des fonctions et des classes.
L'idée de faire quelque chose sur le programme et de le gérer Cela devient l'idée de base «orientée objet».
Parce que ce domaine est conceptuel Vous n'avez pas besoin de savoir pour le moment, ou si c'est un programme simple que vous ne connaissez pas C'est quelque chose qui peut être fait. Souvenez-vous finalement.
Dans ce prochain épisode, j'entrerai plus en détail sur class
.
La dernière fois, j'ai expliqué le concept d '«orienté objet».
Après avoir appris le concept «orienté objet», la prochaine étape est en fait en python
Créons une classe
qui sera l'objet`.
** Comment faire un cours **
nom de classe de classe():
def __init__(self,):
En traitement
** Comment appeler une classe **
Nom de la variable = nom de la classe ()
Créons une classe simple.
class class_a():
def __init__(self,):
print('Initialisation')
self.ac = 'aaa'
Vous avez maintenant créé une classe.
** Instance et instanciation **
Une "instance" est une "matérialisée" d'une "classe".
Pour utiliser data
et method
de class
Vous devez créer quelque chose appelé une «instance».
Appelez la classe et stockez-la dans une variable. ʻInstantaner cette chose` La variable créée est également appelée «instance».
#Instanciation
a = class_a()
Initialisation
Ici, la partie de la méthode
appelée ʻinit` est
Lors de la création d'une «instance» appelée «constructeur»
C'est le processus appelé au tout début.
Lors de l'appel de class
et de son stockage dans une variable
ʻInit` est appelé et le traitement qu'il contient est exécuté.
Dans ce processus ʻinit, il y a un nom de variable
selfcomme argument. La variable
self pointe vers elle-même, et cet argument est obligatoire pour
class`
Si vous ne l'écrivez pas, une erreur se produira.
Dans le processus de ʻinit, la valeur est définie sur la variable
self.ac`.
En remplaçant «aaa».
Vous avez maintenant alloué une variable appelée ʻac dans cette
classe` et attribué la valeur.
Vous pourrez utiliser cette variable dans la partie que vous appelez après avoir créé la classe.
** Comment appeler des variables de classe et des méthodes **
Nom de la variable de classe. Nom de la méthode
aa = class_a()
print(aa.ac)
Initialisation aaa
Ajoutons une variable de classe.
aa.b = 2
print(aa.b)
2
La variable «b» a été allouée dans la «classe» et la valeur «2» a été attribuée. Vous pourrez réutiliser cette variable plus tard.
Les variables définies dans cette «classe» sont appelées «attributs».
Dans «class», les fonctions peuvent être définies séparément du «constructeur». La fonction définie dans cette «classe» est appelée «méthode».
Ajoutons une méthode
.
#Définition de classe
class class_a():
def __init__(self,):
print('Initialisation')
self.ac = 'aaa'
#Définition de la méthode
def anaa(self, ):
print(1)
#Appeler une classe et la stocker dans une variable
aa = class_a()
#Appelez une méthode de la classe.
aa.anaa()
Initialisation 1
De cette façon, une classe
a plusieurs méthodes
et variables.
Ce sera un «objet».
La méthode et l'attribut sont
Parce qu'il ne peut être appelé qu'à partir de cette classe
La variable ʻac définie dans
class` ne peut pas être utilisée telle quelle.
print(ac)
NameError Traceback (most recent call last)
Doit être utilisé avec «variable de classe».
print(aa.ac)
aaa
Quand utilisez-vous class
?
Il peut être utilisé pour regrouper de gros processus dans un programme
Ceci est utile lorsque vous souhaitez le réutiliser dans un autre programme.
Une fois comme un programme, classifier
Il est courant de le réutiliser dans un autre programme.
** Héritage de classe **
La classe
a également le concept d'héritage.
Tout d'abord, comme ce qui est censé être hérité
Créez une classe
parent-enfant et créez-y une méthode
.
class oya():
def oyano_method(self):
print('oyano')
#Spécifiez la classe héritée comme argument
class ko(oya):
def kono_method(self):
print('kono')
Pour la classe enfant
, spécifiez la classe parent comme argument
.
Ce faisant, lorsque vous générez une classe enfant
,
Vous pourrez utiliser la méthode
de la classe parent
.
#Appelez une classe enfant.
k = ko()
#Vous pouvez appeler la classe parent héritée par la classe enfant
k.kono_method()
k.oyano_method()
kono oyano
Comme vous pouvez le voir, ce n'était pas dans la classe enfant
Vous pourrez appeler la méthode
de la classe parent
.
Cela dérive de la classe
existante,
Lorsque vous souhaitez créer une nouvelle classe
, etc.
C'est une fonction pratique qui peut être utilisée.
Il est difficile d'apprendre le concept et le mécanisme de classe
,
Si vous vous en souvenez, la gamme de programmation sera considérablement élargie.
Veuillez essayer de vous souvenir lentement et sûrement
Je pense que «l'erreur» a été affichée plusieurs fois dans les conférences jusqu'à présent.
Par exemple
#Définir le type de liste
aqq = [1,2,3]
#Extraire la valeur par index
print(aqq[31])
IndexError Traceback (most recent call last)
Si vous spécifiez une valeur en dehors de la plage de l '«index» du «type de liste»
list index out of range
«Erreur» se produit, la sortie d'erreur est hors de la plage de la liste.
Quand une telle «erreur» se produit, le programme s'arrête là. Alors essayez de ne pas générer d'erreur Vous devez agir lorsqu'une erreur se produit.
Puisqu'il est difficile de supprimer l'occurrence de «erreur» En écrivant une description qui évite «l'erreur», le programme ne sera pas terminé.
C'est la «gestion des exceptions».
** Comment écrire la gestion des exceptions python **
try:
En traitement
except:
Traitement des exceptions
La gestion des exceptions en python est l'endroit où une erreur est susceptible de se produire Entourez-le de la phrase «try --except».
ʻException` est l'anglais par exception. Souvenez-vous.
try:
aqq = [1,2,3]
#J'obtiens une erreur ici
print(aqq[31])
except:
#Ceci est appelé lorsqu'une erreur se produit
print('error')
error
Ecrivez le traitement lorsqu'une «erreur» se produit dans le bloc «sauf».
Si rien n'est fait même si une «erreur» se produit Si vous n'écrivez rien, une erreur de syntaxe se produira. Écrivez «pass».
try:
aqq = [1,2,3]
print(aqq[31])
except:
#Si vous n'écrivez aucun traitement, une erreur se produira
File "
^ SyntaxError: unexpected EOF while parsing
try:
aqq = [1,2,3]
print(aqq[31])
except:
#Si le processus est indécis, écrivez pass
pass
Dans ce qui précède, vous pouvez voir que l'erreur s'est produite, Je ne sais pas ce qui se passe.
Donc, si vous pouvez vous attendre à une «erreur» à l'avance Vous pouvez écrire plusieurs processus lorsqu'une «erreur» se produit.
try:
En traitement
sauf le nom de l'erreur:
Traitement des exceptions
sauf le nom de l'erreur:
Traitement des exceptions
try:
aqq = [1,2,3]
#Une erreur d'index se produit ici
print(aqq[31])
except IndexError:
#Attrapez l'erreur d'index ici
print('index error')
except Exception:
print('exception')
index error
En écrivant «nom d'erreur» après «sauf», Vous pouvez écrire le traitement lorsque l'erreur correspondante se produit.
Dans l'exemple ci-dessus, si une "erreur d'index" se produit
Le traitement de la partie de ʻIndexError sera exécuté. ʻException
récupère toutes les erreurs.
** type d'erreur python **
ZeroDivisionError
Se produit lorsqu'un nombre est divisé par 0
1/0
ZeroDivisionError Traceback (most recent call last)
NameError
Se produit lorsque vous essayez de référencer une variable ou une méthode qui n'existe pas
print(asokokoks)
NameError Traceback (most recent call last)
En premier lieu, il s'agit d'une erreur grammaticale, donc C'est une utilisation qui n'est pas souvent utilisée dans «try-except».
KeyError
Se produit lorsqu'il n'y a pas de clé de type de dictionnaire
d ={1:2,3:4}
print(d[5])
KeyError Traceback (most recent call last)
Il existe de nombreuses autres erreurs. Le code suivant affiche une erreur intégrée Python.
[i for i in dir(__builtins__) if 'Error' in i]
['ArithmeticError',
'AssertionError',
'AttributeError',
'BlockingIOError',
'BrokenPipeError',
'BufferError',
'ChildProcessError',
'ConnectionAbortedError',
'ConnectionError',
'ConnectionRefusedError',
'ConnectionResetError',
'EOFError',
'EnvironmentError',
'FileExistsError',
'FileNotFoundError',
'FloatingPointError',
'IOError',
'ImportError',
'IndentationError',
'IndexError',
'InterruptedError',
'IsADirectoryError',
'KeyError',
'LookupError',
'MemoryError',
'NameError',
'NotADirectoryError',
'NotImplementedError',
'OSError',
'OverflowError',
'PermissionError',
'ProcessLookupError',
'RecursionError',
'ReferenceError',
'RuntimeError',
'SyntaxError',
'SystemError',
'TabError',
'TimeoutError',
'TypeError',
'UnboundLocalError',
'UnicodeDecodeError',
'UnicodeEncodeError',
'UnicodeError',
'UnicodeTranslateError',
'ValueError',
'ZeroDivisionError']
Si vous ne connaissez pas l'erreur qui se produit, placez-la dans try --except
pour le moment.
Plus tard, il est préférable d'ajouter un traitement en fonction du contenu de l'erreur.
N'oubliez pas la «gestion des exceptions» car c'est une technique requise dans votre programme.
Pour le langage de programmation, vous pouvez utiliser des programmes créés par d'autres personnes, Il possède des fonctions pratiques qui vous permettent d'utiliser les programmes que vous avez créés.
C'est la «bibliothèque».
En python, il existe une bibliothèque
qui peut être utilisée immédiatement pour le travail ou la recherche.
Il y en a beaucoup, comme l'apprentissage automatique et l'analyse statistique.
C'est facile à faire avec la bibliothèque
.
L'utilisation de la bibliothèque
est très simple.
** Comment charger la bibliothèque **
ʻImporter le nom de la bibliothèque
à partir du nom du package nom de la bibliothèque d'importation`
Utilisons maintenant la bibliothèque
.
Chargez la bibliothèque random
qui produit des valeurs aléatoires.
import random
Comment appeler la fonction randint () qui génère un entier aléatoire
random.randint (valeur minimale, valeur maximale)
random.randint(1,10)
10
#Appeler une méthode aléatoire 10 fois
for i in range(10):
print(random.randint(1,10))
9 5 3 8 2 9 2 1 4 7
De nombreuses bibliothèques
fonctionnent avec des processus spécifiques.
La bibliothèque
est également appelée module
sous un autre nom.
S'il existe une expression telle que le chargement de module
,
Il est normal de penser que vous chargez un «autre programme».
** Bibliothèque python principale **
*** bibliothèque os *** Vous pouvez utiliser des fichiers et des répertoires sur votre PC
import os
#Liste des fichiers et des dossiers dans le répertoire de votre PC
print(os.listdir('/'))
['.DocumentRevisions-V100', '.file', '.fseventsd', '.PKInstallSandboxManager', '.Spotlight-V100', '.Trashes', '.vol', 'anaconda', 'Applications', 'bin', 'cores', 'dev', 'etc', 'home', 'installer.failurerequests', 'Library', 'Live2D_Cache', 'net', 'Network', 'opt', 'private', 'sbin', 'System', 'tmp', 'Users', 'usr', 'var', 'Volumes']
ʻOs.listdir (fichiers, répertoires, etc.) `
Si vous spécifiez un répertoire dans l'argument de listdir
, il sera dans ce répertoire.
Les fichiers et dossiers sont renvoyés sous forme de valeurs de liste.
Trouvez des fichiers et des répertoires sur votre PC, Utilisez la liste des fichiers pour charger un fichier spécifique ou C'est utile pour écrire des programmes qui fonctionnent.
*** bibliothèque de temps *** Une bibliothèque pour les opérations liées au temps dans un programme
import time
#Arrêtez le programme pendant 2 secondes
time.sleep(2)
print(2)
time.sleep(1)
print(1)
2 1
** Comment utiliser votre propre bibliothèque **
Si vous créez un fichier python
, vous pouvez charger une bibliothèque personnalisée
.
«L'extension de la bibliothèque qui peut être importée» est «.py».
Tout d'abord, créons un simple fichier exécutable python
.
Ce cahier est placé
Créez un fichier python
dans le dossier.
Créez-le avec un éditeur de texte et enregistrez l'extension sous .py
.
sample.py
def hello(aa):
print(aa)
Après avoir créé le fichier python Il peut être lu comme une «bibliothèque», et des «méthodes», etc. peuvent être utilisées.
#Chargement de votre propre bibliothèque
import sample
#Appel de méthode
sample.hello('hello')
hello
Il existe d'innombrables bibliothèques, et lorsqu'elles sont installées avec anaconda, il en existe environ 400 types. La bibliothèque est prête à être utilisée. Puisqu'il est déroutant de porter le nom de la bibliothèque, jetons un œil à la bibliothèque installée.
Pour mac, sur le portable
! pip list
La commande peut maintenant être exécutée et affichée.
Dans le cas des fenêtres, à l'invite de commande, etc.
Veuillez prendre !
Et l'exécuter.
! pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
adal (0.4.5)
alabaster (0.7.10)
alembic (0.9.6)
anaconda-client (1.6.3)
anaconda-navigator (1.6.2)
anaconda-project (0.6.0)
appnope (0.1.0)
appscript (1.0.1)
argcomplete (1.0.0)
asn1crypto (0.22.0)
astroid (1.4.9)
astropy (1.3.2)
azure (2.0.0rc6)
azure-batch (1.0.0)
azure-common (1.1.6)
azure-datalake-store (0.0.12)
azure-graphrbac (0.30.0)
azure-keyvault (0.3.5)
azure-mgmt (0.30.0rc6)
azure-mgmt-authorization (0.30.0)
azure-mgmt-batch (1.0.0)
azure-mgmt-cdn (0.30.3)
azure-mgmt-cognitiveservices (1.0.0)
azure-mgmt-compute (0.30.0rc6)
azure-mgmt-containerregistry (0.2.1)
azure-mgmt-datalake-analytics (0.1.6)
azure-mgmt-datalake-nspkg (2.0.0)
azure-mgmt-datalake-store (0.1.6)
azure-mgmt-devtestlabs (2.0.0)
azure-mgmt-dns (1.0.1)
azure-mgmt-documentdb (0.1.3)
azure-mgmt-iothub (0.2.2)
azure-mgmt-keyvault (0.30.0rc6)
azure-mgmt-logic (1.0.0)
azure-mgmt-monitor (0.2.1)
azure-mgmt-network (0.30.0rc6)
azure-mgmt-nspkg (2.0.0)
azure-mgmt-rdbms (0.1.0)
azure-mgmt-redis (1.0.0)
azure-mgmt-resource (0.30.0rc6)
azure-mgmt-scheduler (1.0.0)
azure-mgmt-sql (0.5.3)
azure-mgmt-storage (0.30.0rc6)
azure-mgmt-trafficmanager (0.30.0)
azure-mgmt-web (0.32.0)
azure-nspkg (2.0.0)
azure-servicebus (0.20.3)
azure-servicefabric (5.6.130)
azure-servicemanagement-legacy (0.20.4)
azure-storage (0.20.3)
Babel (2.4.0)
backports.shutil-get-terminal-size (1.0.0)
bcolz (0.12.1)
beautifulsoup4 (4.6.0)
bitarray (0.8.1)
blaze (0.10.1)
bleach (1.5.0)
bokeh (0.12.5)
boto (2.46.1)
Bottleneck (1.2.1)
bs4 (0.0.1)
certifi (2017.4.17)
cffi (1.10.0)
chardet (3.0.4)
charts (0.4.6)
chest (0.2.3)
click (6.7)
cloudpickle (0.2.2)
clyent (1.2.2)
colorama (0.3.9)
conda (4.5.11)
conda-build (3.0.19)
conda-verify (2.0.0)
configobj (5.0.6)
contextlib2 (0.5.5)
coverage (4.4.2)
cryptography (1.9)
cssselect (1.0.1)
cycler (0.10.0)
cyordereddict (1.0.0)
Cython (0.27.2)
cytoolz (0.8.2)
dask (0.14.3)
datashape (0.5.4)
decorator (4.0.11)
dill (0.2.6)
distributed (1.16.3)
Django (1.10.6)
django-bootstrap3 (8.2.2)
django-crispy-forms (1.6.1)
django-debug-toolbar (1.8)
django-pure-pagination (0.3.0)
django-registration-redux (1.5)
django-storages (1.6.3)
django-torina-blog (0.5)
docutils (0.13.1)
dynd (0.7.3.dev1)
empyrical (0.3.2)
entrypoints (0.2.2)
et-xmlfile (1.0.1)
fastcache (1.0.2)
fbprophet (0.2.1)
filelock (2.0.7)
Flask (0.12.2)
Flask-Cors (3.0.2)
future (0.16.0)
gevent (1.2.1)
glob2 (0.5)
greenlet (0.4.12)
h5py (2.7.0)
HeapDict (1.0.0)
html5lib (0.999999999)
idna (2.5)
imagesize (0.7.1)
intervaltree (2.1.0)
ipykernel (4.6.1)
ipython (5.3.0)
ipython-genutils (0.2.0)
ipywidgets (6.0.0)
isodate (0.5.4)
isort (4.2.5)
itsdangerous (0.24)
Janome (0.3.5)
jdcal (1.3)
jedi (0.10.2)
Jinja2 (2.9.6)
jsonschema (2.6.0)
jupyter (1.0.0)
jupyter-client (5.0.1)
jupyter-console (5.1.0)
jupyter-core (4.3.0)
keyring (10.4.0)
lazy-object-proxy (1.2.2)
line-bot-sdk (1.0.2)
llvmlite (0.18.0)
locket (0.2.0)
Logbook (1.1.0)
lru-dict (1.1.6)
lxml (3.7.3)
Mako (1.0.7)
MarkupSafe (0.23)
matplotlib (2.0.2)
mistune (0.7.4)
mpmath (0.19)
msgpack-python (0.4.8)
msrest (0.4.11)
msrestazure (0.4.11)
multipledispatch (0.4.9)
navigator-updater (0.1.0)
nb-anacondacloud (1.4.0)
nb-conda (2.2.0)
nb-conda-kernels (2.1.0)
nbconvert (5.1.1)
nbformat (4.4.0)
nbpresent (3.0.2)
networkx (1.11)
nltk (3.2.4)
nose (1.3.7)
notebook (5.0.0)
numba (0.33.0)
numexpr (2.6.4)
numpy (1.12.1)
numpydoc (0.6.0)
oauthlib (2.0.2)
odo (0.5.0)
olefile (0.44)
opencv-python (3.4.5.20)
openpyxl (2.4.7)
packaging (16.8)
pandas (0.20.1)
pandas-datareader (0.5.0)
pandas-highcharts (0.5.2)
pandocfilters (1.4.1)
partd (0.3.8)
pathlib2 (2.2.1)
patsy (0.4.1)
pep8 (1.7.0)
pexpect (4.2.1)
pickleshare (0.7.4)
Pillow (4.1.1)
pip (9.0.1)
pkginfo (1.4.1)
plotly (2.3.0)
ply (3.10)
prompt-toolkit (1.0.14)
psutil (5.2.2)
psycopg2 (2.7.1)
ptyprocess (0.5.1)
py (1.4.33)
py-d3 (0.2.7)
PyAlgoTrade (0.18)
pyasn1 (0.2.3)
pycosat (0.6.3)
pycparser (2.18)
pycrypto (2.6.1)
pycurl (7.43.0)
pyflakes (1.5.0)
Pygments (2.2.0)
PyJWT (1.5.2)
pylint (1.6.4)
pyodbc (4.0.16)
pyOpenSSL (17.0.0)
pyparsing (2.1.4)
pystan (2.17.0.0)
pytest (3.0.7)
python-dateutil (2.6.0)
python-editor (1.0.3)
python-highcharts (0.4.1)
pytz (2017.2)
PyWavelets (0.5.2)
PyYAML (3.12)
pyzmq (16.0.2)
QtAwesome (0.4.4)
qtconsole (4.3.0)
QtPy (1.2.1)
redis (2.10.5)
requests (2.18.1)
requests-file (1.4.2)
requests-ftp (0.3.1)
requests-oauthlib (0.8.0)
rope-py3k (0.9.4.post1)
scikit-image (0.13.0)
scikit-learn (0.18.1)
scipy (0.19.0)
seaborn (0.7.1)
selenium (3.0.2)
setuptools (27.2.0)
simplegeneric (0.8.1)
singledispatch (3.4.0.3)
six (1.10.0)
snowballstemmer (1.2.1)
sockjs-tornado (1.0.3)
sortedcollections (0.5.3)
sortedcontainers (1.5.7)
Sphinx (1.5.6)
sphinx-rtd-theme (0.2.4)
spyder (3.1.4)
SQLAlchemy (1.1.9)
sqlparse (0.2.3)
statsmodels (0.8.0)
sympy (1.0)
tables (3.4.2)
tblib (1.3.2)
terminado (0.6)
testpath (0.3)
toolz (0.8.2)
tornado (4.5.1)
traitlets (4.3.2)
unicodecsv (0.14.1)
urllib3 (1.21.1)
wcwidth (0.1.7)
webencodings (0.5)
Werkzeug (0.12.2)
wheel (0.29.0)
widgetsnbextension (2.0.0)
wrapt (1.10.10)
xlrd (1.0.0)
XlsxWriter (0.9.6)
xlwings (0.10.4)
xlwt (1.2.0)
zict (0.1.2)
zipline (1.1.1)
Le nom de la bibliothèque ne doit pas nécessairement être le même que ce nom, donc Si vous êtes coincé dans une recherche, changez le nom.
Si vous utilisez votre propre nom, nom de société, surnom, etc. Je pense que ce domaine sera couvert.
L'utilisation des bibliothèques est devenue courante dans les programmes, Programmes qui peuvent déjà être utilisés sans écrire le programme vous-même Il est sage de l'appeler depuis la bibliothèque.
Quel type de bibliothèque peut être utilisé Je ne peux pas tout vous montrer, donc c'est tout pour l'essentiel.
Le langage Python est un langage orienté objet, donc toutes les données sont des objets. Comprenons comment gérer les données avec le concept de classes.
La gestion des exceptions et le chargement de la bibliothèque sont indispensables lors de l'écriture d'un programme. C'est une bonne idée de vous entraîner à écrire afin de pouvoir utiliser les deux en douceur.
Je ne peux pas couvrir toutes les bibliothèques couramment utilisées ici. Écrivons le code et essayons-le tout en l'examinant par vous-même.
J'ai créé un résumé des codes fréquemment utilisés comme aide-mémoire.
Je publierai un lien ici, alors veuillez vous y référer https://note.com/otupy/n/n1bedb9f36e54
67 jours avant de devenir ingénieur
HP d'Otsu py: http://www.otupy.net/
Youtube: https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw
Twitter: https://twitter.com/otupython
Recommended Posts