>  기사  >  백엔드 개발  >  Python의 객체 반복 및 반복 방지 기술 요약

Python의 객체 반복 및 반복 방지 기술 요약

高洛峰
高洛峰원래의
2017-02-22 17:10:261092검색

1. iterable 객체와 iterator 객체는 어떻게 구현하나요?

실제 사례

소프트웨어는 네트워크에서 여러 도시의 냄새 정보를 가져와 다음에 표시해야 합니다.

北京: 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(['北京', '上海', '广州', '深圳']): print(x)

를 반환합니다. 실행 결과는 다음과 같습니다.

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. 생성기 함수를 사용하여 반복 가능한 객체를 구현하는 방법은 무엇입니까?

실제 사례

주어진 범위의 모든 소수를 반복할 수 있는 반복 가능한 객체를 구현하는 클래스:

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:\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. 역반복은 어떻게 수행하고 역반복은 어떻게 구현하나요?

실제 사례

주어진 내용에 따라 연속 부동 소수점 생성기 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:\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. 반복자를 슬라이스하는 방법은 무엇입니까?

실제 사례

특정 텍스트 파일이 있는데, 100 등 특정 범위의 내용을 삭제하고 싶습니다. ~300줄 Python에서 텍스트 파일 사이의 내용은 반복 가능한 객체입니다. 목록 분할과 유사한 방법을 사용하여 100~300줄 사이의 파일 내용 생성기를 얻을 수 있습니까?

해결책

반복자 객체 조각에 대한 생성기를 반환하는 표준 라이브러리의

을 사용하세요. 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)

islice의 모든 훈련 세션은 이전 반복 객체를 사용합니다

l = range(20) t = iter(l) for x in islice(t, 5, 10): print(x) print(&#39;第二次迭代&#39;) for x in t: print(x)

출력 결과

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. for 문에서 반복 가능한 여러 개체를 어떻게 반복합니까?

실제

1. 특정 학생의 중국어, 수학, 영어 기말고사 결과가 저장됩니다. 3개의 목록에서 각각 3개의 목록을 동시에 반복하여 각 학생의 총점을 (병렬로) 계산합니다


2. 특정 연령에는 4개의 수업이 있으며, 영어 점수는 특정 시험의 각 학급은 각각 4개의 목록에 저장됩니다. 각 목록을 차례로 반복하여 전체 학년(연속)에서 점수가 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:\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

Serial: 표준 라이브러리의

사용 , 여러 반복 가능한 객체를 연결할 수 있음 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:\Python\Python35\python.exe E:/python-intensive-training/s6.py 48 Process finished with exit code 0

요약

위 내용이 모두의 공부나 업무에 도움이 되었으면 좋겠습니다. 질문이 있으면 메시지를 남겨서 소통할 수 있습니다.

Python의 객체 반복 및 반복 방지 기술을 요약한 관련 기사를 더 보려면 PHP 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.