>>>迭代器
>>什么是迭代器:
迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果
迭代器:迭代取值的工具
>>迭代器的优点和缺点:
>>优点: 迭代器给我们提供了一种不依赖于索引取值的方式,另外,当可迭代对象使用__iter__()方法并赋值给一个变量后,该变量对应的只会是一个内存地址,从而节省内存空间,且在该变量使用__next__()方法,读取数据时,也是生成一个读一个,效率较高.
>>缺点: 迭代器只能顺序读取可迭代对象内的值,无法读取可迭代对象内指定位置的值.
>>>可迭代对象
只要该数据类型的内置方法中有__iter__方法,就是可迭代对象.如(字符串,列表,字典,元组,集合)
代码演示如下:
test = [1,2,3,4] #创建列表
print(t) # <list_iterator object at 0x00000260D456A2B0>
t = test.__iter__() # 生成迭代器 print(t.__next__()) # 1 # 用__next__()方法,顺序迭代读取列表中的值
print(t.__next__()) # 2
print(t.__next__()) # 3
print(t.__next__()) # 4
>>>生成器
>>什么是生成器
>生成器就是用户自定义的迭代器,本质是迭代器
>生成器的关键字是yield,带有yield关键字的函数,在定义的时候类型是普通函数,在函数加括号执行时,函数体内的代码不会被执行,只会将函数变成生成器对象,然后可以用__next__方法去执行函数体内的代码.
从图中可以看见,未使用__next__()方法,迭代生成器前,生成器都只是一个内存地址,所以可以看出,他继承了迭代器的优点,当然缺点也继承了.他与迭代器唯一不同的地方,就是加入了yield关键字,下面讲下yield关键字
yield和return比较:
yield:可以返回结果,可以同时返回多个值,返回结果后不会退出函数,而是暂停在当前位置,若下次再执行函数体代码时,则从当前位置开始.yield还可以通过send()方法,从外部向内部传值.
return:可以返回结果,可以同时返回多个值,且返回结果的同时,会退出函数
利用yield,自定义range()方法
使用send()方法,从函数外部,向函数内部的yield进行传值