赞
踩
容器是用来储存元素的一种数据结构,容器将所有数据保存在内存中,Python中典型的容器有:list,set,dict,str等等。
class test():
def __init__(self,data=1):
self.data = data
def __iter__(self):
return self
def __next__(self):
if self.data > 5:
raise StopIteration
else:
self.data+=1
return self.data
for item in test(3):
print(item)
输出为:
4
5
6
for … in… 这个语句其实做了两件事。
- 第一件事是获得一个可迭代器,即调用了__iter__()函数。
- 第二件事是循环的过程,循环调用__next__()函数。
对于test这个类来说,它定义了__iter__和__next__函数,所以是一个可迭代的类,也可以说是一个可迭代的对象(Python中一切皆对象)。
含有__next__()函数的对象都是一个迭代器,所以test也可以说是一个迭代器。如果去掉__itet__()函数,test这个类也不会报错。如下代码所示:
class test():
def __init__(self,data=1):
self.data = data
def __next__(self):
if self.data > 5:
raise StopIteration
else:
self.data+=1
return self.data
t = test(3)
for i in range(3):
print(t.__next__())
输出为:
4
5
6
生成器是一种特殊的迭代器。当调用fib()函数时,生成器实例化并返回,这时并不会执行任何代码,生成器处于空闲状态,注意这里prev, curr = 0, 1并未执行。然后这个生成器被包含在list()中,list会根据传进来的参数生成一个列表,所以它对fib()对象(一切皆对象,函数也是对象)调用__next()__方法,
def fib(end = 1000):
prev,curr=0,1
while curr < end:
yield curr
prev,curr=curr,curr+prev
print(list(fib()))
输出为:
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
什么是可迭代的对象?(Iterable,即可以用for循环的对象)和迭代器(Iterator)
Iterable:
- 一类是:list、tuple、dict、set、str
- 二类是:generator(都是Iterator对象),包含生成器和带yield的generator function 生成器不但可以作用于for,还可以被next函数不断调用并且返回下一个值,可以被next函数不断调用返回下一个值的对象称为迭代器(Iterator)。
可迭代的对象如list、dict等需要用iter()函数转化成Iterator。
描述:
next() 返回迭代器的下一个项目。
next() 函数要和生成迭代器的iter() 函数一起使用。
语法:
next 语法:
next(iterable[, default])
参数说明:
备注:
list、tuple等都是可迭代对象,我们可以通过iter()函数获取这些可迭代对象的迭代器。然后,我们可以对获取到的迭代器不断使⽤next()函数来获取下⼀条数据。
iter()函数实际上就是调⽤了可迭代对象的 iter ⽅法。
代码范例01:
# 首先获得Iteration对象
it = iter([1,2,3,4,5])
# 循环
while True:
try:
# 获得下一个值
x = next(it)
print(x)
except StopIteration:
# 遇到StopIteration就退出循环
break
代码范例02:
li = [11, 22, 33, 44, 55] li_iter = iter(li) next(li_iter) >>> 11 next(li_iter) >>> 22 next(li_iter) >>> 33 next(li_iter) >>> 44 next(li_iter) >>> 55 next(li_iter) >>> --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-15-9584f6653730> in <module> ----> 1 next(li_iter) StopIteration:
注意,当我们已经迭代完最后⼀个数据之后,再次调⽤next()函数会抛出 StopIteration的异常 ,来告诉我们所有数据都已迭代完成,不⽤再执⾏ next()函数了。
参考链接:https://blog.csdn.net/weixin_42782150/article/details/109315355
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。