English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
1. 이터레이블 객체와 이터레이터 객체를 어떻게 구현할 수 있을까요?
실제 사례
어떤 소프트웨어는 각 도시의 날씨 정보를 네트워크에서 가져오고 그 다음 표시합니다:
베이징: 15 ~ 20塘沽: 17 ~ 22 장치: 12 ~ 18 ......
모든 도시의 날씨를 동시에 가져오고 표시하는 경우, 첫 번째 도시의 기온을 표시할 때 높은 지연이 발생하며, 저장 공간을 낭비합니다. 우리는 시간에 따라 접근하는 전략을 사용하고, 모든 도시의 기온을 객체에 포장하여 for 문을 통해 이터레이션할 수 있기를 원합니다. 어떻게 해결할 수 있을까요?
해결책
실현하려면 이터레이터 객체 Weatherlterator의 next 메서드는 매번 한 도시의 기온을 반환하며, 이터레이블 객체 Weatherlterable의 iter__ 메서드는 이터레이터 객체를 반환합니다
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(['베이징', '상하이', '광zhou', 'شان진']): print(x)
실행 결과는 다음과 같습니다:
C:\파이썬\파이썬35\파이썬.exe E:/파이썬-집중적인-훈련/s2.py北京:저온 21℃ 고온 30℃上海:저온 23℃ 고온 26℃广州:저온 26℃ 고온 34℃深圳:저온 27℃ 고온 33℃ 프로세스가 종료되었습니다. 종료 코드 0
2. 생성자 함수를 사용하여 이터레이블 객체를 구현하는 방법은 어떻게 됩니까?
실제 사례
주어진 범위 내 모든 소수를 이터레이션할 수 있는 클래스를 구현합니다
python pn = PrimeNumbers(1, 30) for k in pn: print(k) `` 출력 결과 text 2 3 5 7 11 13 17 19 23 29 “`
해결책
-이 클래스의 __iter__ 메서드를 생성자 함수로 구현하여, 매번 yield를 반환하는 하나의 소수를 생성합니다
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)
실행 결과
C:\파이썬\파이썬35\파이썬.exe E:/파이썬-집중적인-훈련/s3.py 2 3 5 7 11 13 17 19 프로세스가 종료되었습니다. 종료 코드 0
3. 어떻게 역방향 이터레이션을 수행하며, 어떻게 역방향 이터레이션을 구현할 수 있습니까?
실제 사례
연속 실수 생성기 FloatRange(와 rrange와 유사하게)를 구현하며, 주어진 범위(start, stop)과 진행치(step)에 따라 일련의 연속 실수를 생성합니다. 예를 들어, FloatRange(3.0,4.0,0.2) 시퀀스를 생성할 수 있습니다:
정방향:3.0 > 3.2 > 3.4 > 3.6 > 3.8 > 4.0 역방향:4.0 > 3.8 > 3.6 > 3.4 > 3.2 > 3.0
해결책
역방향 이터레이션 프로토콜을 구현한 __reversed__ 메서드, 그는 역방향 이터레이터를 반환합니다
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)
출력 결과
C:\파이썬\파이썬35\파이썬.exe E:/파이썬-집중적인-훈련/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. 이터러블 객체에 대해 쉼터 작업을 어떻게 수행할 수 있을까요?
실제 사례
문자 파일이 있는 경우, 특정 범위의 내용을 모두 가져오고 싶다면, 예를 들어100~300행 사이의 내용을 python의 텍스트 파일은 이터러블 객체이며, 리스트 쉼터와 유사한 방식으로 이를 얻을 수 있을까요?100~300행 파일 내용의 생성기를 얻을 수 있을까요?
해결책
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)
islice는 이전 이터러블 객체를 소모합니다.
l = range(20) t = iter(l) for x in islice(t, 5, 10): print(x) print('第二次迭代') for x in t: print(x)
출력 결과
C:\파이썬\파이썬35\파이썬.exe E:/파이썬-집중적인-훈련/s5.py 5 6 7 8 9 第二次迭代 10 11 12 13 14 15 16 17 18 19 프로세스가 종료되었습니다. 종료 코드 0
5. for 문에서 여러 가지 이터러블 객체를 어떻게 반복할 수 있을까요?
실제 사례
1어느 반의 학생들의 학기말 시험 성적, 국어, 수학, 영어는 각각 저장되어 있습니다.3리스트 중에서 동시에 세 개의 리스트를 반복하여, 각 학생의 총점(평행)을 계산합니다.
2어느 학년에는 네 개의 반이 있으며, 그 중 한 번의 시험에서 각 반의 영어 성적이 네 개의 리스트에 각각 저장되어 있습니다. 각 리스트를 순차적으로 반복하여, 전 학년 성적이 높은90점 인원 수(시리얼)
해결책
파라렐: 내장 함수 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)
실행 결과는 다음과 같습니다:
C:\파이썬\파이썬35\파이썬.exe E:/파이썬-집중적인-훈련/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] 프로세스가 종료되었습니다. 종료 코드 0
시리얼: 표준 라이브러리의 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)
출력 결과
C:\파이썬\파이썬35\파이썬.exe E:/파이썬-집중적인-훈련/s6.py 48 프로세스가 종료되었습니다. 종료 코드 0
결론
이 기사의 모든 내용이 끝납니다. 여러분의 학습이나 업무에 도움이 되길 바랍니다. 궁금한 점이 있으면 댓글로 질문해 주세요.