有三種常用的內建函式,特別牛逼!!!
下面逐個介紹,看仔細了。
1、map()**
用途:處理一個可迭代物件,如列表、元組和字串。以列表為例,處理的是裡面的元素,返回的也是一個同等長度的列表。
老規矩,舉例說明。
比如:對於列表[1,2,3,4,5],怎樣變成[2,3,4,5,6]
(1) 常規做法
num_l = [1,2,3,4,5]
def test(array):
li = []
for i in array:
i += 1
li.append(i)
return li
print(test(num_l))
輸出結果:[2, 3, 4, 5, 6]
(2)最佳化做法
上面這個方法顯然是在函式體中把邏輯寫死了,如果需要不斷的變換,則每次都要去改這個主函式體,顯然不好。來吧,最佳化一下。
num_l = [1,2,3,4,5]
def num_add(x):
return x + 1
def test(func,array):
li = []
for i in array:
li.append(func(i))
return li
print(test(num_add,num_l))
輸出結果:[2, 3, 4, 5, 6]
(3)最牛逼的做法
其實方法上面(2)已經最佳化的挺好了,但是程式碼顯得還是很囉嗦,python的牛逼之處就在於程式碼非常精簡,牛逼的很。來,夥計們,看看下面的騷操作。
num_l = [1,2,3,4,5]
res = list(map(lambda x:x+1,num_l))
print(res)
輸出結果:[2, 3, 4, 5, 6]
2、filter()*
用途:處理可迭代物件,比如列表,元組,字串,處理每一個元素返回bool型別,最常見的用法是用於篩選資料。
不廢話了,上例子。需求:把如下列表['sb_jack','rose','sb_pig']中的sb全部刪除,只留下rose
(1)常規做法
people_list = ['sb_jack','rose','sb_pig']
def test(array):
li = []
for i in array:
if not i.startswith('sb'):
li.append(i)
else:
pass
return li
res = test(people_list)
print(res)
輸出結果:['rose']
(2)最佳化版本
people_list = ['sb_jack','rose','sb_pig']
def move_name(n):
return n.startswith('sb')
def test(func,array):
li = []
for i in array:
if not func(i):
li.append(i)
else:
pass
return li
res = test(move_name,people_list)
print(res)
輸出結果:['rose']
(3)牛逼版本 --三行程式碼把傻逼從列表裡過濾掉。
people_list = ['sb_jack','rose','sb_pig']
res = list(filter(lambda n:not n.startswith('sb'),people_list))
print(res)
輸出結果:['rose']
3、reduce -- 需要先匯入from functools import reduce
用途:對可迭代物件做處理,並最後得到一個結果。函式test()可以傳三個引數,第一個引數是個函式,第二個引數是要計算的列表,第三個引數可傳個預設值,第三個引數不傳也沒關係。
比如計算一個列表的元素的加和。舉例:計算列表[1,2,3,9,7,5]中每個元素的加和。
(1)常規版本
l = [1,2,3,9,7,5]
def test(array):
sum = 0
for i in l:
sum += i
return sum
res = test(l)
print(res)
輸出結果:27
(2)最佳化版本
l = [1,2,3,9,7,5]
def sum_test(x,y):
return x + y
def test(func,array):
res = array.pop(0)
for i in array:
res = func(res,i)
return res
print(test(sum_test,l))
輸出結果:27
(3)牛逼版本
from functools import reduce
l = [1,2,3,9,7,5]
res = reduce(lambda x,y:x+y,l)
print(res)
輸出結果:27
以上就是三種常見的內建函式,非常牛逼,可以明顯精簡程式碼。