Pythonでのオブジェクト反復と反反復のテクニックのまとめ

5979 ワード

一、反復可能なオブジェクトと反復可能なオブジェクトをどのように実現しますか?
実例
あるソフトウェアでは、ネットワークから各都市のにおい情報をキャプチャし、次に表示する必要があります.

  : 15 ~ 20   : 17 ~ 22   : 12 ~ 18 ......

すべての都市の天気を一度に捕まえて表示し、最初の都市の気温を表示すると、高い遅延があり、記憶空間を浪費し、時間でアクセスする戦略を期待し、すべての都市の気温を1つのオブジェクトにカプセル化し、for文で反復することができます.どうすれば解決しますか.
ソリューション
反復器オブジェクトWeatherlteratornextを実現する方法は、1つの都市の気温を返すたびに、反復可能なオブジェクトWeatherlterableを実現する.メソッドは反復オブジェクトを返します

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

二、ジェネレータ関数を使用して反復可能なオブジェクトを実装する方法
実例
指定した範囲内のすべての素数を反復できる反復可能なオブジェクトのクラスを実現します.

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

ソリューション
-クラスの__iter__メソッドを生成器関数に実装し、yieldごとに1つの素数を返す

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

三、どのように逆反復を行い、どのように逆反復を実現しますか?
実例
連続浮動小数点数生成器FloatRange(rrangeと同様)が実装され、反復startのようないくつかの列連続浮動小数点数が、所与の範囲(stopstep)およびステップ値(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

四、反復器をどのようにスライス操作しますか?
実例
あるテキストファイルがあって、私たちはすべてその中のある範囲の内容、例えば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:\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

五、1つのfor文で複数の反復可能なオブジェクトを反復する方法
実例
1、あるクラスの学生の期末試験の成績、国語、数学、英語はそれぞれ更に3つのリストの中で保存して、同時に3つのリストを反復して、各学生の総得点(並列)を計算します
2、ある年には4つのクラスがあり、ある試験の無クラスの英語の成績はそれぞれ4つのリストに保存され、各リストを順次反復し、全学年の成績が90点以上の人数を統計する(シリアル)
ソリューション
パラレル:内蔵関数zipを使用して、複数の反復可能オブジェクトを結合し、反復するたびに1つのメタグループを返します.

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

シリアル:複数の反復可能オブジェクトを接続できる標準ライブラリの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

まとめ
以上はこの文章のすべての内容で、みんなの学习あるいは仕事に対して一定の助けをもたらすことを望んで、もし疑问があればみんなは伝言を残して交流することができます.