zoukankan      html  css  js  c++  java
  • python函数五(迭代器,生成器)

    一。迭代器

    1.可迭代对象(只含有__iter__方法的数据是可迭代对象)

    常见的可迭代对象:str list tuple dict set range

    1.1什么是可迭代对象?

    方法一: dir(被测对象) 如果 他含有'__iter__ ',那这个对象就叫做可迭代对象.
    遵循可迭代协议

    s = 'alex'
    l = [1,2,3,4,5]
    print('__iter__' in dir(s))
    print('__iter__' in dir(l))
    # 输出结果:
    # True
    # True

    2.迭代器(含有__iter__方法,并且含有__next__方法的数据是迭代器)

    常见的迭代器:文件句柄

    2.1迭代器的取值

    s = 'alex'
    l = [1,2,3,4,5]
    s1 = s.__iter__()
    print(s1.__next__())
    print(s1.__next__())
    print(s1.__next__())
    # 输出结果: a   l   e

    2.2迭代器的意义:
    1)迭代器节省内存.
    2)迭代器惰性机制.
    3)迭代器不能反复,一直向下执行.

    for循环的机制就是完美的运用的迭代器
    内部含有__iter__方法,他会将可迭代对象先转化成迭代器。

    然后在调用__next__方法,

    他有异常处理的方法.

    for i in [1,2,3]:
        print(i)
    
    l = [1,2,3]
    l_iter = l.__iter__()
    while True:
        try:
            print(l_iter.__next__())
        except StopIteration:
            break

    3.可迭代对象与迭代器的关系

    1)可迭代对象------>迭代器
    可迭代对象.__iter__()------->迭代器

    s = 'alex'
    l = [1,2,3,4,5]
    l1 = l.__iter__()     #迭代器
    print(l1)   #iterator  遵循迭代器协议
    # 输出结果:<list_iterator object at 0x00000156B0EC7630>

    判断是可迭代对象还是迭代器

    方法二(isinstance与type类似,但是功能比type更强大

    l = [1,2,3,4,5]
    l_iter = l.__iter__()
    from collections import Iterable
    from collections import Iterator
    print(isinstance(l,Iterable))               #True
    print(isinstance(l,Iterator))               #True
    print(isinstance(l_iter,Iterator))        #False
    print(isinstance(l,list))                      #True

    二。生成器

    生成器的本质就是迭代器,生成器是自己用python代码写的迭代器.
    1,可以用生成器函数
    2,可以用各种推导式构建迭代器.
    3,可以通过数据转化.

    def gener():
        print(111)
        yield 222
        count = yield 333
        print(count)
        yield 444
        yield 555
    g = gener()
    print(g)
    print(g.__next__())
    print(g.__next__())
    print(g.send('aaa'))
    print(g.__next__())
    # 输出结果:
    # <generator object gener at 0x0000014CDE5B1BF8>
    # 111
    # 222
    # 333
    # aaa
    # 444
    # 555

    4.send
    1)send 和next功能一样
    2)给上一个yiled 整体发送一个值
    send不能给最后一个yield发送值
    获取第一个值的时候,不能用send 只能用next

        

  • 相关阅读:
    Java可变参数
    为什么static方法中不可以调用非static方法
    用注解@DelcareParents实现引用增强
    在SpringBoot中用SpringAOP实现日志记录功能
    梳理一下我理解的aop
    包裹iframe的div与iframe存在高度差的问题解决方案
    非跨域情况下iframe 高度自适应的问题解决(一)
    flex布局较之float布局的优点新发现
    webpack4 动态导入文件 dynamic-import 报错的解决方法
    vue chrome 浏览器调试工具devtools插件安装
  • 原文地址:https://www.cnblogs.com/zhuzhaoyang/p/8422991.html
Copyright © 2011-2022 走看看