Heim > Artikel > Backend-Entwicklung > Zusammenfassung der Techniken zur Objektiteration und Anti-Iteration in Python
1. Wie implementiert man iterierbare Objekte und Iteratorobjekte?
Aktueller Fall
Eine Software erfordert das Erfassen der Geruchsinformationen verschiedener Städte aus dem Netzwerk und deren anschließende Anzeige:
北京: 15 ~ 20 天津: 17 ~ 22 长春: 12 ~ 18 ......
Wenn wir das Wetter aller Städte auf einmal erfassen und es dann anzeigen, kommt es zu einer hohen Verzögerung bei der Anzeige der Temperatur der ersten Stadt und eines Abfalls Wir gehen davon aus, dass die Zugriffsstrategie mehr Zeit in Anspruch nimmt und alle Stadttemperaturen in einem Objekt zusammengefasst werden. Sie können die for-Anweisung verwenden, um das Problem zu lösen.
Lösung
Implementieren Sie ein IteratorobjektWeatherlterator
,next
Die Methode gibt jedes Mal eine Stadttemperatur zurück und implementiert ein iterierbares ObjektWeatherlterable
,— —— Die Methode iter__ gibt ein Iteratorobjekt zurück
import requests from collections import Iterable, Iterator # 气温迭代器 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) # 可迭代对象 class WeatherIterable(Iterable): def __init__(self, cities): self.cities = cities def __iter__(self): return WeatherIterator(self.cities) for x in WeatherIterable(['北京', '上海', '广州', '深圳']): print(x)
Das Ausführungsergebnis ist wie folgt:
C:\Python\Python35\python.exe E:/python-intensive-training/s2.py 北京:低温 21℃ , 高温 30℃ 上海:低温 23℃ , 高温 26℃ 广州:低温 26℃ , 高温 34℃ 深圳:低温 27℃ , 高温 33℃ Process finished with exit code 0
2. Wie verwende ich Generatorfunktionen, um iterierbare Objekte zu implementieren?
Eigentlicher Fall
Eine Klasse, die ein iterierbares Objekt implementiert, das alle Primzahlen in einem bestimmten Bereich iterieren kann:
python pn = PrimeNumbers(1, 30) for k in pn: print(k) `` 输出结果text 2 3 5 7 11 13 17 19 23 29 “`
Lösung
- Implementieren Sie die __iter__
-Methode dieser Klasse jedes Mal in eine Generatorfunktion yield
Eine Primzahl zurückgeben
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)
Ergebnis ausführen
C:\Python\Python35\python.exe E:/python-intensive-training/s3.py 2 3 5 7 11 13 17 19 Process finished with exit code 0
3. Wie führt man eine umgekehrte Iteration durch und wie implementiert man eine umgekehrte Iteration?
Eigentlicher Fall
Implementierung eines kontinuierlichen Gleitkommagenerators FloatRange
(ähnlich rrange
), je nach Gegebenheit Bereich (start
, stop
) und Schrittwert (step
) erzeugen eine Folge kontinuierlicher Gleitkommazahlen. Durch Iterieren von FloatRange(3.0,4.0,0.2)
kann beispielsweise die Folge erzeugt werden:
正向:3.0 > 3.2 > 3.4 > 3.6 > 3.8 > 4.0 反向:4.0 > 3.8 > 3.6 > 3.4 > 3.2 > 3.0
Lösung
implementiert die Methode __reversed__
des Reverse-Iteration-Protokolls, die einen Reverse-Iterator
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("正相迭代-----") for n in FloatRange(1.0, 4.0, 0.5): print(n) print("反迭代-----") for x in reversed(FloatRange(1.0, 4.0, 0.5)): print(x)
Ergebnisse ausgeben
C:\Python\Python35\python.exe E:/python-intensive-training/s4.py 正相迭代----- 1.0 1.5 2.0 2.5 3.0 3.5 4.0 反迭代----- 4.0 3.5 3.0 2.5 2.0 1.5 1.0 Process finished with exit code 0
4 . Wie führen Slicing-Operationen auf Iteratoren aus?
Aktueller Fall
Lösung
Verwenden Sie aus der Standardbibliothek, die einen Generator für Slices von Iteratorobjekten zurückgibt itertools.islice
from itertools import islice f = open('access.log') # # 前500行 # islice(f, 500) # # 100行以后的 # islice(f, 100, None) for line in islice(f,100,300): print(line)Jede Trainingssitzung von islice verbraucht das vorherige Iterationsobjekt
l = range(20) t = iter(l) for x in islice(t, 5, 10): print(x) print('第二次迭代') for x in t: print(x)
Ausgabeergebnisse
C:\Python\Python35\python.exe E:/python-intensive-training/s5.py 5 6 7 8 9 第二次迭代 10 11 12 13 14 15 16 17 18 19 Process finished with exit code 0
5. Wie iteriere ich mehrere iterierbare Objekte in einer for-Anweisung?
Aktueller Fall
Lösung
Parallel: Integrierte Funktion verwenden, es können mehrere iterierbare Objekte zusammengeführt werden und jede Iteration gibt ein Tupel zurück zip
from random import randint # 申城语文成绩,# 40人,分数再60-100之间 chinese = [randint(60, 100) for _ in range(40)] math = [randint(60, 100) for _ in range(40)] # 数学 english = [randint(60, 100) for _ in range(40)] # 英语 total = [] for c, m, e in zip(chinese, math, english): total.append(c + m + e) print(total)
Die Ausführungsergebnisse lauten wie folgt:
C:\Python\Python35\python.exe E:/python-intensive-training/s6.py [232, 234, 259, 248, 241, 236, 245, 253, 275, 238, 240, 239, 283, 256, 232, 224, 201, 255, 206, 239, 254, 216, 287, 268, 235, 223, 289, 221, 266, 222, 231, 240, 226, 235, 255, 232, 235, 250, 241, 225] Process finished with exit code 0Seriell: Verwenden Sie
aus der Standardbibliothek, die mehrere iterierbare Objekte verketten kann itertools.chain
from random import randint from itertools import chain # 生成四个班的随机成绩 e1 = [randint(60, 100) for _ in range(40)] e2 = [randint(60, 100) for _ in range(42)] e3 = [randint(60, 100) for _ in range(45)] e4 = [randint(60, 100) for _ in range(50)] # 默认人数=1 count = 0 for s in chain(e1, e2, e3, e4): # 如果当前分数大于90,就让count+1 if s > 90: count += 1 print(count)
Ausgabeergebnis
C:\Python\Python35\python.exe E:/python-intensive-training/s6.py 48 Process finished with exit code 0
Zusammenfassung
Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass er hilfreich sein wird Jedermanns Studium oder Arbeit. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Weitere verwandte Artikel, die die Techniken der Objektiteration und Anti-Iteration in Python zusammenfassen, finden Sie auf der chinesischen PHP-Website!