À propos de Python for loop

Le but de cette histoire

pour boucle

for_loop.py


for i in [0, 1, 2, 3, 4]:
    print(i)

Quand tu cours

% python for_loop.py
0
1
2
3
4

for i inJe veux savoir comment la chose derrière est utilisée. (Dans le cas de l'exemple ci-dessus, il semble que les éléments de `` [0, 1, 2, 3, 4] '' soient extraits dans l'ordre.)

Essayez de mettre un bel objet

Voyons comment il est atteint en référence à l'erreur d'exécution

duck.py


class Duck(object):
    pass


if __name__ == '__main__':
    for i in Duck():
        print(i)

Quand je le lance, je me fâche si ce n'est pas itérable

% python duck.py
Traceback (most recent call last):
  File "duck.py", line 6, in <module>
    for i in Duck():
TypeError: 'Duck' object is not iterable

Essayez d'implémenter iterable

On m'a dit de le mettre en œuvre, alors je vais le mettre en œuvre. Mais retourne juste un objet vide

duck.py


class DuckIter(object):
    def __init__(self):
        pass


class Duck(object):
    def __iter__(self):
        return DuckIter()


if __name__ == '__main__':
    for i in Duck():
        print(i)

L'erreur a changé (un pas en avant!)

% python duck.py
Traceback (most recent call last):
  File "duck.py", line 12, in <module>
    for i in Duck():
TypeError: iter() returned non-iterator of type 'DuckIter'

Essayez d'implémenter l'itérateur

Essayez de crier trois fois.

duck.py


class DuckIter(object):
    def __init__(self):
        self._count = 3

    def next(self):
        if self._count > 0:
            self._count -= 1
            return "quack"
        raise StopIteration()


class Duck(object):
    def __iter__(self):
        return DuckIter()


if __name__ == '__main__':
    for i in Duck():
        print(i)

Plus d'erreurs lors de l'exécution

% python duck.py
quack
quack
quack

Le canard a sonné!

Typage de canard

If it walks like a duck and quacks like a duck, it must be a duck https://ja.wikipedia.org/wiki/ダック・タイピング

L'objet lui-même détermine ce que l'objet peut faire (Indépendamment de l'héritage qu'ils ont)

Dans le cas de l'exemple précédent

Cela nous a permis de tourner la boucle for:

for i in Duck():
    print(i)

Cette notation est à peu près la même que ci-dessous

iter = Duck().__iter__()
while True:
    try:
        i = iter.next()
        print(i)
    except StopIteration:
        break

En d'autres termes, le flux de traitement de la boucle for

  1. Obtenez l'itérateur
  2. Appelez la méthode next () de l'itérateur
  3. S'il ne s'agit pas de StopIteration, exécutez "Traitement en boucle" et passez à 2. à nouveau.

Un peu de pratique

Créons un objet avec un itérateur dans l'ordre inverse de la liste

>>> lst = [0, 1, 2, 3, 4]
>>> rev = RevList(lst)
>>> for r in rev:
...     print(r)
...
4
3
2
1
0

Pointe:

Réponse 1

class RevListIter(object):
    def __init__(self, lst):
        self._orig = lst
        self._i = len(lst)

    def next(self):
        if self._i > 0:
            self._i -= 1
            return self._orig[self._i]
        raise StopIteration()


class RevList(object):
    def __init__(self, lst):
        self._orig = lst

    def __iter__(self):
        return RevListIter(self._orig)


if __name__ == '__main__':
    lst = [0, 1, 2, 3, 4]
    rev = RevList(lst)
    for r in rev:
        print(r)

Réponse 2

class RevList(object):
    def __init__(self, lst):
        self._orig = lst

    def __iter__(self):
        return self._orig[::-1].__iter__()


if __name__ == '__main__':
    lst = [0, 1, 2, 3, 4]
    rev = RevList(lst)
    for r in rev:
        print(r)

Différence entre les deux réponses

Notation d'inclusion de liste et représentation du générateur

Une autre pratique

