用户工具



三元表达式

value = a if a==1 else 0 

map,filter,reduce

map函数

l=[1,2,3]
print map(lambda x:x+10,l)
#结果: [10,11,12]

x='abc'
y='xyz'
print map(lambda x,y:x+y,x,y) #可以指定多个序列
#结果: ['ax','by','cz']

filter

x=[1,2,3]
y='xyz'
print filter(lambda x:x>2,x) #结果: [3]
print filter(lambda x:x>'x',y) #结果: [yz]

reduce

x=[1,2,3]
print reduce(lambda x,y:x+y,x)#结果:6

为什么会有这些函数?

就拿map函数来说吧

map(函数A,序列B),map函数指明让函数A处理序列B,那为什么不直接写一个函数让函数A处理序列B呢?为什么还要经过map函数呢?

假如我想实现把每个序列中的数字+10,我写了如下函数

def add10(seq):
    l=[]
    for i in seq"
        l.append(i+10)
    return l

这个时候我又想实现把每个序列中的数字+20,我写了如下函数

def add10(seq):
    l=[]
    for i in seq"
        l.append(i+20)
    return l

我们在来看看map函数解决了什么问题

每个序列中的数字+10
def add10(x):
    return x+10
map(add10,seq)
每个序列中的数字+20
def add20(x)
    return x+20
map(add20,seq)

我写的2个函数代码逻辑很简单,里面没有包含循环。那为什么能实现累加的功能呢?

答案就是“map函数实现了循环”。map函数把所有序列操作必须的遍历又非封装了起来,让用户只专注处理数据逻辑。python这这么小的细节依然做到了复用(明白了这个道理,自己也可以写一个优雅的函数啦)


列表解析,字典解析

处理线性结构,很大程度上可以替代map,filter,reduce函数

列表解析完全适用字典解析,只要将 [ ] 换成 { } 就ok了

print [ x for x in range(3) ] #生成一个list
结果:[0,1,2]
print [ x for x in range(3) if x % 2 == 0] #增加一个限制条件
结果:[0,2]
print [ [x,y] for x in range(3) if x > 0 
    for y in range(3) if x > y   
    # for z in range(3) if .... #可以一直写下去
    ]
结果:[[1, 0], [2, 0], [2, 1]]

print { x+y:[x,y] for x in 'ab'  for y in 'xy' } #生成键值对时,只能使用字典解析

处理多维数组

m = [
    [1,2,3],
    [4,5,6],
    [7,8,9]
    ]
print [ row[1] for row in m ] #打印第二列
结果:[2, 5, 8]
print [ m[i][j] for  i in  range(3) for j in range(3) ]# 转成一维列表
结果:[1, 2, 3, 4, 5, 6, 7, 8, 9]