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

Resumen de técnicas de iteración y anti-iteración de objetos en Python

Primero, ¿cómo implementar objetos iterables e iteradores?

Caso de estudio

Un software requiere obtener información de olor de las ciudades de la red y mostrarla a continuación:

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

Si se recogen todas las condiciones meteorológicas de las ciudades al mismo tiempo y se muestran, hay un gran retraso al mostrar la temperatura de la primera ciudad y se desperdicia espacio de almacenamiento, esperamos una estrategia de acceso en tiempo y encapsular todas las temperaturas de las ciudades en un objeto, que se puede iterar con una declaración for, ¿cómo resolverlo?

Solución

Implementar un objeto iterador Weatherlterator, el método next devuelve una temperatura de la ciudad, implementar un objeto iterable Weatherlterable, el método iter__ devuelve un objeto iterador

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

Resultados de la ejecución:

C:\Python\Python35\python.exe E:/python-intensivo-entrenamiento/s2.py Beijing: baja temperatura 21℃ , alta temperatura 30℃ Shanghai: baja temperatura 23℃ , alta temperatura 26℃ Guangzhou: baja temperatura 26℃ , alta temperatura 34℃ Shenzhen: baja temperatura 27℃ , alta temperatura 33℃ Finalizado el proceso con código de salida 0

Dos, ¿cómo usar la función generadora para implementar un objeto iterable?

Caso de estudio

Implementar una clase de objeto iterable que pueda iterar todos los números primos en el rango dado:

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

Solución

-Implementar la función generadora del método __iter__ de la clase, que devuelve un número primo yield cada vez

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)

Resultados de la ejecución

C:\Python\Python35\python.exe E:/python-intensivo-entrenamiento/s3.py 2 3 5 7 11 13 17 19 Proceso finalizado con código de salida 0

Tres, ¿cómo realizar la iteración inversa y cómo implementarla?

Caso de estudio

Implementar un generador de números de punto flotante continuos FloatRange (simil a rrange), que genere una serie de números de punto flotante continuos en función del rango dado (start, stop) y el valor de paso (step), como en la iteración FloatRange(3.0,4.0,0.2) puede generar una secuencia:

Directa:3.0 > 3.2 > 3.4 > 3.6 > 3.8 > 4.0 Inversa:4.0 > 3.8 > 3.6 > 3.4 > 3.2 > 3.0

Solución

realizar el protocolo de iteración inversa del método __reversed__, que devuelve un iterador inverso

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("Iteración directa",-----") for n in FloatRange(1.0, 4.0, 0.5): print(n) print("Iteración inversa",-----") for x in reversed(FloatRange(1.0, 4.0, 0.5)): print(x)

Resultado de la salida

C:\Python\Python35\python.exe E:/python-intensivo-entrenamiento/s4.py Iteración directa----- 1.0 1.5 2.0 2.5 3.0 3.5 4.0 Iteración inversa----- 4.0 3.5 3.0 2.5 2.0 1.5 1.0 Proceso finalizado con código de salida 0

Cuatro, ¿cómo hacer una operación de rebanado de iterador?

Caso de estudio

Hay algún archivo de texto, queremos obtener el contenido de cierta gama de él, como100~300 línea entre el contenido, el archivo de texto chino de Python es un objeto iterable, ¿podemos obtener un100~300 línea del generador de contenido del archivo?

Solución

Usando el módulo estándar de itertools.islice, puede devolver un generador de un objeto de corta porción de iterador

from itertools import islice f = open('access.log') # # Antes500 línea # islice(f, 500) # # 100 línea posterior # islice(f, 100, None) for line in islice(f,100,300): print(line)

islice siempre consume el objeto de iteración anterior

l = range(20) t = iter(l) for x in islice(t, 5, 10): print(x) print('Segunda iteración') for x in t: print(x)

Resultado de la salida

C:\Python\Python35\python.exe E:/python-intensivo-entrenamiento/s5.py 5 6 7 8 9 Segunda iteración 10 11 12 13 14 15 16 17 18 19 Proceso finalizado con código de salida 0

Cinco, ¿cómo iterar múltiples objetos iterables en una declaración for?

Caso de estudio

1Resultados de los exámenes fin de año de los estudiantes de una clase, chino, matemáticas, inglés se almacenan en3En una lista, se itera tres listas al mismo tiempo, calculando el total de puntos de cada estudiante (en paralelo)

2En una certaina edad, hay cuatro clases, y en una prueba, los resultados de inglés de cada clase se almacenan en cuatro listas, se itera cada lista sucesivamente, y se estadísticamente los resultados de los estudiantes de todo el año que son superiores a90 personas (secuencia)

Solución

Paralelo: Utilizando la función integrada zip, que puede combinar varios objetos iterables, devolviendo un tupla en cada iteración

from random import randint # Puntuaciones de chino, # 40 personas, las puntuaciones de nuevo60-100之间 chinese = [randint(60, 100) for _ in range(40)] math = [randint(60, 100) for _ in range(40)] # Inglés english = [randint(60, 100) for _ in range(40)] # Matemáticas total = [] for c, m, e in zip(chinese, math, english): total.append(c + m + e) print(total)

Resultados de la ejecución:

C:\Python\Python35\python.exe E:/python-intensivo-entrenamiento/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] Proceso finalizado con código de salida 0

Secuencia: Utilizando la biblioteca estándar itertools.chain, que puede conectar varios objetos iterables

from random import randint from itertools import chain # Generar calificaciones aleatorias de cuatro clases1 = [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)] # Número de personas predeterminado=1 count = 0 for s in chain(e1, e2, e3, e4) # Si la puntuación actual es mayor que90, entonces count+1 if s > 90: count += 1 print(count)

Resultado de la salida

C:\Python\Python35\python.exe E:/python-intensivo-entrenamiento/s6.py 48 Proceso finalizado con código de salida 0

Resumen

Esto es todo el contenido de este artículo, espero que pueda ayudar a todos en sus estudios o trabajo, si tienen alguna pregunta, pueden dejar un mensaje para intercambiar.

Te gustará