内容总结:

一、迭代器

二、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,此时需要注意。

  1. 当调用该函数时,会将该函数生成一个迭代器对象,但不会执行自定义函数里面的函数体代码,
  2. 只有当生成的迭代器对象在执行内置方法__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__()内置方法

四、生成器表达式

生成器表达式跟列表、字典、集合生成表达式不一样,不能再以定义的符号来表示。

 

posted on 2019-07-15 19:49  "莫欺少年穷  阅读(247)  评论(0编辑  收藏  举报