Créons un itérateur qui met au carré chaque élément d'une liste d'entiers

>>> lst = [0, 1, 2, 3, 4]
>>>pour moi dans quelque chose(lst):
...     print(i)
...
0
1
4
9
16

Deux exemples de réponses

>>> lst = [0, 1, 2, 3, 4]
>>> for i in [x*x for x in lst]:
...     print(i)
...
0
1
4
9
16
>>> for i in (x*x for x in lst):
...     print(i)
...
0
1
4
9
16

Les deux sont des solutions. Voyons la différence entre les deux.

Notation d'inclusion de liste

notation

[f(x) for x in lst]

Exemple de code

list_comprehension.py


def f(x):
    print("%d*%d" % (x, x))
    return x*x

if __name__ == '__main__':
    lst = [0, 1, 2, 3, 4]
    x = [f(x) for x in lst]
    print(type(x))
    for i in x:
        print(i)

Résultat d'exécution

% python list_comprehension.py
0*0
1*1
2*2
3*3
4*4
<type 'list'>
0
1
4
9
16

Représentation du générateur

notation

(f(x) for x in lst)

Exemple de code

generator_expression.py


def f(x):
    print("%d*%d" % (x, x))
    return x*x

if __name__ == '__main__':
    lst = [0, 1, 2, 3, 4]
    x = (f(x) for x in lst)
    print(type(x))
    for i in x:
        print(i)

Résultat d'exécution

% python generator_expression.py
<type 'generator'>
0*0
0
1*1
1
2*2
4
3*3
9
4*4
16

Résumé

Recommended Posts

À propos de Python for loop
À propos de Python, pour ~ (plage)
Prise en charge de Fabric pour Python 3
À propos de "for _ in range ():" de python
À propos des tranches Python
python [pour moi]
À propos de la notation d'inclusion de python
À propos de Python tqdm.
À propos du rendement Python
À propos de python, classe
À propos de l'héritage Python
À propos de python, range ()
À propos de Python Decorator
À propos de la référence Python
À propos des décorateurs Python
[Python] À propos du multi-processus
À propos des arguments de fonction (python)
Bases de Python ② pour déclaration
[Python] Mémo sur les fonctions
Résumé sur Python3 + OpenCV3
Manuel python pour les débutants
À propos de pgbench pour MySQL
Refactoring des outils utilisables avec Python
[Python] Mémo sur les erreurs
À propos de l'environnement de développement Python
Python: à propos des arguments de fonction
Python, à propos de la gestion des exceptions
Toolchain pour Python pour Android
À propos de Python Pyramid Traversal
À propos du polymorphisme pour l'élimination des nids
À propos de Python3 ... (objet Ellipsis)
[Python] Chapitre 01-01 À propos de Python (First Python)
[Python] À propos de l'entrée standard
À propos de __all__ en python
[Python] En savoir plus sur la programmation asynchrone et les boucles d'événements
OpenCV pour les débutants en Python
Installez Python (pour Windows)
[Python] pour une erreur d'instruction
À propos de l'importation de modules externes Python <Pour les super débutants>
Maintenance de l'environnement Python pour les projets
Écrire sur la création d'un environnement Python pour l'écriture de Qiita Qiita
À propos de la création et de la modification de thèmes personnalisés pour Python IDLE
[Python of Hikari-] Chapitre 05-05 Syntaxe de contrôle (pour instructions-boucles multiples-)
mémo python (pour moi-même): À propos de l'environnement de développement virtualenv
[Python] En savoir plus sur pip
Mémo Python (pour moi): Array
Liste Python, pour instruction, dictionnaire
Python pour l'analyse des données Chapitre 4
Flux d'apprentissage pour les débutants en Python
Procédure d'installation de Python 3.6 [pour Windows]
À propos des objets et des classes Python
À propos des variables et des objets Python
Intégration BigQuery pour les utilisateurs Python
Plan d'apprentissage Python pour l'apprentissage de l'IA
À propos du module Python venv
Configurer pour Mac (Python)