zoukankan      html  css  js  c++  java
  • 迭代器_iter_,生成器yeild,三元运算,列表解析(十三)

    迭代器

    l = [1, 2, 3, 4]
    iter = l.__iter__()
    print(iter)
    print(iter.__next__())
    print(iter.__next__())
    print(iter.__next__())
    print(iter.__next__())
    '''
    <list_iterator object at 0x0217A230>
    1
    2
    3
    4
    '''

    生成器:这种数据类型自动实现了迭代器协议,其他数据类型要调用内部的iter方法,

    所以生成器就是可迭代对象

    python中有两种方式提供生成器

    1.生成器函数:用yield代替return函数返回,yield

    一次返回一个结果,在每个结果中间挂起函数状态,

    以便下一次从它离开的地方继续执行

    2.生成器表达式:类似于列表推导,但是,生成器返回按需

    产生的一个对象,而不是一次构建一个结果列表

    def test():
        yield 1
        yield 2
    iter = test()
    print(iter)
    print(iter.__next__())
    print(iter.__next__())
    '''
    <generator object test at 0x01E96BF0>
    1
    2
    '''
    # yield 可以让函数一步一步地执行
    
    def run():
        print('runnig_1')
        yield 1
        print('runnig_2')
        yield 2
        print('runnig_3')
        yield 3
        print('runnig_4')
        yield 4
    
    it = run()
    next(it)
    print('可以做一些其他的事情...')
    next(it)    # 再接着执行
    next(it)
    next(it)
    
    '''
    runnig_1
    可以做一些其他的事情...
    runnig_2
    runnig_3
    runnig_4
    '''

    三元表达式

    name  = ‘alex’

    res = ‘SB’ if name ==‘alex’ else  ‘shuaige’

    列表解析

    l = []
    for i in range(10):
        l.append(i)
    print(l)    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    # 使用列表解析
    l = ['第%s' %i for i in range(10)]
    print(l)    # ['第0', '第1', '第2', '第3', '第4', '第5', '第6', '第7', '第8', '第9']
    # 加三元表达式,没有四元表达式
    l1 = ['第%s' %i for i in range(10) if i > 5]
    print(l1)   # ['第6', '第7', '第8', '第9']

    列表解析可以很方便的生成列表,但是当数据比较大时会占很大的内存,这时候使用生成器表达式就可以避免内存占用过大这个问题

    生成器的第二种方式:

    l = ('第%s' %i for i in range(10))
    print(l.__iter__()) # <generator object <genexpr> at 0x02146C70>
    print(l.__iter__().__next__())
    print(l.__iter__().__next__())
    print(next(l))
    print(next(l))
    print(next(l))
    print(next(l))
    print(next(l))
    print(next(l))
    print(next(l))
    print(next(l))
    print(next(l))  #   最后抛出异常
    '''
    <generator object <genexpr> at 0x015E6C70>
    第0
    第1
    第2
    第3
    第4
    第5
    第6
    第7
    第8
    第9
    Traceback (most recent call last):
      File "F:/Python3/demo1.py", line 165, in <module>
        print(next(l))
    StopIteration
    '''
    内置函数sum也是基于迭代器协议
    print(sum( (1,2,3,4) ))
     
    # 内置函数sum也是基于迭代器协议
    l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(sum(x**2 for x in l))
    print(sum( range(1000000) ))
    print(sum(i for i in range(1000000) ))
  • 相关阅读:
    android switch控件的使用
    触摸屏校准tslib的配置文件
    matlab 函数的编写与调用
    penmount串口触摸屏加载
    FPGA保留信号的语句
    ioctl和unlock_ioctl的区别
    内核目录中增加自己的目录
    linux内核打印"BUG: scheduling while atomic
    28335外部中断
    编译QT时出现lib/libQtGui.so: undefined reference to `ts_read_raw'的解决办法
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/10410307.html
Copyright © 2011-2022 走看看