首页 教程Python正文

【Python】迭代器/生成器

從出茳湖 Python 2019-07-15 322 0 Python

Python第十二课(迭代器_生成器).png

Python迭代器/生成器    >>>转到思维导图>>>转到博客园

1.迭代

1.1什么是迭代:

更新换代(重复)的过程,每次迭代都必须基于上一次的结果

1.2什么是迭代器:

迭代取值的工具

1.3为什么要有迭代器:

迭代器提供了一种不依赖于索引取值的方式
对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器

1.4什么是可迭代对象:

可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__

1.5什么是迭代器对象:

可迭代对象执行obj.__iter__()得到的结果就是迭代器对象。而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象。

1.6注意:

迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象

需要迭代取值的数据类型:字符串str、列表list、元组tuple、字典dict、集合set、文件对象

文件对象执行内置的__iter__之后还是本身 没有任何变化,文件对象本身就是迭代器对象

针对双下线开头双下划线结尾的方法,推荐读:双下+方法名

2.迭代器取值:

迭代器取值 调用__next__

迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身

2.1异常报错StopIteration:取完了

2.2异常处理:

while True: 
    try: 
        print(iter_d.__next__()) 
    except StopIteration: 
        print('老母猪生不动了')
    break

2.3迭代器取值的特点:只能往后依次取,不能后退

2.4迭代器取值的优点:

    1.不依赖于索引取值

    2.内存中永远只占一份空间,不会导致内存溢出

2.5迭代器取值的缺点:

    1.不能够获取指定的元素

    2.取完之后会报StopIteration错

3.for循环的本质

    1.将in后面的对象调用__iter__转换成迭代器对象

    2.调用__next__迭代取值

    3.内部有异常捕获StopIteration,当__next__报这个错 自动结束循环

4.生成器

只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码

生成器就是迭代器,可以用__next__方法取值

yield后面跟的值就是调用迭代器__next__方法你能得到的值

yield既可以返回一个值也可以返回多个值,并且多个值也是按照元组的形式返回

可以用.send给yield左边的变量传参,但必须先将代码运行至yield才能为期传值

yeild

    1.帮你提供了一种自定义生成器方式

    2.会帮你将函数的运行状态暂停住

    3.可以返回值

yeid与return异同:

    相同点:都可以返回值,并且都可以返回多个

    不同点:yield可以返回多次值,而return只能返回一次函数立即结束,yield还可以接受外部传入的值

5.生成器表达式

例如:res = (i for i in range(1,10) if i != 4)

一道面试题

def add(n,i):
    return n+i
def test():
    for i in range(4):
        yield i
g=test()

for n in [1,10]:
    g=(add(n,i) for i in g)
    # 第一次for循环g=(add(n,i) for i in test())

    # 第二次for循环g=(add(n,i) for i in (add(n,i) for i in test()))
print(n)
res=list(g)

"""
for i in (add(10,i) for i in test()):  会执行所有的生成器内部的代码
    add(n,i)
"""

#A. res=[10,11,12,13]
#B. res=[11,12,13,14]
#C. res=[20,21,22,23]  答案
#D. res=[21,22,23,24]

6.常用内置方法

abs()取绝对值。
all()传入一个可迭代对象只要对象中一个元素为False就返回False
any()传入一个可迭代对象只要对象中一个元素为True就返回True
bin()十进制转二进制 返回一个整数 int的二进制表示。
oct()十进制转八进制 返回一个整数 int的二进制表示。
hex()十进制转16进制 返回一个整数 int的二进制表示。
int()用于将一个字符串或数字转换为整型,如果传入两个参数,第一个是要转的进制数,第二个是表示当前数是多少进制,最终将进制数转为十进制数。
bool()将给定参数转换为布尔类型,如果没有参数,返回 False
callable()用于检查一个对象是否是可调用的。
char()将数字转换成ascii码表对应的字符。
unichr() 函数 和 chr()函数功能基本一样, 只不过是返回 unicode 的字符。
ord()将字符按照ascii表转成对应的数字。
dict()用于创建一个字典。
dir()获取当前对象名称空间里面的名字。
divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)
enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
eval()用来执行一个字符串表达式,并返回表达式的值。
exec()执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码。其返回值为none
format()格式化输出
globals()会以字典类型返回当前位置的全部全局变量。
locals()会以字典类型返回当前位置的全部局部变量。
help()查看函数注释说明
isinstance()用来判断一个对象是否是一个已知的类型,类似 type()。
next() 返回迭代器的下一个项目。
open() 函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写。
pow() 方法返回 x^y(x的y次方) 的值。
reverse() 函数用于反向列表中元素。
round() 方法返回浮点数x的四舍五入值。

END

本文标题:【Python】迭代器/生成器
本文链接:https://zhong-er.com/post/47.html
作者授权:除特别说明外,本文由 從出茳湖 原创编译并授权 中二青年 刊载发布。
版权声明:本文使用「署名-非商业性使用-相同方式共享 4.0 国际」创作共享协议,转载或使用请遵守署名协议。

评论

登录
用户名
密码
注册
用户名
密码
确认密码
邮箱
获取邀请码
邀请码
验证码
找回密码
用户名
邮箱
※ 重置链接将发送到邮箱
召唤伊斯特瓦尔