[Introduction à Python3, Jour 23] Chapitre 12 Devenir un Paisonista (12.1 à 12.6)

12.1 Test de code

12.1.1 Contrôle par pylint, pyflakes, pep8

style1



a=1
b=2
print(a)
print(b)
print(c)

Résultat d'exécution



$ pylint style1.py
************* Module style1
style1.py:1:1: C0326: Exactly one space required around assignment
a=1
 ^ (bad-whitespace)
style1.py:2:1: C0326: Exactly one space required around assignment
b=2
 ^ (bad-whitespace)
style1.py:1:0: C0114: Missing module docstring (missing-module-docstring)
style1.py:1:0: C0103: Constant name "a" doesn't conform to UPPER_CASE naming style (invalid-name)
style1.py:2:0: C0103: Constant name "b" doesn't conform to UPPER_CASE naming style (invalid-name)
#Un E au début indique une erreur.
style1.py:5:6: E0602: Undefined variable 'c' (undefined-variable)

-------------------------------------
Your code has been rated at -10.00/10

Ajoutez la valeur de c pour éliminer l'erreur.

style2.py



a=1
b=2
c=3
print(a)
print(b)
print(c)

Résultat d'exécution


$ pylint style2.py
************* Module style2
style2.py:1:1: C0326: Exactly one space required around assignment
a=1
 ^ (bad-whitespace)
style2.py:2:1: C0326: Exactly one space required around assignment
b=2
 ^ (bad-whitespace)
style2.py:3:1: C0326: Exactly one space required around assignment
c=3
 ^ (bad-whitespace)
style2.py:1:0: C0114: Missing module docstring (missing-module-docstring)
style2.py:1:0: C0103: Constant name "a" doesn't conform to UPPER_CASE naming style (invalid-name)
style2.py:2:0: C0103: Constant name "b" doesn't conform to UPPER_CASE naming style (invalid-name)
style2.py:3:0: C0103: Constant name "c" doesn't conform to UPPER_CASE naming style (invalid-name)

------------------------------------
Your code has been rated at -1.67/10

Essayez d'allonger le nom de la variable.

style3.py


def func():

    first=1
    second=2
    third=3
    print(first)
    print(second)
    print(third)

func()

Résultat d'exécution


$ pylist style3.py
-bash: pylist: command not found
uemuratntonoAir:bin uemura$ pylint style3.py
************* Module style3
style3.py:3:9: C0326: Exactly one space required around assignment
    first=1
         ^ (bad-whitespace)
style3.py:4:10: C0326: Exactly one space required around assignment
    second=2
          ^ (bad-whitespace)
style3.py:5:9: C0326: Exactly one space required around assignment
    third=3
         ^ (bad-whitespace)
style3.py:1:0: C0114: Missing module docstring (missing-module-docstring)
style3.py:1:0: C0116: Missing function or method docstring (missing-function-docstring)

-----------------------------------
Your code has been rated at 3.75/10

12.1.2 Test par test unitaire

cap.py



def just_do_it(text):
     return text.capitalize()

test_cap.py


import unittest
import cap

class TestCap(unittest.TestCase):

    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_one_word(self):
        text="duck"
        result=cap.just_do_it(text)
        self.assertEqual(result, "Duck")

    def test_multiple_words(self):
        text="a veritable flock of ducks"
        result=cap.just_do_it(text)
        self.assertEqual(result, "A Veritable Flock Of Ducks")

#Vérifiez le résultat avec une méthode dont le nom commence par assert.

if __name__=="__main__":
    unittest.main()

Résultat d'exécution



$ python test_cap.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
$ python test_cap.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
$ python test_cap.py
..F
======================================================================
FAIL: test_words_with_apostrophes (__main__.TestCap)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_cap.py", line 25, in test_words_with_apostrophes
    self.assertEqual(result, "I'm Fresh Out Of Ideas")
AssertionError: "I'M Fresh Out Of Ideas" != "I'm Fresh Out Of Ideas"

#^Indique où les chaînes de caractères sont réellement différentes.
- I'M Fresh Out Of Ideas
?   ^
+ I'm Fresh Out Of Ideas
?   ^


