zoukankan      html  css  js  c++  java
  • 列表生成式/生成器/迭代器

    一.列表生成式

    用来创建列表的表达式

    示例:

    import os
    print([x for x in range(20) if x % 2 == 0])
    print([d for d in os.listdir('.') if not d.startswith('.') and not d.startswith('__')])
    
    # 字典
    print([k + '=' + str(v) for k,v in {'a' : 1, 'b' : 2}.items()]) #items可以同时迭代key和value
    
    {k:v for k,v in self.items() if not k.startswith('_')}
    

      

    二.生成器

    如果一个列表非常大,那么创建这个列表需要耗费较大的内存.生成器不会创建完整列表,只会在调用的时候计算出合适的值返回给调用方.

    1.创建生成器有两种方式:

    (1).将列表生成式的[]改为括号:

    (x for x in range(20) if x % 2 == 0)
    

      

    (2).一个函数定义中包含yield关键字:

    def get():
        for x in range(10):
            yield x
    

      

    2.使用生成器:

    (1).通过调用next来获得值,但需要注意StopIteration异常(不常用)

    a = get_generator()
    print(next(a))
    

      

    (2).通过迭代(常用):

    for ge in get_generator():
        print(ge)
    

      

    三.迭代器:

    可以被next()函数调用并不断返回下一个值的对象称为迭代器

    1.能被迭代的数据有两类

    一类是集合数据类型,如list、tuple、dict、set、str等;
    一类是generator,包括生成器和带yield的generator function。

    2.能被迭代的对象称为:Iterable,可以用isinstance判断一个对象是否可以迭代

    3.生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator,把list、dict、str等Iterable变成Iterator可以使用iter()函数

    如:

    from collections.abc import Iterator
    str_a = 'hello world'
    print(isinstance(str_a, Iterator))
    print(isinstance(iter(str_a), Iterator))
    

      

    输出:
    False
    True


    4.总结:

    凡是可作用于for循环的对象都是Iterable类型;
    凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
    集合数据类型如list、dict、str等是Iterable但不是Iterator,可以通过iter()函数获得一个Iterator对象。

  • 相关阅读:
    011 处理模型数据时@ModelAttribute的使用
    动态产生DataSource------待整理
    连接池问题
    maven加载第三方jar不能加载
    010 处理模型数据(ModelAndView,Map Model,@SessionAttributes)
    009 使用servlet API作为参数
    008 使用POJO对象绑定请求参数
    007 @CookieValue绑定请求中的cookie
    006 请求处理方法签名
    005 RequestMapping_HiddenHttpMethodFilter 过滤器
  • 原文地址:https://www.cnblogs.com/itfenqing/p/10253439.html
Copyright © 2011-2022 走看看