python中的迭代
2018/01/23
posted in
Python
2018/01/23
posted in
Python
在python
中,迭代是一个很重要的概念,当我们使用各种循环的时候,我们就会用到这个概念,比如:for循环
。
而for
是如何工作的?自己如何在类中实现迭代?下面我们就来了解一下:
首先,我们要了解几个概念:迭代
、可迭代对象
、迭代器
。
迭代
是一种惰性获取数据的方式,每次返回一个值。
可迭代对象
,按照字面意思就是可迭代的对象,在Python
中,一个可迭代对象都可以通过内置函数iter()
返回一个迭代器。而iter()
函数则会检查对象中有没有实现__iter__()
函数,如果有则调用__iter__()
返回一个可迭代对象,如果没有,则检查是否实现了__getitem__()
函数,如果有则根据__getitem__()函数生成一个迭代器,按顺序获取元素,如果都没有,则抛出异常,表明对象不可迭代。
迭代器
实现了__next__()
函数,可以返回下一个元素,如果没有下一个元素则返回StopIteration
的异常。
而我们在提起迭代器的时候,通常还会提起另一个概念生成器
。
生成器
是一种特殊的迭代器,它能够更优雅的实现迭代器的功能。生成器的特征是使用yield关键字,而不使用__iter__()
和__next__()
内置函数。
# 返回从0开始整数的累加值,大于100结束
# 迭代器
class myIter():
def __init__(self):
self.count = 0
self.sum = 0
def __iter__(self):
return self
def __next__(self):
self.sum += self.count
self.count += 1
return self.sum
if __name__ == "__main__":
a = myIter()
for i in a:
print(i)
if i > 100:
break
# 返回从0开始整数的累加值,大于100结束
# 生成器
def myGen():
count, sum = 0, 0
while True:
yield sum
count += 1
sum += count
if __name__ == "__main__":
a = myGen()
for i in a:
print(i)
if i > 100:
break
我们可以看到使用生成器
实现的代码看起来更简介,更pythonic。
使用迭代器
时我们需要先创建一个类,然后在类里实现__iter__()
和__next__()
两个内置函数。
而使用生成器
时,我们只需要定义一个函数,在函数中使用yield
做返回,也不需要return
。
同样的还有生成器表达式
,它看起来像一个列表表达式
,但是它使用的是()
而不是[]
,并且它返回的是一个生成器对象
,而不是列表
。
# 列表表达式
[x+1 for x in range(10)]
# 生成器表达式
(x+1 for x in range(10))