----------------------------------------------------------------------
Ran 3 tests in 0.001s

FAILED (failures=1)

capitalize () fait uniquement du premier mot une casse de titre.

cap.py


#capitalize()Titre()Réécrire dans
def just_do_it(text):
     return text.title()

Résultat d'exécution



$ python test_cap.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

test_cap.py



import unittest
import cap

class TestCap(unittest.TestCase):

    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_one_word(self):
        text="duck"
        result=cap.just_do_it(text)
        self.assertEqual(result, "Duck")

    def test_multiple_words(self):
        text="a veritable flock of ducks"
        result=cap.just_do_it(text)
        self.assertEqual(result, "A Veritable Flock Of Ducks")

#Vérifiez le résultat avec une méthode dont le nom commence par assert.

    def test_words_with_apostrophes(self):
        text="I'm fresh out of ideas"
        result=cap.just_do_it(text)
        self.assertEqual(result, "I'm Fresh Out Of Ideas")

    def test_words_with_quotes(self):
        text="\"You're despicable,\" said Daffy Duck"
        result=cap.just_do_it(text)
        self.assertEqual(result, "\"You're Despicable,\" Said Daffy Duck")


if __name__=="__main__":
    unittest.main()

Résultat d'exécution



$ python test_cap.py
...F
======================================================================
FAIL: test_words_with_quotes (__main__.TestCap)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_cap.py", line 30, in test_words_with_quotes
    self.assertEqual(result, "\"You're Despicable,\" Said Daffy Duck")
AssertionError: '"you\'re Despicable," Said Daffy Duck' != '"You\'re Despicable," Said Daffy Duck'
- "you're Despicable," Said Daffy Duck
?  ^
+ "You're Despicable," Said Daffy Duck
?  ^


----------------------------------------------------------------------
Ran 4 tests in 0.002s

FAILED (failures=1)


12.1.3 Test avec le nez

--nose est un package tiers.

test_cap_nose.py



import cap
from nose.tools import eq_

    def test_one_word(self):
        text="duck"
        result=cap.just_do_it(text)
        eq_(result, "Duck")

    def test_multiple_words(self):
        text="a veritable flock of ducks"
        result=cap.just_do_it(text)
        eq_(result, "A Veritable Flock Of Ducks")

    def test_words_with_apostrophes(self):
        text="I'm fresh out of ideas"
        result=cap.just_do_it(text)
        eq_(result, "I'm Fresh Out Of Ideas")

    def test_words_with_quotes(self):
        text="\"You're despicable,\" said Daffy Duck"
        result=cap.just_do_it(text)
        eq_(result, "\"You're Despicable,\" Said Daffy Duck")


Le même bug que j'ai trouvé lors des tests avec unittestn.

Résultat d'exécution



$ nosetests test_cap_nose.py
E
======================================================================
ERROR: Failure: IndentationError (unexpected indent (test_cap_nose.py, line 4))
----------------------------------------------------------------------
...(réduction)
    def test_one_word(self):
    ^
IndentationError: unexpected indent

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

12.2 Débogage du code Python

test_dump.py



from dump1 import dump

@dump
def double(*args, **kwargs):
    "Double every argument"
    output_list=[2*x for x in args]
    output_dict={k:2*v for k,v in kwargs.items()}
    return output_list, output_dict

if __name__=="__main__":
    output=double(3, 5, first=100,next=98.6, last=-40)

Résultat d'exécution


$ python test_dump.py
Function name: double
Input arguments: 3 5
Input keyword arguments: dict_items([('first', 100), ('next', 98.6), ('last', -40)])
Output: ([6, 10], {'first': 200, 'next': 197.2, 'last': -80})


12.3 Débogage avec pdb

capitals.py


def process_cities(filename):
    with open(filename, "rt") as file:
        for line in file:
            line=line.strip()
            if "quit" in line.lower():
                return
            country, city=line.split(",")
            city=city.strip()
            country=country.strip()
            print(city.title(),country.title(), sep=",")

if __name__=="__main__":
    import sys
    process_cities(sys.argv[1])

