一 、推导式:python
是Python的一种独有特性。推导式是能够从一个数据序列构建另外一个新的数据序列的结构体。 共有三种推导,在Python2和3中都有支持:函数
一、列表推导式 (使用[]生成list):spa
基本格式code
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]
例二: 有返回值的函数blog
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]
二、字典推导式 (使用{}生成dict):ip
字典推导式和列表推导式相似,只是[]换成{}。内存
例一:快速更换key和valueget
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合并input
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}
三、集合推导式
例一:
squared = {x**2 for x in [1, 1, 2]} print(squared)
# Output: {1, 4} python3
# Output: set([1, 4]) python2
2、生成器表达式:
生成器表达式和列表推导式相似,只是把[ ] 换成了( ) 。
生成器表达式
列表推导式
生成器表达式可迭代
生成器表达式获得的是一个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模块里