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

Techniken zur Iteration und Antireiteration in Python

1. Wie kann man iterierbare und iteratormäßige Objekte realisieren?

Echter Fall

Ein Softwareanwendung erfordert das Abrufen von Stadtweatherinformationen aus dem Internet und deren Anzeige:

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

Wenn alle Stadtweather gleichzeitig abgerufen und angezeigt werden, gibt es eine erhebliche Verzögerung beim Anzeigen der Temperatur der ersten Stadt und eine verschwendete Speicherplatz, wir erwarten eine Strategie, die auf Benutzung basiert, und alle Stadttemperaturen in ein Objekt einpackt, das mit einem for-Satz iteriert werden kann, wie kann man das lösen?

0 Punkte (Reihenfolge)

Implementieren Sie ein Iteratormodell Weatherlterator, das die Methode next verwendet, um eine Stadttemperatur zurückzugeben, und ein iterierbares Modell Weatherlterable, das die Methode iter__ verwendet, um ein Iteratormodell zurückzugeben

import requests from collections import Iterable, Iterator # Temperatur-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) # Eine iterierbare Objekt class WeatherIterable(Iterable): def __init__(self, cities): self.cities = cities def __iter__(self): return WeatherIterator(self.cities) for x in WeatherIterable(['北京', '上海', '广州', '深圳']): print(x)

e) print(total)

C:\Python\Python35\python.exe E:/python-intensiv-training/s2.py Peking: niedrige Temperatur 21℃ , hohe Temperatur 30℃ Shanghai: niedrige Temperatur 23℃ , hohe Temperatur 26℃ Guangzhou: niedrige Temperatur 26℃ , hohe Temperatur 34℃ Shenzhen: niedrige Temperatur 27℃ , hohe Temperatur 33℃ Prozess beendet mit Ausgangscode 0

Zwei: Wie kann man iterierbare Objekte durch Generatorfunktionen implementieren?

Echter Fall

Implementierung einer klasse für iterierbare Objekte, die alle Primzahlen im angegebenen Bereich iterieren kann:

