• 迭代器和生成器


    1. 迭代器

    列表、元组、字典和集合都是可迭代的对象,可以从其中获得迭代器。

    所有这些对象都可用iter()方法获取迭代器.

    例如:

    name = [1,2,3,4,5,6,7,8]

    name = iter(name)

    next(name)

    for i in name:

    print(i)

    >>> 2,3,4,5,6,7,8

    1. StopIteration

    name = [1,2,3,4,5,6,7,8]

    name = iter(name)

    while True:

    try:

    next(name)

    except StopIteration:

    break

    可以使用StopIteration语句停止迭代,for循环底层使用next进行调用并解决了StopIteration的问题

    1. 生成器

    2. 只要函数存在 yield关键字
    3. 启动生成器 next() 或者 for 或者send()

    使用生成器实现斐波拉契数列:

    def gen_fib(index):

    n,a,b = 0,0,1

    while n<index:

    yield b

    a,b = b,a+b

    n+=1

    for i in gen_fib(5):

    print(i)

    例如:

    def gen_func():

    yield 1

    return "name"

    gen = gen_func()

    print(next(gen))

    try:

    next(gen)

    except StopIteration as e:

    print(e.value)

    e.value 获取函数的返回值

    next(gen) 启动生成器yield,返回值为yield的值

    1. 生成器接收值

    def gen():

    print("start..")

    html = yield "www.baidu.com"

    print(html)

    yield 2

    return "end.."

    gen = gen()

    url_00 = next(gen) #启动第一个生成器,url_00是第一个生成器yield出来的值

    print(url_00)

    url_01 = gen.send("www.google.com") #传值给html ,并启动第二个生成器,url_01是第二个生成器yield出来的值.

    print(url_01)

    try:

    next(gen)

    except StopIteration as e:

    print(e.value) #获取函数返回值

    Result:

    start..

    www.baidu.com

    www.google.com

    2

    end..

    1. Send

    注意:在调用send的时候,如果这时没有启动过生成器,send需要发送 None 值

    例如:

    def gen():

    print("start..")

    html = yield "www.baidu.com"

    print(html)

    yield 2

    return "end.."

    gen = gen()

    url_00 = gen.send(None)

    print(url_00)

    url_01 = gen.send("www.google.com")

    print(url_01)

    result:

    start..

    www.baidu.com

    www.google.com

    2

     

  • 相关阅读:
    StartSSL免费证书申请笔记
    CAS实践笔录
    MySQL常用SQL/函数汇总(持续更新)
    Git学习笔记(持续更新)
    Nginx配置性能优化
    OneDrive无法正常登录
    Windows注册表(持续更新)
    Mysql操作笔记(持续更新)
    MySQL 绿色版(zip) 安装
    Ubuntu/Deepin下常用软件汇总(持续更新)
  • 原文地址:https://www.cnblogs.com/wenshu/p/12267153.html
Copyright © 2020-2023  润新知