• 生成器表达式和推导式


    一 、推导式

    是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导,在Python2和3中都有支持:

    • 列表(list)推导式(或称:列表表达式
    • 字典(dict)推导式
    • 集合(set)推导式   

    1、列表推导式 (使用[]生成list)

    基本格式

    variable = [out_exp_res for out_exp in input_list if out_exp == 2]
      out_exp_res:  列表生成元素表达式,可以是有返回值的函数。
      for out_exp in input_list:  迭代input_list将out_exp传入out_exp_res表达式中。
      if out_exp == 2:  根据条件过滤哪些值可以。此条件可以不加

    例一: 

    multiples = [i for i in range(30) if i % 3 is 0]
    print(multiples)
    # Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

    例二: 有返回值的函数

    def squared(x):
        return x*x
    multiples = [squared(i) for i in range(30) if i % 3 is 0]
    print multiples
    #  Output: [0, 9, 36, 81, 144, 225, 324, 441, 576, 729]

    2、字典推导式 (使用{}生成dict)

    字典推导式和列表推导式类似,只是[]换成{}。

    例一:快速更换key和value

    mcase = {'a': 10, 'b': 34}
    mcase_frequency = {v: k for k, v in mcase.items()} # “for k,v in mcase.items()” 用到python元组拆包
    print mcase_frequency
    #  Output: {10: 'a', 34: 'b'}

    例二:大小写key合并

    复制代码
    mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
    mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase.keys() if k.lower() in ['a','b']}
    print mcase_frequency
    #  Output: {'a': 17, 'b': 34}
    复制代码

    3、集合推导式 

    例一:

    squared = {x**2 for x in [1, 1, 2]}
    print(squared)
    # Output: {1, 4}       python3  
    # Output: set([1, 4])  python2

    二、生成器表达式

    生成器表达式和列表推导式类似,只是把[ ] 换成了( ) 。

         生成器表达式

                列表推导式

        生成器表达式可迭代

    生成器表达式得到的是一个generator,而列表推导式生成的是一个list,generator是一个生成器对象,可迭代。生成generator的时候,不会在内存中留下一个列表,而在每次for循环运行时才生成一个组合,生成器对象是用到的时候才生成内容的,当数据比较大的时候,生成器表达式能明显的节约内存。

    生成器表达式属于“惰性计算”,可以逐个的获取内容:

      python2中可用generator.next()逐个获取

      python3中逐个获取用法改成next(generator)

     三、生成器表达式可替换map、filter高阶函数

    filter:

    g=(i for i in range(30) if i % 3 is 0)    等效于    g=filter(lambda x:x%3==0,range(30))

    map:

    g=(i+2  for i in range(10) )     等效于  g=map(lambda x:x+2,range(10)) 

     reduce  (生成的是一个结果,不是generator)

    reduce(function, sequence[, initial]) -> value
    function参数是一个有两个参数的函数,reduce依次从sequence中取一个元素,和上一次调用function的结果做参数再次调用function。
    第一次调用function时,如果提供initial参数,会以sequence中的第一个元素和initial作为参数调用function,否则会以序列sequence中的前两个元素做参数调用function。

     python3中  reduce()函数已经被从全局名字空间里移除了,它现在被放置在fucntools模块里

  • 相关阅读:
    supervise 用来监控服务,自动启动
    tee -a /var/log/jd.log
    类的构造函数与析构函数的调用顺序
    c++之带默认形参值的函数
    zoj1001-A + B Problem
    zoj1037-Gridland
    cf499A-Watching a movie
    cf478B-Random Teams 【排列组合】
    C++版修真小说
    Python_12-线程编程
  • 原文地址:https://www.cnblogs.com/who-care/p/9835792.html
Copyright © 2020-2023  润新知