Résultat d'exécution


$ python capitals.py cities1.csv
Paris,France
Caracas,Venuzuela
Vilnius,Lithunia


Lors de l'exécution de cities2.csv, il s'arrête lorsque seulement 5 lignes sur 15 sont produites.

cities2.csv


$ python capitals.py cities2.csv
Buenos Aires,Argentinam
La Paz,Bolivia
Brasilia,Brazil
Santiago,Chile
Bogota,Colombia


Résultat d'exécution



$ python -m pdb capitals.py cities2.csv

#Si vous entrez c, il se termine normalement ou s'arrête avec une erreur.
(Pdb) c
Buenos Aires,Argentinam
La Paz,Bolivia
Brasilia,Brazil
Santiago,Chile
Bogota,Colombia
The program finished and will be restarted
> /Users/practice/bin/capitals.py(1)<module>()
-> def process_cities(filename):

#Entrez s pour exécuter les lignes dans l'ordre.
(Pdb) s
> /Users/practice/bin/capitals.py(13)<module>()
-> import sys
(Pdb) s
> /Users/practice/bin/capitals.py(14)<module>()
-> process_cities(sys.argv[1])
(Pdb) s
--Call--
> /Users/practice/bin/capitals.py(1)process_cities()
-> def process_cities(filename):
(Pdb) s
> /Users/practice/bin/capitals.py(2)process_cities()
-> with open(filename, "rt") as file:

#J'ai mis un point d'arrêt sur la 6ème ligne.
(Pdb) b 6
Breakpoint 1 at /Users/uemura/practice/bin/capitals.py:6

#Exécutez le programme jusqu'à ce qu'il atteigne un point d'arrêt ou lit toutes les lignes d'entrée et se termine.
(Pdb) c
Buenos Aires,Argentinam
La Paz,Bolivia
Brasilia,Brazil
Santiago,Chile
Bogota,Colombia
> /Users/practice/bin/capitals.py(6)process_cities()
-> return
#Vérifiez ce que vous lisez.
(Pdb) p line
'ecuador,quito'
(Pdb) b
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /Users/uemura/practice/bin/capitals.py:6
	breakpoint already hit 1 time
#1 est la ligne de code, position actuelle(->), point d'arrêt(B)Est montré.
#Puisque l sans option commence à s'afficher à partir de la fin de l'affichage précédent, spécifiez-le comme option.
(Pdb) l 1
  1  	def process_cities(filename):
  2  	    with open(filename, "rt") as file:
  3  	        for line in file:
  4  	            line=line.strip()
  5  	            if "quit" in line.lower():
  6 B->	                return
  7  	            country, city=line.split(",")
  8  	            city=city.strip()
  9  	            country=country.strip()
 10  	            print(city.title(),country.title(), sep=",")
 11  	


Réécrivez le test d'arrêt pour qu'il corresponde uniquement à ceux qui ont été abandonnés sur toute la ligne.

capitals2.py


def process_cities(filename):
    with open(filename, "rt") as file:
        for line in file:
            line=line.strip()
            if "quit" ==line.lower():
                return
            country, city=line.split(",")
            city=city.strip()
            country=country.strip()
            print(city.title(),country.title(), sep=",")

if __name__=="__main__":
    import sys
    process_cities(sys.argv[1])

Résultat d'exécution



$ python capitals2.py cities2.csv
Buenos Aires,Argentinam
La Paz,Bolivia
Brasilia,Brazil
Santiago,Chile
Bogota,Colombia
Quito,Ecuador
Stanley,Falkland Islands
Cayenne,French Guiana
Asuncion,Paraguay
Lima,Peru
Paramaribo,Suriname
Montevideo,Uruguay
Caracas,Venezuela

12.4 Journalisation des messages d'erreur

>>> import logging
>>> logging.debug("Looks like rain")
>>> logging.info("And hill")
#Le niveau de priorité par défaut est WARNIG.
>>> logging.warn("Did I hear thunder?")
__main__:1: DeprecationWarning: The 'warn' function is deprecated, use 'warning' instead
WARNING:root:Did I hear thunder?
>>> logging.critical("Stop fencing and get inside")
CRITICAL:root:Stop fencing and get inside

