1. 程式人生 > >python語法技巧

python語法技巧

true tro 元素 列表推導 -o rate 計算 lambda iterable

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‘}

python語法技巧