1. 程式人生 > >lambda匿名函數和他的小夥伴

lambda匿名函數和他的小夥伴

簡單的 是否 之間 內置函數 函數的參數 三國 對比 個數字 設計

lambda匿名函數

主要是為了解決一些簡單的需求而設計的一句話函數

#計算n的n次方
def func(n):
    return n**n
print(func(3))  #27

f = lambda n : n ** n
print(func(3)) #27

語法: 函數名 = lambda 參數 : 返回值

註意:

  • 函數的參數可以有多個, 多個參數之間用逗號分開
  • 匿名函數不管多復雜, 只能寫一行, 並且邏輯結束後直接返回數據
  • 返回值和正常的函數一樣,可以是任意數據類型.
x = lambda a,b : a+b
print(x(1,4))  #5

匿名函數lambda的函數名是a, 之所叫匿名函數是因為通過__name__查的時候用的都是統一的名字lambda,這一點和普通函數不一樣

def func(n):
    return n*n

a = lambda n : n * n
print(a(5))                  #25

print(func.__name__)  #查看函數的名字  func
print(a.__name__)      #<lambda>
對比一下查到的函數名

lambda函數中的一個坑,面試很常見

普通函數
def func(x,y):
    return x,y
print(func(1,2))   #(1,2)

返回的是一個元組, 但是通過lambda怎麽實現呢?

lmd1 = lambda x,y : x , y
print(lmd1(1,2)) #NameError: name ‘y‘ is not defined 結果會報錯, 因為程序會把這個lambda表達式看成一個元組: 第一個元素是 lambda x,y : x 第二個元素是 y 怎麽可以實現普通函數一樣的結果呢 lmd2 = lambda x, y : (x,y) print(lmd2(1,2)) #(1,2)

sorted() 排序函數

語法: sorted(iterable, key=None, reverse=False)

iterable: 可叠代對象

key: 排序規則(排序函數), 在sorted內部會將可叠代對象中的每一個元素傳遞給這個函數的參數

根據函數的運算結果進行排序

reverse: 是否要倒序. True就是倒序

之前講過普通數列的排序

lst = [11,9,23,13,43,19,8]
lst.sort() #list的方法
print(lst) #[8, 9, 11, 13, 19, 23, 43]
內置函數sorted() 提供的通用的排序方法 所有的可叠代的對象都能用

lst = [11,9,23,13,43,19,8]
s = sorted(lst)
print(s)

dic = {1:"a",3:"c",2:"b"}
dic2 = sorted(dic)
print(dic2) #[1, 2, 3] 對於字典返回的是key值的排序

sorted()和函數組合使用

按照字符串的長度排序
lst = ["西遊記","三國演義","葫蘆娃","亮劍"]
def func(s):
    return len(s)

ll = sorted(lst, key=func, reverse=True) #加上reverse就會反向排序
print(ll) #[‘三國演義‘, ‘西遊記‘, ‘葫蘆娃‘, ‘亮劍‘]

key是排序方案,sorted函數內部會把可叠代對象中的每一個元素拿出來交給後面的key
後面的key算出一個數字,作為當前這個元素的權重,整個函數根據權重重新排序

sorted() 和lambda配合使用

lst = [{"name":"汪峰","age":48},
       {"name":"章子怡", "age":30},
       {"name":"alex123","age":33}
       ]
def func(el):
    return el["age"]

ll = sorted(lst, key=func) #和普通函數一起使用 根據年紀排序
print(ll)
#[{‘name‘: ‘章子怡‘, ‘age‘: 30}, {‘name‘: ‘alex‘, ‘age‘: 33}, {‘name‘: ‘汪峰‘, ‘age‘: 48}]

l2 = sorted(lst, key=lambda el: el["age"], reverse=True) #根據年紀 倒序排列 從大到小
print(l2)
#[{‘name‘: ‘汪峰‘, ‘age‘: 48}, {‘name‘: ‘alex‘, ‘age‘: 33}, {‘name‘: ‘章子怡‘, ‘age‘: 30}]

l3 = sorted(lst, key=lambda el: len(el["name"]), reverse=True) #根據名字的長度
print(l3)
#[{‘name‘: ‘alex‘, ‘age‘: 33}, {‘name‘: ‘章子怡‘, ‘age‘: 30}, {‘name‘: ‘汪峰‘, ‘age‘: 48}]

filter()篩選函數

語法: filter(function, iterable)

function:用來篩選的函數. 在filter中會自動把iterable中的元素傳遞給函數,然後函數根據返回的True或者Fasle判斷是否保留這個數

iterable: 可叠代對象

#把iterable裏的每一個值傳遞給func,判斷True 還是False, 最後把判斷結果是True的返回
#把姓張的名字過濾掉

lst = ["張無忌", "張鐵林", "趙一寧", "石可心","馬大帥"]
f = filter(lambda el: el[0] != "",lst)
# print(f) #<filter object at 0x01CE5690>
# print("__iter__" in dir(f))#True  判斷一下f 是不是可以叠代對象
for i in f:
    print(i)
結果:
趙一寧
石可心
馬大帥
#當func是None的時候, 過濾出來的是可叠代對象裏面的不為空的值 

lst = [1,2,3,4,[],{},None]
f = filter(None,lst)
for i in f:
    print(i)
結果是
1
2
3
4

map() 映射函數

語法: map(function, iterable) 對可叠代對象中的每一個元素進行映射, 分別取值執行function

#計算相同位置的和  和zip()一樣有水桶效應 根據list中元素少的那個計算求和
lst = [1,3,5,7,9]
lst2 = [2,4,6,8,10]
m = map(lambda x,y: x+y, lst,lst2)
print(list(m))  #[3, 7, 11, 15, 19]
計算列表中每個元素的平方,返回一個新列表
print(list(map(lambda x: x * x, [1,2,3,4])))
#[1, 4, 9, 16]

lambda匿名函數和他的小夥伴