python pn = PrimeNumbers(1.py [ 30) for k in pn: print(k) `` Ausgabeergebnis text
2 3 5 7 11 13 17 19 23 29
„`

0 Punkte (Reihenfolge)

-Implementierung der Methode __iter__ der Klasse als Generatorfunktion, die bei jedem Aufruf von yield einen Primzahl zurückgibt

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.py [ 20): print(x)

Laufende Ergebnisse

C:\Python\Python35\python.exe E:/python-intensiv-training/s3.py 2 3 5 7 11 13 17 19 Prozess beendet mit Ausgabecode 0

Drei: Wie führt man umgekehrte Iteration durch und wie wird umgekehrte Iteration implementiert?

Echter Fall

Implementierung eines kontinuierlichen Fließkommazahlers FloatRange (ähnlich wie rrange), der eine Reihe kontinuierlicher Fließkommazahlen auf der Grundlage des angegebenen Bereichs (start, stop) und des Schrittwerts (step) erzeugt, wie durch Iteration über FloatRange(3.0,4.0,0.2) kann eine Sequenz erzeugen:

Vorwärts:3.0 > 3.2 > 3.4 > 3.6 > 3.8 > 4.0 Umgekehrt:4.0 > 3.8 > 3.6 > 3.4 > 3.2 > 3.0

0 Punkte (Reihenfolge)

Implementierung des umgekehrten Iterationsprotokolls durch die Methode __reversed__, die einen umgekehrten Iterationsiterator zurückgibt

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("Forward Iteration",-----") for n in FloatRange(1.0, 4.0, 0.5)): print(n) print("Reverse Iteration",-----") for x in reversed(FloatRange(1.0, 4.0, 0.5)): print(x)

Ausgabeergebnis

C:\Python\Python35\python.exe E:/python-intensiv-training/s4.py Forward Iteration----- 1.0 1.5 2.0 2.5 3.0 3.5 4.0 Reverse Iteration----- 4.0 3.5 3.0 2.5 2.0 1.5 1.0 Prozess beendet mit Ausgabecode 0

IV

Echter Fall

Es gibt eine bestimmte Textdatei, die wir durchgehen möchten, z.B.100~300 Zeilen zwischen dem Inhalt, ob die Textdatei in Python ein iterierbares Objekt ist, ob wir eine ähnliche Liste-Schneide-Methode verwenden können, um einen100~300 Zeilen des Dateiinhalts zu generieren?

0 Punkte (Reihenfolge)

Verwenden Sie den Standardbibliothek von itertools.islice, um eine Generator-Objekt-Schneide-Generator zurückzugeben

von itertools import islice f = open('access.log') # # Die ersten500 Zeilen # islice(f, 500) # # 100 Zeilen nach dem # islice(f, 100, None) for line in islice(f,10) = [randint(300): print(line)

islice每次调用都会消耗之前的迭代对象

l = range(20) t = iter(l) for x in islice(t, 5.py [ 10): print(x) print('Zweite Iteration') for x in t: print(x)

Ausgabeergebnis

C:\Python\Python35\python.exe E:/python-intensiv-training/s5.py 5 6 7 8 9 Zweite Iteration 10 11 12 13 14 15 16 17 18 19 Prozess beendet mit Ausgabecode 0

V

Echter Fall

1Die Endfachergebnisse der Schüler eines Klassen, Chinesisch, Mathematik und Englisch sind in3In einer Liste, gleichzeitig durch drei Listen zu iterieren, um die Gesamtpunkte jedes Schülers zu berechnen (parallel)

2In einer bestimmten Klasse gibt es vier Klassen, und die Englischergebnisse der Klassen in einer bestimmten Prüfung sind in vier Listen gespeichert. Iterieren Sie durch jede Liste, um die Noten der gesamten Schuljahr zu überwachen, die höher sind als90分人数(串行)

0 Punkte (Reihenfolge)

Lösung

Parallel: Mit dem eingebauten Funktion zip, kann mehrere iterierbare Objekte kombiniert werden,每次迭代返回一个元组 4from random import randint # Shanghaischinese Punkte, #60-10) 0 Menschen, Punkte noch6) = [randint( 10) for _ in range(4) chinese = [randint(6) = [randint( 10) for _ in range(4) math = [randint(6) = [randint( 10) for _ in range(4) # Mathematik english = [randint( + ) # Englisch total = [] for c, m, e in zip(chinese, math, english): total.append(c + m

e) print(total)

C:\Python\Python35\python.exe E:/python-intensiv-training/s6Ausführungsresultat wie folgt:232.py [ 234.py [ 259.py [ 248.py [ 241.py [ 236.py [ 245.py [ 253.py [ 275.py [ 238.py [ 24) = [randint( 239.py [ 283.py [ 256.py [ 232.py [ 224.py [ 201.py [ 255.py [ 206.py [ 239.py [ 254.py [ 216.py [ 287.py [ 268.py [ 235.py [ 223.py [ 289.py [ 221.py [ 266.py [ 222.py [ 231.py [ 24) = [randint( 226.py [ 235.py [ 255.py [ 232.py [ 235.py [ 25) = [randint( 241.py [ 225,

] Prozess beendet mit Ausgabecode 0

Reihenfolge: Mit dem Standardbibliotheksfunktion itertools.chain, kann mehrere iterierbare Objekte verbunden werden1 ) e6) = [randint( 10) for _ in range(4from random import randint from itertools import chain # Erzeugung von zufälligen Noten für vier Klassen e2 ) e6) = [randint( 10) for _ in range(42) e3 ) e6) = [randint( 10) for _ in range(45) e4 ) e6) = [randint( 10) for _ in range(5) # Standardanzahl der Personen=1 count = 0 for s in chain(e1, e2, e3, e4) # Wenn die aktuelle Punktzahl größer als90, dann lasse count+1 if s > 90: count += 1 print(count)

Ausgabeergebnis

C:\Python\Python35\python.exe E:/python-intensiv-training/s6.py 48 Prozess beendet mit Ausgabecode 0

Zusammenfassung

Das ist der gesamte Inhalt dieses Artikels, ich hoffe, er bringt Ihnen einiges an Hilfe bei Lernen oder Arbeit, wenn Sie Fragen haben, hinterlassen Sie bitte Kommentare.

Vielleicht gefällt dir auch