強(qiáng)化訓(xùn)練:第三篇
問題來源
- pythoner面試經(jīng)常會(huì)問到迭代器和生成器的區(qū)別
內(nèi)容
- 可迭代對(duì)象
- 迭代器:正向迭代, 反向迭代
- 生成器:
1.
可迭代對(duì)象/ 迭代器
for 語句對(duì)對(duì)象調(diào)用了 iter()方法, 使用next()方法
內(nèi)置函數(shù):iter()可以獲取迭代器對(duì)象,使用迭代器的next()方法可以訪問下一個(gè)元素
for element in [1, 2, 3]:
print(element)
for element in "abcdef":
print(element)
for key in {"one": 1, "two": 2}:
print(key)
dir(str)
dir(dict)
dir(list)
都存在 類似于__iter__的接口, 稱之為可迭代對(duì)象.可迭代對(duì)象返回迭代器對(duì)象。
實(shí)現(xiàn)可迭代對(duì)象, 可迭代對(duì)象實(shí)現(xiàn)迭代器對(duì)象
迭代器是訪問集合內(nèi)元素的一種方式。迭代器對(duì)象從集合的第一個(gè)元素開始訪問,直到所有的元素都被訪問一遍后結(jié)束。
from collections import Iterable, Iterator
class RangeInt(Iterator):
def __init__(self, start, end, step):
self.start = start
self.end = end
self.step = step
def __next__(self):
if self.start > self.end:
raise StopIteration
t = self.start
self.start += self.step
return t
class RangeInt_Iterable(Iterable):
def __init__(self, start, end, step):
self.start = start
self.end = end
self.step = step
def __iter__(self):
return RangeInt(self.start, self.end, self.step)
for i in RangeInt_Iterable(0, 10, 1):
print(i)
2.
生成器可迭代對(duì)象
關(guān)鍵字:yield
返回區(qū)間內(nèi)的素?cái)?shù)
class NumBer(object):
def __init__(self, start, end):
self.start = start
self.end = end
def isshu(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 j in range(self.start, self.end):
if self.isshu(j):
yield j
number = NumBer(0, 100)
for i in number:
print(i)
生成器表達(dá)式:
`a = (i for i in range(5))`
`type(a)# class 'generator'`
列表解析式:
`b = [i for i in range(5)]`
`type(b)# class list`
字典解析式:
`c= {k:randint(10,20) for k in "xyzabc"}`
`type(c)# class dict`
集合解析式:
`e = {j for j in range(5)}`
`type(e)# class set`
3.
L = list(range(5))
如何反向迭代:
方法1:
for i in L.reverse():
print (i) # L被反向
方法2:
for i in L[::-1]:
print(i) # 創(chuàng)建 一個(gè)新的list
方法3:
for i in reversed(L):
print(i)
反向迭代:內(nèi)置函數(shù)reversed()實(shí)現(xiàn)
__reversed__接口
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 reversed(FloatRange(1.0, 4.0, 0.5)):
print x
4.
總結(jié)
迭代(iteration)就是對(duì)可迭代對(duì)象(iterables,實(shí)現(xiàn)了__iter__()方法)和迭代器(iterators,實(shí)現(xiàn)了__next__()方法)的一個(gè)操作過程??傻鷮?duì)象是任何可返回一個(gè)迭代器的對(duì)象,迭代器是應(yīng)用在迭代對(duì)象中迭代的對(duì)象,換一種方式說的話就是:iterable對(duì)象的__iter__()方法可以返回iterator對(duì)象,iterator通過調(diào)用next()方法獲取其中的每一個(gè)值.
生成器是迭代器的一種, 存在關(guān)鍵字yield。