English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Résumé des techniques de itération et de contre-itération des objets en Python

I. Comment implémenter les objets itérables et les objets itérateurs ?

Cas réel

Un logiciel nécessite de récupérer les informations de température des villes via le réseau et de les afficher ensuite :

北京: 15 ~ 20 天津: 17 ~ 22 长春: 12 ~ 18 ......

si l'on télécharge toutes les informations météorologiques des villes en une seule fois et les affiche, il y a un grand délai pour afficher la température de la première ville et une perte d'espace de stockage, nous espérons une stratégie d'accès à l'utilisation et encapsuler toutes les températures des villes dans un objet, qui peut être itéré avec une boucle for, comment résoudre ce problème ?

Solution

implémenter un objet itérable Weatherlterator, la méthode next retourne une température de ville chaque fois, implémenter un objet itérable Weatherlterable,————méthode iter__ retourne un objet itérable

import requests from collections import Iterable, Iterator # Iterateur de température class WeatherIterator(Iterator): def __init__(self, cities): self.cities = cities self.index = 0 def getWeather(self, city): r = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=' + city) data = r.json()['data']['forecast'][0] return '%s:%s , %s' % (city, data['low'], data['high']) def __next__(self): if self.index == len(self.cities): raise StopIteration city = self.cities[self.index] self.index += 1 return self.getWeather(city) # Objet itérable class WeatherIterable(Iterable): def __init__(self, cities): self.cities = cities def __iter__(self): return WeatherIterator(self.cities) for x in WeatherIterable(['北京', '上海', '广州', '深圳']): print(x)

Résultat de l'exécution suivant :

C:\Python\Python35\python.exe E:/python-intensif-entraînement/s2.py Pékin : température basse 21℃ , température élevée 30℃ Shanghai : température basse 23℃ , température élevée 26℃ Guangzhou : température basse 26℃ , température élevée 34℃ Shenzhen : température basse 27℃ , température élevée 33℃ Process finished with exit code 0

Deuxième partie : comment utiliser une fonction de générateur pour mettre en œuvre un objet itérable ?

Cas réel

Mise en œuvre d'une classe d'objet itérable qui peut itérer tous les nombres premiers dans une plage donnée :

