value = a if a==1 else 0
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']
x=[1,2,3] y='xyz' print filter(lambda x:x>2,x) #结果: [3] print filter(lambda x:x>'x',y) #结果: [yz]
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这这么小的细节依然做到了复用(明白了这个道理,自己也可以写一个优雅的函数啦)
列表解析完全适用字典解析,只要将 [ ] 换成 { } 就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]