• PYTHON-迭代器,xxx生成式



    一 迭代器
    1 什么是迭代器
    #迭代器即迭代的工具,那什么是迭代呢?
    #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值
    while True: #只是单纯地重复,因而不是迭代
    print('===>')

    l=[1,2,3]
    count=0
    while count < len(l): #迭代
    print(l[count])
    count+=1

    2 为何要用迭代器?
    1.可以不依赖索引取值
    2.同一时刻在内存中只有一个值,不会过多地占用内存

    3 如何用迭代器?
    可迭代的对象:但凡内置有__iter__方法的对象都是可迭代的对象,例如str,list,dict,tuple,set,文件

    迭代器的对象:既内置有__iter__方法又内置有__next__方法的对象称之为迭代器对象,例如 文件

    可迭代对象.__iter__() - ------》迭代器对象

    迭代器对象.__iter__() - ------》迭代器本身
    迭代器对象.__next__() - ------》迭代器的下一个值

    for i in obj:
    pass

    4 for准确地说应该是迭代器循环,for循环的原理如下:
    1. 先调用in后面那个值的__iter__方法,得到迭代器对象
    2. 执行迭代器.__next__()方法得到一个返回值,然后赋值给一个变量k,运行循环体代码
    3, 循环往复,直到迭代器取值完毕抛出异常然后捕捉异常自动结束循环


    5 总结迭代器:
    迭代器的优缺点
    优点:
    1.可以不依赖索引取值
    2.同一时刻在内存中只有一个值,不会过多地占用内存(惰性计算,节省内存)
    缺点:
    1.不如按照索引或者key取值的方式灵活
    2.无法预测迭代器所包含值的长度(只有在next完毕才知道到底有几个值)

    可迭代的对象=====》迭代器对象:调用可迭代对象内置的__iter__方法会有一个返回值,
    该返回值就是对应的迭代器对象
    dic={'x':1,'y':2,'z':3}
    迭代器对象 = 调用可迭代的对象
    iter_dic=dic.__iter__()
    # print(iter_dic)
    res1=iter_dic.__next__()
    print(res1)

    三个不同的迭代器
    iter_dic1=dic.__iter__()
    iter_dic2=dic.__iter__()
    iter_dic3=dic.__iter__()

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

    def func():
    print('====>first')
    yield 1
    print('====>second')
    yield 2
    print('====>third')
    yield 3
    print('====>end')

    g=func()
    print(g) #<generator object func at 0x0000000002184360>

    2 生成器就是迭代器
    g.__iter__
    g.__next__
    #2、所以生成器就是迭代器,因此可以这么取值
    res=next(g)
    print(res)


    3 yield关键字:只能用在函数内 **
    在函数内但凡包含有yield关键字,再去执行函数,就不会立刻运行函数体代码了
    会得到一个返回值,该返回值成之为生成器对象,生成器本质就是迭代器

    4 总结yield:
    1. 提供一种自定义迭代器的解决方案
    2. yield可用于返回值

    yield VS return
    相同点:都可以用于返回值
    不同点:yield可以暂停函数,yield可以返回多次值,而return只能返回值一次值函数就立刻终止


    三,三元表达式、列表推导式、生成器表达式
    1 三元表达式
    res = 条件成立情况下的返回值 if 条件 else 条件不成立情况下的返回值
    name=input('姓名>>: ')
    res='SB' if name == 'alex' else 'NB'
    print(res)

    2 列表生成式
    [i
    for i in range(10)]
    [i for i in range(10) if i > 3]

    3 生成器表达式 {}()
    #1、把列表推导式的[]换成()就是生成器表达式

    #2、示例:生一筐鸡蛋变成给你一只老母鸡,用的时候就下蛋,这也是生成器的特性
    >>> chicken=('鸡蛋%s' %i for i in range(5))
    >>> chicken
    <generator object <genexpr> at 0x10143f200>
    >>> next(chicken)
    '鸡蛋0'
    >>> list(chicken) #因chicken可迭代,因而可以转成列表
    ['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4',]

    #3、优点:省内存,一次只产生一个值在内存中

    生成字典
    {i:i for i in range(10) if i > 3}
    生成集合
    {i for i in range(10) if i > 3}




  • 相关阅读:
    java NIO 总结
    NIO 服务器和客户端 demo
    nio channel demo
    使用docker制作zookeeper镜像
    java BIO模型demo
    IDEA中语句添加try....catch..语句块
    线程的几种创建方式
    海豚调度Dolphinscheduler源码分析(四)
    @PostConstruct注解
    zookeeper常用命令
  • 原文地址:https://www.cnblogs.com/du-jun/p/9767735.html
Copyright © 2020-2023  润新知