python pn = PrimeNumbers(1, 30) for k in pn: print(k) `` Résultat de la sortie text
2 3 5 7 11 13 17 19 23 29
“`

Solution

-mettre en œuvre la méthode __iter__ de la classe pour générer une fonction de générateur, yield renvoie un nombre premier à chaque fois

class PrimeNumbers: def __init__(self, start, stop): self.start = start self.stop = stop def isPrimeNum(self, k): if k < 2: return False for i in range(2, k): if k % i == 0: return False return True def __iter__(self): for k in range(self.start, self.stop + 1): if self.isPrimeNum(k): yield k for x in PrimeNumbers(1, 20) : print(x)

Résultat de l'exécution

C:\Python\Python35\python.exe E:/python-intensif-entraînement/s3.py 2 3 5 7 11 13 17 19 Processus terminé avec le code de sortie 0

Troisième partie : comment effectuer une itération inverse et comment mettre en œuvre une itération inverse ?

Cas réel

Mise en œuvre d'un générateur de nombres flottants continus FloatRange (similaire à rrange), générant une série de nombres flottants continus selon une plage donnée (start, stop) et une valeur de pas (step), par exemple, itérer FloatRange(3.0,4.0,0.2) peut générer une séquence :

Itération directe :3.0 > 3.2 > 3.4 > 3.6 > 3.8 > 4.0 Itération inverse :4.0 > 3.8 > 3.6 > 3.4 > 3.2 > 3.0

Solution

mise en œuvre du protocole d'itération inverse avec la méthode __reversed__, qui renvoie un itérateur inverse

class FloatRange: def __init__(self, start, stop, step=0.1): self.start = start self.stop = stop self.step = step def __iter__(self): t = self.start while t <= self.stop: yield t t += self.step def __reversed__(self): t = self.stop while t >= self.start: yield t t -= self.step print("itération directe-----") for n in FloatRange(1.0, 4.0, 0.5): print(n) print("itération inverse-----") for x in reversed(FloatRange(1.0, 4.0, 0.5)): print(x)

Résultat de la sortie

C:\Python\Python35\python.exe E:/python-intensif-entraînement/s4.py itération directe----- 1.0 1.5 2.0 2.5 3.0 3.5 4.0 itération inverse----- 4.0 3.5 3.0 2.5 2.0 1.5 1.0 Process finished with exit code 0

Quatrième partie : Comment faire une opérations de tranchage sur un itérateur ?

Cas réel

Nous avons un fichier texte, nous voulons extraire le contenu d'une certaine gamme, par exemple100~300 lignes de contenu entre, le fichier texte en python est un objet itérable, pouvons-nous utiliser une méthode de tranchage de liste similaire pour obtenir100~300 lignes du générateur de contenu du fichier ?

Solution

L'utilisation de islice de la bibliothèque standard itertools peut retourner un générateur d'itérateur objet coupé

from itertools import islice f = open('access.log') # # Les premières500 lignes # islice(f, 500) # # 100 lignes suivantes # islice(f, 100, None) for line in islice(f,10)300): print(line)

islice consomme toujours l'objet itérable précédent

l = range(20) t = iter(l) for x in islice(t, 5, 10): print(x) print('Deuxième itération') for x in t: print(x)

Résultat de la sortie

C:\Python\Python35\python.exe E:/python-intensif-entraînement/s5.py 5 6 7 8 9 Deuxième itération 10 11 12 13 14 15 16 17 18 19 Processus terminé avec le code de sortie 0

Cinquième partie : Comment itérer plusieurs objets itérables dans une instruction for ?

Cas réel

1、le score final des étudiants d'une classe, le chinois, les mathématiques et l'anglais sont stockés en3dans une liste, en itérant simultanément trois listes, pour calculer le total de chaque étudiant (parallèle)

2Dans une certaine année, il y a quatre classes, et les scores d'anglais des examens de chaque classe sont stockés dans quatre listes respectivement. Itèrez à travers chaque liste, et statistiquez les scores supérieurs à90 personnes, score de 0 (séquentiel)}

Solution

Parallèle : en utilisant la fonction intégrée zip, elle peut fusionner plusieurs objets itérables, retourner un tuple à chaque itération

from random import randint # Shanghai Chinese scores, # 4) 0 personnes, les scores sont de nouveau60-10) chinese = [randint(6) 10) for _ in range(4) math = [randint(6) 10) for _ in range(4) # Anglais english = [randint(6) 10) for _ in range(4) # Mathématiques total = [] for c, m, e in zip(chinese, math, english): total.append(c + m + e) print(total)

Résultat de l'exécution suivant :

C:\Python\Python35\python.exe E:/python-intensif-entraînement/s6.py [232, 234, 259, 248, 241, 236, 245, 253, 275, 238, 24) 239, 283, 256, 232, 224, 201, 255, 206, 239, 254, 216, 287, 268, 235, 223, 289, 221, 266, 222, 231, 24) 226, 235, 255, 232, 235, 25) 241, 225] Process finished with exit code 0

Séquentiel : en utilisant la bibliothèque standard itertools.chain, elle peut connecter plusieurs objets itérables

from random import randint from itertools import chain # Générer des scores aléatoires pour quatre classes e1 = [randint(6) 10) for _ in range(4) e2 = [randint(6) 10) for _ in range(42)3 = [randint(6) 10) for _ in range(45)4 = [randint(6) 10) for _ in range(5) # Nombre par défaut de personnes=1 count = 0 for s in chain(e1, e2, e3, e4) # Si la note actuelle est supérieure à90, alors count+1 if s > 90: count += 1 print(count)

Résultat de la sortie

C:\Python\Python35\python.exe E:/python-intensif-entraînement/s6.py 48 Processus terminé avec le code de sortie 0

Résumé

Ceci est tout le contenu de cet article, j'espère que cela apportera un certain avantage à votre apprentissage ou à votre travail. Si vous avez des questions, vous pouvez laisser des commentaires pour échanger.

Vous pourriez aimer