Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung der Techniken zur Objektiteration und Anti-Iteration in Python

Zusammenfassung der Techniken zur Objektiteration und Anti-Iteration in Python

高洛峰
高洛峰Original
2017-02-22 17:10:261099Durchsuche

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,nextDie 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 yieldEine 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

Es gibt eine bestimmte Textdatei und wir möchten einen bestimmten Inhaltsbereich entfernen, z. B. 100 ~300 Zeilen Der Inhalt zwischen Textdateien in Python ist ein iterierbares Objekt. Können wir eine dem List-Slicing ähnliche Methode verwenden, um einen Generator für Dateiinhalte zwischen 100 und 300 Zeilen zu erhalten?

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(&#39;access.log&#39;) # # 前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(&#39;第二次迭代&#39;) 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

1. Die Abschlussprüfungsergebnisse einer bestimmten Klasse von Schülern, Chinesisch, Mathematik und Englisch, werden gespeichert in jeweils 3 Listen, iterieren Sie drei Listen gleichzeitig, berechnen Sie die Gesamtpunktzahl jedes Schülers (parallel)


2. Es gibt vier Klassen in einem bestimmten Alter und die Englischnoten von Jede Klasse in einem bestimmten Test wird jeweils in vier Listen gespeichert. Durchlaufen Sie jede Liste der Reihe nach und zählen Sie die Anzahl der Personen, deren Punktzahl im gesamten Schuljahr (Serie) höher ist als 90 Punkte.


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 0

Seriell: 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!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn