Mémo débutant Python (2)

J'ai joué plus avec Python et j'ai appris un peu plus, donc je vais l'écrire comme une suite de Dernière fois.

Cela n'a pas d'importance, mais Python s'appelle Pythonista. Visez Pythonista! !!

Système de séquence

Accès aux éléments

Habituel

items = ["A", "B", "C", "D", "E"]
item = items[1] #Récupère l'élément de l'index 1
print(item) # B

Récemment appris

items = ["A", "B", "C", "D", "E"]
item = items[-1] #Obtenez le dernier élément
# item = items[len(items) - 1] #Tu n'as pas à faire ça
print(item) # E

Si vous spécifiez -2, vous pouvez obtenir le deuxième "D" à l'arrière.

Copie de séquence

J'ai écrit Dernière fois, mais cela ressemble à ceci.

items = ["A", "B", "C", "D", "E"]
items2 = items[1:3] #Génération de liste qui extrait les index 1 à 2
print(items2) # ['B', 'C']

items3 = items[1:] #Génération de liste qui extrait tout le dos de l'index 1
print(items3) # ['B', 'C', 'D', 'E']

items4 = items[:3] #Génération de liste qui extrait tout avant l'index 3
print(items4) # ['A', 'B', 'C']

De plus, il peut être pris de manière discrète.

items = ["A", "B", "C", "D", "E", "F", "G"]
items6 = items[::2] #Génération de liste extraite en en sautant une
print(items6) # ['A', 'C', 'E', 'G']

items7 = items[::-1] #Génération de liste inversée
print(items7) # ['G', 'F', 'E', 'D', 'C', 'B', 'A']

items8 = items[-1:3:-1] #Si vous spécifiez la plage d'index dans l'ordre inverse, commencez par l'arrière. (Si vous l'inversez, vous ne pouvez pas supprimer l'élément)
print(items8) # ['G', 'F', 'E']

pour déclaration

Bien sûr, vous pouvez utiliser [::] pour créer diverses boucles du tableau.

items = ["A", "B", "C", "D", "E", "F", "G"]
for item in items[1:]:
    print(item) # B,C,D,E,F,Imprimer G dans l'ordre

print("---")

for item in items[::-1]:
    print(item) # G,F,E,D,C,B,Imprimer A dans l'ordre

print("---")

for item in items[::3]:
    print(item) # A,D,Imprimer G dans l'ordre

Prendre l'index avec pour déclaration

Il y avait un moyen.

items = ["A", "B", "C", "D", "E"]

for i, value in enumerate(items):
    print(str(i) + ":"+ value)

résultat

0:A
1:B
2:C
3:D
4:E

Notation d'inclusion de liste

