Python迭代器

前言

此處主要記錄關於Python字符串的一些便利操作。

使用生成器函數實現可迭代對象

在 Python 中,一邊循環一邊計算的機制,稱爲生成器(Generator);
生成器是一個返回迭代器的函數,只能用於迭代操作
(yield就是專門給生成器用的return)

生成器函數

def gen():
    print('1')
    yield '111111'
    print('2')
    yield '222222'
    print('3')
    yield '333333'
g = gen()
print(g)  # <generator object gen at 0x0026BBF0>
next(g)   # 1
next(g)   # 2
next(g)   # 3
next(g, 'over')

實現可迭代對象

使__iter__yield\color{red}{使用類的\_\_iter\_\_方法實現生成器函數,每次yield返回一個素數。}

class PrimeNumbers:
	def __init__(self,start,end):
		self.start = start
		self.end = end

	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.end+1):
			if self.isPrimeNum(k):
				yield k

for x in PrimeNumbers(1,100):
	print(x)

主要用於一邊處理數據一邊顯示該條結果。

進行反向迭代

reversed(l)# 列表的方向迭代器


class FloatRange:
	def __init__(self,start,end,step=0.1):
		self.start = start
		self.end = end
		self.step =step

	def __iter__(self):
		t = self.start
		while t <= self.end:
			yield t
			t += self.step

	def __reversed__(self):
		t =self.end
		while t >= self.start:
			yield t
			t -= self.step
# 正向迭代
for x in FloatRange(1.0,4.0,0.5):
	print(x)
# 反向迭代
for x in reversed(FloatRange(1.0,4.0,0.5)):
	print(x)

使__reversed__yield\color{red}{使用類的\_\_reversed\_\_方法實現生成器函數,每次yield返回一個素數。}

迭代器切片

不支持負數操作,到末尾第三個參數爲None

from itertools import islice

l = range(20)
t = iter(l)

for x in islice(t,5,10):
	print(x)

使itertools.islice\color{red}{使用標準庫中的itertools.islice,它能返回一個迭代對象切片的生成器。}

迭代多個對象

並行迭代

from random import randint

chinese = [randint(60,100) for x in range(40)]
math = [randint(60,100) for x in range(40)]
english = [randint(60,100) for x in range(40)]

total = []
for c,m,e in zip(chinese,math,english):
	total.append(c+m+e)
print(total)

使zip\color{red}{使用內置函數zip,它將多個可迭代對象合併,每次迭代返回一個元組。}

串行迭代

from itertools import chain

a = (1,2,3)
b = ['a','c','d']


for i in chain(a,b):
	print(i)

使itertools.chain\color{red}{使用標準庫中的itertools.chain,它將多個可迭代對象鏈接。}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章