#Le niveau par défaut est basicConfig()Peut être défini avec.
#Tous les niveaux supérieurs à DEBUG sont enregistrés.
>>> import logging
>>> logging.basicConfig(level="DEBUG")
>>> logger.debug("Timber")
DEBUG:bunyan:Timber
>>> logging.info("And hill")
INFO:root:And hill

12.5 Optimisation du code

12.5.1 Mesure du temps d'exécution

time1.py


#Soustrayez l'heure de fin du traitement de l'heure actuelle.
from time import time

t1=time()
num=5
num*=2
print(time()-t1)

$ python time1.py
3.0994415283203125e-06
$ python time1.py
1.9073486328125e-06
$ python time1.py
1.6689300537109375e-06


time2.py



from time import time, sleep

t1=time()
sleep(1.0)
print(time()-t1)

Résultat d'exécution



$ python time2.py
1.0051441192626953
uemuratntonoAir:bin uemura$ python time2.py
1.0001447200775146

Il est pratique d'utiliser la fonction timeit () du module timeit.

timeit1.py


#time.timeit("code",number,count)Syntaxe
#Puisqu'il est exécuté dans timeit, le code est""Doit être inclus dans.

from timeit import timeit
print(timeit("num=5;num*=2", number=1))


Résultat d'exécution



$ python timeit1.py
1.63200000000141e-06
uemuratntonoAir:bin uemura$ python timeit1.py
1.252999999999671e-06


time2.py


#repeat()Vous pouvez augmenter le nombre d'exécutions en utilisant l'argument de répétition de la fonction.
from timeit import repeat
print(repeat("num=5;num*=2", number=1,repeat=3))


Résultat d'exécution


$ python timeit2.py
[8.809999999977169e-07, 2.57000000000035e-07, 1.659999999993611e-07]


12.5.2 Algorithme et structure des données

Quel est le plus rapide, la notation d'inclusion de liste ou la boucle for?

time_lists.py



from timeit import timeit

def make1():
     result=[]
     for value in range(1000):
         result.append(value)
     return result

def make2():
    result=[value for value in range(1000)]
    return result

print("make1 takes", timeit(make1, number=1000), "seconds")
print("make2 takes", timeit(make2, number=1000), "seconds")


La notation d'inclusion de liste est plus rapide.

Résultat d'exécution



$ python time_lists.py
make1 takes 0.07954489899999999 seconds
make2 takes 0.035908797000000006 seconds

12.6 Contrôle de source avec Git


#Déplacer après avoir créé un nouveau répertoire.
$ mkdir newdir
$ cd newdir

#Créez un référentiel Git local dans newdir dans le répertoire actuel.
$ git init
Initialized empty Git repository in /Users/practice/bin/newdir/.git/

#Ajoutez des fichiers au référentiel Git.
$ git add test.py

#Vérifiez l'état de Git.
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   test.py

#-m "my first commit"Commit avec le message de commit.
$ git commit -m "my first commit"
[master (root-commit) e03cd1c] my first commit
 1 file changed, 1 insertion(+)
 create mode 100644 test.py

#Des changements ont été validés.
$ git status
On branch master
nothing to commit, working tree clean


Impressions

C'était le premier tour, mais j'ai pu terminer la course en un mois environ. Cependant, comme la sortie n'a pas été produite, je me concentrerai sur la sortie pour le mois prochain.

Les références

"Introduction à Python3 par Bill Lubanovic (publié par O'Reilly Japon)"

Recommended Posts