(Peut-être différent de l'instruction for) http://docs.python.jp/3.5/tutorial/datastructures.html#list-comprehensions

Lorsque vous souhaitez manipuler le contenu d'un tableau pour créer un autre tableau

items = ["a", "B", "c", "D", "e"]

#Faire une liste en majuscules
items2 = []
for item in items:
    items2.append(item.upper())

print(items2) # ['A', 'B', 'C', 'D', 'E']

Là où il semble être écrit, le traitement de la boucle qui crée les items2 peut être écrit comme suit.

items2 = [item.upper() for item in items]

Au fait, si vous utilisez map, vous pouvez écrire comme suit.

items2 = list(map(str.upper, items))

plus loin,

items = ["a", "B", "c", "D", "e"]

#Faites une liste avec uniquement des lettres majuscules
items2 = []
for item in items:
    if item.upper() == item:
        items2.append(item)

print(items2) # ['B', 'D']

Là où il semble être écrit, le traitement de la boucle qui crée les items2 peut être écrit comme suit.

items2 = [item for item in items if item.upper() == item]

Joindre

Liaison de tableau Python qui est assez impressionnante personnellement Il a été réalisé uniquement avec l'opérateur «+».

item1 = ["A", "B", "C"]
item2 = ["D", "E"]

item3 = item1 + item2
print(item3) # ['A', 'B', 'C', 'D', 'E']

(Contrairement à extend, une autre liste est créée)

Comme vous pouvez vous y attendre, bien sûr, une substitution supplémentaire est également possible

item1 = ["A", "B", "C"]
item2 = ["D", "E"]

item1 += item2
# item1.extend(item2)Et le résultat est le même
print(item1) # ['A', 'B', 'C', 'D', 'E']

Et personnellement, je ne comprends pas du tout.

item1 = ["A", "B", "C"]
item2 = ["D", "E"]

item1[:0] = item2
print(item1) # ['D', 'E', 'A', 'B', 'C']

Si vous écrivez comme ci-dessus, vous pouvez le combiner avec votre tête.

Je n'y suis pas habitué, donc je ne peux pas le comprendre pour le moment

item1 = item2 + item1

Je pense que je vais écrire.

Manipulation des cordes

join (Dernière fois Peut-être que cela aurait dû être écrit)

s = ":".join(["A", "B", "C", "D", "E"])

print(s) # "A:B:C:D:E"

répétition

C'est aussi une méthode qui m'impressionne. Il a été réalisé uniquement avec l'opérateur «*». (J'ai écrit une boucle jusqu'à ce que je sache cela)

s = "Ah" * 5
print(s) #Ahhhh

expression lambda

Écrivez comme ça. La façon d'écrire une expression lambda n'est pas très différente de Java actuellement.

func = lambda x: x.upper()

print(func("a")) # A

Instruction conditionnelle

in Déterminez (ou) s'il est inclus dans la séquence. (Le comportement est différent avec dict) Un outil pratique qui n'a pas besoin d'être connecté avec ou.

http://docs.python.jp/3.5/reference/expressions.html#membership-test-operations Il semble que le nom soit le calcul de l'inspection d'attribution. Comme SQL IN? Un souvenir personnel que j'aurais pu faire avec Temple Mark Language.

if 2 in [1, 2, 3]: # True
    print("Il ya deux")

if 4 not in [1, 2, 3]: # True
    print("4 n'est pas")

yield

http://docs.python.jp/3.5/reference/expressions.html#yieldexpr http://docs.python.jp/3.5/reference/simple_stmts.html#the-yield-statement

Je ne peux pas expliquer quel est le rendement, alors reportez-vous à ce qui suit https://ja.wikipedia.org/wiki/ジェネレータ_(プログラミング)

J'ai compris comment créer facilement Iterator en Java.

def yield_sample():
    for i in [1, 2, 3]:
        yield i

gen = yield_sample()

print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # 3
print(next(gen))  # StopIteration
for i in yield_sample(): #Peut être tourné avec une instruction for
    print(i)  #Sortie 1, 2 et 3 dans l'ordre

Vient ensuite la partie intéressante du rendement

def yield_sample2():
    print("Le suivant est 1")
    yield 1
    print("Le suivant est 2")
    yield 2
    print("Le suivant est 3")
    yield 3
    print("Il n'y a pas de suivant")

for i in yield_sample2():
    print(i)  #Sorties 1, 2 et 3 dans l'ordre, mais ...

Le résultat est

Le suivant est 1
1
Le suivant est 2
2
Le suivant est 3
3
Il n'y a pas de suivant

Si vous souhaitez lister le générateur créé par yield,

def yield_sample():
    for i in [1, 2, 3]:
        yield i

l = list(yield_sample())
print(l) # [1, 2, 3]

Système d'exploitation de fichiers

Cela peut être plus rapide sur Google. J'ai eu l'impression qu'il y avait plusieurs façons de le faire. Je ne sais pas quelle méthode est la meilleure. Je n'écrirai pas toutes les opérations sur les fichiers, mais je n'écrirai que celles que j'ai utilisées.

Lis

f = codecs.open(path, "r", "utf-8")
ret = f.read()
f.close()

l'écriture

f = codecs.open(path,"w", "utf-8")
f.write(value)
f.close()

le fichier existe

if os.path.exists(path):

Creuser un dossier

os.makedirs(dirPath)

Obtenir le nom du dossier parent

os.path.dirname(path)

Lister les fichiers du répertoire

for root, _, files in os.walk(dirPath):
    for fileName in files:
        path = os.path.join(root, fileName)
        yield path

Gestion des exceptions

except Bloc de capture en Java

def error_throw():
    "" + 1

try:
    error_throw()
    print("Ne viens pas ici")
except: #Viens ici avec toutes les erreurs
    print("Erreur")

type attrape

try:
    error_throw()
    print("Ne viens pas ici")
except Exception as e: #Obtenir un objet d'erreur
    print(type(e))
    print(e)

résultat

<class 'TypeError'>
Can't convert 'int' object to str implicitly

S'applique également au type d'exception

try:
    error_throw()
    print("Ne viens pas ici")
except ValueError:
    print("ValueError ne se produit pas, donc il ne vient pas ici")
except TypeError:
    print("Je suis ici parce que j'ai une TypeError")

trace Stacktrace gentil mec en Java

import traceback

try:
    error_throw()
except :
    print(traceback.format_exc())

fermeture

Ne peux pas. Je suis désolé. Vous ne pouvez pas le faire avec une image similaire à Java.

def new_counter():
    count = 0
    def func():
        count += 1
        return count
    return func

c = new_counter()
print(c())
print(c())
print(c())

Erreur

UnboundLocalError: local variable 'count' referenced before assignment

Vous pouvez faire quelque chose comme ça en écrivant comme suit. .. .. (Comme Java)

def new_counter():
    count = [0]
    def func():
        count[0] += 1
        return count[0]
    return func

c = new_counter()
print(c())
print(c())
print(c())

tester

Créer

Depuis Eclipse "Nouveau" -> "Module Pydev" -> Nom et "Terminé" -> Si vous sélectionnez "Module: Unittest" et voyez ce que vous pouvez faire avec "OK", vous pouvez comprendre comment l'écrire.

Courir

Il peut être exécuté en sélectionnant "Exécuter" -> "Test unitaire Python".

échantillon

import unittest


class Test(unittest.TestCase):


    def testName(self):
        self.assertEqual(1, 2, "échantillon")


if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()

résultat

F
======================================================================
FAIL: testName (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\hogehoge\testsample.py", line 13, in testName
    self.assertEqual(1, 2, "échantillon")
AssertionError: 1 != 2 :échantillon

----------------------------------------------------------------------
Ran 1 test in 0.016s

FAILED (failures=1)

Ajout dynamique de tests

J'ai évoqué ce qui suit. http://hirokazumiyaji.hatenablog.com/entry/2015/07/16/134238

L'exemple ci-dessous est un exemple pour enregistrer le test pour les fichiers dans le répertoire.

import unittest
import os


class Test(unittest.TestCase):
    #Classe de test vide
    pass

def setup_testsuite():
    """
Enregistrez le test en listant les fichiers dans le répertoire
    """
    root = os.getcwd()
    test_files_dir = os.path.join(root, "files") #Ciblez les fichiers dans le dossier files à côté de ce fichier py

    def listup():
        for root, _, files in os.walk(test_files_dir):
            for file_name in files:
                if os.path.splitext(file_name)[1].lower() == ".txt":#Affiner par extension
                    yield file_name, os.path.join(root, file_name)

    for file_name, path in listup():
        def create_test_func(file_name, path):
            def test_func(self):
                """
État réel du test
                """
                print("test start: " + file_name)

                #Puisque self est Test, assertEqual est appelé comme suit
                # self.assertEqual(first, second, msg)

            return test_func

        test_name = "test_{}".format(file_name)
        setattr(Test, test_name, create_test_func(file_name, path)) #enregistrement

#Effectuer l'enregistrement du test
setup_testsuite()

if __name__ == "__main__":
    # import sys;sys.argv = ['', 'Test.testName']
    unittest.main()

Recommended Posts

mémo débutant python (9.1)
Mémo débutant Python (2)
Mémo Python
mémo python
Mémo Python
mémo python
Mémo Python
Mémo Python
Débutant ABC154 (Python)
[Python] Mémo sur le dictionnaire
Débutant ABC156 (Python)
Notes de débutant Python
★ Mémo ★ Python Iroha
Débutant ABC155 (Python)
[Python] Mémo EDA
Mémo opérateur Python 3
[Débutant] Fonctions Python
Débutant ABC157 (Python)
PyQ ~ Python Débutant ~
[Mon mémo] python
Mémo de métaclasse Python3
[Python] Mémo de fond de carte
Python débutant Zundokokiyoshi
[Python] Mémo Numpy
[Mémo du débutant Python] chaîne de caractères python, opération de chemin
Classe Python (mémo d'apprentissage Python ⑦)
installation de python openCV (mémo)
Module Python (mémo d'apprentissage Python ④)
Mémo de visualisation par Python
Mémo du package de test Python
mémo d'expression régulière python
Recherche de bisection (python2.7) mémo
[Mon mémo] python -v / python -V
Mémo de type Liste / Dictionnaire Python3
Astuces Python (mon mémo)
[Python] Mémo sur les erreurs
Mémo de script DynamoDB (Python)
Mémo de base Python - Partie 2
livre de recettes python Memo
Notes de commande de base Python
Mémo de grammaire de base Python
Mémo de l'API TensorFlow (Python)
liens de mémo utiles python
Mémo d'opération de décorateur Python
Mémo de base Python - Partie 1
Élément de mémo Python efficace 3
Mémo Python d'énumération approximative
Notes sur la création d'un environnement python par les débutants
Mémo Python (pour moi): Array
Gestion des exceptions Python (mémo d'apprentissage Python ⑥)
Mémo de mesure du temps d'exécution Python
python super débutant essaie de gratter
Python
Mémo graphique Twitter avec Python
[Line / Python] Mémo d'implémentation Beacon
Mémo tranche python et rubis
Mémo de grammaire de base Python (1)
Mémo de code personnel Python
Raspeye + Python + Mémo OpenGL