生成器表达式和推导式

一 、推导式

是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)

扫描二维码关注公众号,回复: 3690803 查看本文章

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

例一:快速更换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模块里

猜你喜欢

转载自www.cnblogs.com/who-care/p/9835792.html
今日推荐