[Introduction à Python3, Jour 23] Chapitre 12 Devenir un Paisonista (12.1 à 12.6)
[Introduction à Python3 Jour 14] Chapitre 7 Chaînes de caractères (7.1.1.1 à 7.1.1.4)
[Introduction à Python3 Jour 15] Chapitre 7 Chaînes de caractères (7.1.2-7.1.2.2)
[Introduction à Python3 Day 21] Chapitre 10 Système (10.1 à 10.5)
[Introduction à Python3, jour 17] Chapitre 8 Destinations de données (8.1-8.2.5)
[Introduction à Python3, jour 17] Chapitre 8 Destinations de données (8.3-8.3.6.1)
[Introduction à Python3 Jour 19] Chapitre 8 Destinations de données (8.4-8.5)
[Introduction à Python3 Day 18] Chapitre 8 Destinations de données (8.3.6.2 à 8.3.6.3)
[Introduction à Python3 Jour 12] Chapitre 6 Objets et classes (6.3-6.15)
[Introduction à Python3, jour 22] Chapitre 11 Traitement parallèle et mise en réseau (11.1 à 11.3)
[Introduction à Python3 Jour 11] Chapitre 6 Objets et classes (6.1-6.2)
[Introduction à Python3 Jour 20] Chapitre 9 Démêler le Web (9.1-9.4)
[Introduction à Python3 Jour 8] Chapitre 4 Py Skin: Structure du code (4.1-4.13)
[Introduction à Python3 Jour 1] Programmation et Python
[Introduction à Python3 Jour 3] Chapitre 2 Composants Py: valeurs numériques, chaînes de caractères, variables (2.2 à 2.3.6)
[Introduction à Python3 Jour 2] Chapitre 2 Composants Py: valeurs numériques, chaînes de caractères, variables (2.1)
[Introduction à Python3 Jour 4] Chapitre 2 Composants Py: valeurs numériques, chaînes de caractères, variables (2.3.7 à 2.4)
Super Introduction Arithmétique Bit Python
Introduction à la vérification de l'efficacité Chapitre 1 écrit en Python
[Introduction à Python3 Jour 5] Chapitre 3 Outils Py: listes, taples, dictionnaires, ensembles (3.1-3.2.6)
[Introduction à Python3 Jour 10] Chapitre 5 Boîte cosmétique de Py: modules, packages, programmes (5.4-5.7)
[Introduction à Python3 Jour 9] Chapitre 5 Boîte cosmétique de Py: modules, packages, programmes (5.1-5.4)
[Introduction à Python3 Jour 6] Chapitre 3 Liste des outils Py, tapple, dictionnaire, set (3.2.7-3.2.19)
Introduction à la vérification de l'efficacité Chapitre 3 écrit en Python
Introduction au langage Python
Introduction à OpenCV (python) - (2)
Introduction à la vérification de l'efficacité Chapitre 2 écrit en Python
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
[Introduction à python] Introduction rapide à Python pour les programmeurs C ++ occupés
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
Introduction à l'algèbre linéaire avec Python: Décomposition A = LU
[Livre technique] Introduction à l'analyse de données avec Python -1 Chapitre Introduction-
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
Introduction à Python Django (2) Win
Une route vers Python intermédiaire
Une super introduction à Linux
Introduction à la communication série [Python]
[Introduction à Python] <liste> [modifier le 22/02/2020]
Introduction à Python (version Python APG4b)
Une introduction à la programmation Python
Introduction à Python pour, pendant
Je ne peux pas dormir tant que je n'ai pas construit un serveur !! (Introduction au serveur Python faite en un jour)
Le jour 68 [Introduction à Kaggle] Random Forest était simple.
[Présentation de l'application Udemy Python3 +] 58. Lambda
[Présentation de l'application Udemy Python3 +] 31. Commentaire
Introduction à la bibliothèque de calcul numérique Python NumPy
Entraine toi! !! Introduction au type Python (conseils de type)
[Introduction à Python] <numpy ndarray> [modifier le 22/02/2020]
Introduction à Python Hands On Partie 1
[Introduction à Python] Comment analyser JSON
[Présentation de l'application Udemy Python3 +] 56. Clôture
Introduction à Protobuf-c (langage C ⇔ Python)
[Présentation de l'application Udemy Python3 +] 59. Générateur
[Introduction à Python] Utilisons les pandas
Une introduction légère à la détection d'objets
[Introduction à Python] Utilisons les pandas
5 façons de créer un chatbot Python
[Introduction à l'application Udemy Python3 +] Résumé
Introduction à l'analyse d'image opencv python