内容总结:
一、迭代器
二、For循环
三、生成器
四、生成器表达式
********************************************************************************************************************************************
一、迭代器
什么是迭代器?
迭代:更新换代的过程,但是每次迭代都是基于上一次的结果
迭代器:迭代取值的工具
为什么要用
迭代器为你提供了一种不依赖于索引取值的方式
可以迭代取值的数据类型:
Str、list、dict、tuple、set
判断一个数据对象是否为可迭代对象的方法?
只有数据对象内置有__iter__方法的都叫做可迭代对象
1.str 、list、 tuple、 dict、 set、文件对象(执行内置的__iter__之后还是本身 没有任何变化)
2.int、float 不是可迭代对象,因为没有内置__iter__方法
迭代器对象
可迭代对象执行内置的__iter__方法得到就是该对象的迭代器对象
Str.__iter__
List.__iter__
Tuple.__iter__
Dict.__iter__
Set.__iter__
f.__iter__ (注意:执行内置的__iter__之后还是本身 没有任何变化,文件对象本身就是迭代器对象)
迭代器对象
1.内置有__iter__方法
2.内置有__next__方法
Ps:迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象
迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身
迭代器取值的特点:
1.只能往后依次取,不能后退
2.取值只能在迭代器对象里取值,而不能再可迭代对象进行__iter__.__next__操作
注意:当迭代器对象使用内置方法__next__取值时,当迭代器对象里面的值被取完时,则会出现报错。为了不出现报错,
用到try: 取值判断 except StopIteration: 取值为空时返回想要的结果
二、For 循环的本质
For 循环后面的in 关键 跟的是一个可迭代对象或者一个迭代器对象
For循环内部的本质:
1.in后面的可迭代对象可以调用__iter__内置方法,转换成迭代器对象
2.生成的迭代器对象调用__next__迭代取值
3.内部有异常捕获StopIteration,当__next__报这个错 自动结束循环
迭代取值的优缺点:
优点:
1.不依赖于索引取值
2.内存中永远只占一份空间,不会导致内存溢出
缺点:
1.不能够获取指定的元素,只能一一往下取值
2.迭代器对象当里面的数据取完之后,会报StopIteration错
三、生成器:
用户自己定义的迭代器,本质就是迭代器
**当我们在自定义一个生成器的时候,如果在自定义函数里面有关键字:yield,此时需要注意。
- 当调用该函数时,会将该函数生成一个迭代器对象,但不会执行自定义函数里面的函数体代码,
- 只有当生成的迭代器对象在执行内置方法__next__时才执行定义阶段函数里面的函数体代码,运行到yield出暂停
Yield用法:类型return
Yield 后面 可以跟参数,参数类型可以是任意类型,个数可以是一个,也可以是多个,没有值得时候默认返回None,多值的时候,以元祖的形式返回,
当执行到yield时,暂停,不会执行后面的代码,当再次__next__取值时才会执行yield后面的语句
Yield其他用法
1. Yield当作一个值传给一个变量名,默认值为None,不管后面 有没有参数 value = yield 参数1 value的值为None,此时调用__next__返回的结果为参数1
2.可以给yield直接传个值。当函数体代码执行带yield时,然后运行s.send(‘内容’) 该内容会传给yield,同时触发__next__()内置方法
四、生成器表达式
生成器表达式跟列表、字典、集合生成表达式不一样,不能再以定义的符号来表示。