Python 强化训练:第三篇
2016-11-01 本文已影响177人
谢小路
强化训练:第三篇
问题来源
- pythoner面试经常会问到迭代器和生成器的区别
内容
- 可迭代对象
- 迭代器:正向迭代, 反向迭代
- 生成器:
1.
可迭代对象/ 迭代器
for 语句对对象调用了 iter()方法, 使用next()方法
内置函数:iter()可以获取迭代器对象,使用迭代器的next()方法可以访问下一个元素
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__
的接口, 称之为可迭代对象.可迭代对象返回迭代器对象。
实现可迭代对象, 可迭代对象实现迭代器对象
迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。
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.
生成器可迭代对象
关键字:yield
返回区间内的素数
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)
生成器表达式:
`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) # 创建 一个新的list
方法3:
for i in reversed(L):
print(i)
反向迭代:内置函数reversed()实现
__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.
总结
迭代(iteration)就是对可迭代对象(iterables,实现了__iter__()
方法)和迭代器(iterators,实现了__next__()
方法)的一个操作过程。可迭代对象是任何可返回一个迭代器的对象,迭代器是应用在迭代对象中迭代的对象,换一种方式说的话就是:iterable对象的__iter__()
方法可以返回iterator对象,iterator通过调用next()方法获取其中的每一个值.
生成器是迭代器的一种, 存在关键字yield。