1、三元表达式:
value= true-expr if condition else false-expr
例如:a=‘positive‘ if 3>0 else ‘negative‘
2、用列表推导式来取代map和filter
a=[1,2,3,4,5] squares=list(map(lambda x:x**2,a)) print(squares) #[1, 4, 9, 16, 25] squares=[x**2 for x in a] print(squares) #[1, 4, 9, 16, 25] data=list(map(lambda x:x**2 ,filter(lambda x:x%2==0,a))) print(data) #[4, 16] data_one=[x**2 for x in a if x%2==0] 等价于data_one=[x**2 for x in a and x%2==0]
print(data_one) #[4, 16] #字典与集合也有类似的推导机制 chile_ranks={‘ghost‘:1,‘habanero‘:2,‘cayenne‘:3} rank_dict={rank:name for name,rank in chile_ranks.items()} chile_len_set={len(name) for name in rank_dict.values()} print(rank_dict) #{1: ‘ghost‘, 2: ‘habanero‘, 3: ‘cayenne‘} print(chile_len_set) #{8, 5, 7}
3、函数式编程
能接收其他函数作为参数的函数,被称为高阶函数(high-order function)
代表性高阶函数:map() filter() 和 reduce()
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,
并把结果作为新的Iterable返回。
lambda_sum=lambda x,y:x+y
print(lambda_sum(3,4)) #7
data_list=[1,3,5,6]
result=map(lambda x:x+3,data_list)
print(list(result)) #[4, 6, 8, 9]
def f(x):
return x+3
result_one=list(map(f,data_list))
print(result_one) #[4, 6, 8, 9]
reduce():把一个函数作用在一个序列[x1,x2,x3,...]上,这个函数必须接收两个参数,reduce把结果
继续和序列的下一个元素做累积计算。感觉用处不大!自己也能写,会麻烦一些,如果需要,还是可用。
from functools import reduce
data_list=[1,3,5]
print(reduce(lambda x,y:2*x+y,data_list)) #15
def f_reduce(x,y):
return 2*x+y
print(reduce(f_reduce,data_list)) #15
new_list=data_list[:1]
for i in range(1,len(data_list)):
new_list.append(2*new_list[i-1]+data_list[i])
print(new_list) #[1, 5, 15]
print(new_list[-1]) #15
def prod(L):
new_list=L[:1]
for i in range(1,len(L)):
new_list.append(new_list[i-1]*L[i])
return new_list[-1]
print(prod([3, 5, 7, 9])) #945
def prod(L):
return reduce(lambda x,y:x*y,L)
print(prod([3, 5, 7, 9])) #945
3、filter() ,和map()类似,也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,
然后根据返回值是True还是False决定保留还是丢弃该元素
list(filter(lambda x:x%2==0,[3,4,5])) #[4]
list(filter(lambda x:x%2==1,[3,4,5])) #[3,5]
lst=[x**2 for x in range(10)] #[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
x1=[1,3,5]
y1=[9,12,13]
lst1=[x**2 for (x,y) in zip(x1,y1) if y>10]
print(lst1) #[9, 25]
dict={k:v for k,v in enumerate(‘vamei‘) if v not in ‘vi‘}
print(dict) #{1: ‘a‘, 2: ‘m‘, 3: ‘e‘}