好的响应式网站国际足联世界排名
一、迭代器
1、迭代协议
一种是包含iter方法的,另一种是包含getitem方法的(比如str对象就没有iter方法,但是一样支持迭代),只要对象中包含了这两种方法的任意一种,那么这个对象就可以进行迭代操作,即实现了迭代协议
2、迭代器协议
①实现了迭代器协议的对象(实现方式:对象内部定义了一个iter()方法)
②对象实现了__next__方法
③__next__方法返回了某个数值(一般情况下需要的是返回这个对象特定的数字,且按照一定的顺序进行依次返回)
④__next__方法需要在值取值完的时候,抛出StopIteration的错误信息
3、可迭代对象
只要内部实现了迭代协议的,就是一个可迭代对象,可迭代对象可以进行相关的迭代操作,如:for循环、map函数等,所有迭代器都是可迭代对象
4、代码示例
# 可迭代对象:可以for循环遍历的都是可迭代对象,内部只实现了__iter__方法
li = [1,2,3,4]
list()li1 = iter(li) # iter() __iter__
#迭代器 内部实现了__iter__之外,还实现了__next__
print(next(li1))
print(next(li1))
二、生成器
1、生成器概念
生成器并不会一次性把所有数据都生成出来,生成器中保存的只是一个生成数据的相关算法,并不会把将数据都生成,只是在需要数据的时候用生成器去生成一条数据即可,节约了大量的内存空间
2、生成器表达式举例
# () 生成器表达式
tu = (i for i in range(1000)) # 生成器对象
a = next(tu) # next函数用于取值
print(a) # 第一个元素
print(next(tu)) # 第二个元素
3、通过yield自定义生成器
# 通过yield自定义生成器
def gen_fun():yield 100print('Hello Wanzi')yield 1000yield 2000
res = gen_fun() # 返回生成器对象
print(next(res))
print(next(res))
print(next(res))
三、生成器和迭代器的区别
生成器属于迭代器的一种,生成器<迭代器<可迭代对象,且比迭代器多了三种方法
1、send():发送数据
2、close():关闭生成器
3、throw gen.throw(Exception,"Method throw called!")