有別於上一篇自定函式,如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。
本文將介紹,Lambda匿名函式的用法,也比較跟自定函式的差異之處。
fun = lambda arguments: expression
指定名稱 = 參數1,參數2,...: 運算式
lambda
是關鍵字。arguments
是參數列表,可以是零個或多個參數。expression
是一個單一的表達式,該運算式的計算結果將成為這個匿名函數的返回值。用簡單的加法來比較匿名函式與自定函式的差異,匿名函式一行就搞定了,也不用定義函式名稱。
add = lambda x, y: x + y
def add_fun(x,y):
return x+y
print(add(1,2)) # output 3
print(add_fun(1,2)) # output 3
square = lambda x: x**2
def calculate_square(x):
return x**2
print(square(4)) # output: 16
print(calculate_square(4)) # output: 16
lambda 函數可以結合多種內建函數和標準庫函數,以應用於各種情境。
map
函式:map
函式將一個函式應用於一個或多個可迭代對象的對應元素。 lambda
函數通常與 map
一起使用,尤其是對列表中的每個元素進行操作。
map(function, iterable_1, iterable_2,...)
結合lambda
函式一起使用,利用此方法,讓numbers每個元素都進入lambda
函式運算在返回列表。
lambda
函式 + Map
函式
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared) # 輸出: [1, 4, 9, 16, 25]
也可以將上方有出現過的自定函式範例套過來,一樣結合map函式來做應用。
有此範例就能明顯感受到兩者差異,map結合匿名函式一行就看得清楚,是在做什麼,但結合自定函式,還要往上看自定函式是做什麼運算式。
自定 函式 + Map
函式
def calculate_square(x):
return x**2
numbers = [1, 2, 3, 4, 5]
squared = list(map(calculate_square, numbers))
print(squared) # 輸出: [1, 4, 9, 16, 25]
filter
函數:filter
函數用於過濾可迭代對象中的元素,返回滿足條件的元素列表。
語法
filter(function, , iterable_2,...)
lambda
函式 + filter
函式
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 輸出: [2, 4, 6, 8, 10]
自定 函式 + filter
函式
兩者的差異就在filter代入Funtion那參數改為自定函式或匿名函式。
匿名函式優點在簡潔,在大型專案中常見,這樣可避免一推自定函式跟函式名稱
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 輸出: [2, 4, 6, 8, 10]
# 對應的自定義函式
def is_even(x):
return x % 2 == 0
even_numbers_custom = list(filter(is_even, numbers))
print(even_numbers_custom) # 輸出: [2, 4, 6, 8, 10]
sorted
函數:sorted
函數用於對可迭代對象進行排序。它返回一個新的已排序的列表,而不改變原始可迭代對象。
語法
sorted(iterable, key=None, reverse=False)
iterable
: 要排序的可迭代對象,例如列表、元組、字典的鍵或值等。key
(可選): 用於指定一個函數,該函數將應用於每個元素,並根據函數的結果進行排序。默認為 None
,表示直接比較元素本身。reverse
(可選): 一個布爾值,表示是否按照降序排列。默認為 False
,即升序排列。默認為生序排列,由小排到大。
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = sorted(numbers)
print(sorted_numbers)
# 輸出: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
reverse=True
為降序,由大排到小。
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers_desc = sorted(numbers, reverse=True)
print(sorted_numbers_desc)
# 輸出: [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
key
進行排序:要先轉換成列表,才會有元素索引概念,才能去迭代整理。
grades = {'Alice': 90, 'Bob': 75, 'Charlie': 88, 'David': 92}
sorted_grades = sorted(grades.items(), key=lambda x: x[1], reverse=True)
print(sorted_grades)
# 輸出: [('David', 92), ('Alice', 90), ('Charlie', 88), ('Bob', 75)]
1. grades.items()
: 將字典轉換為包含鍵-值對的元組列表,每個元組的形式為 (key, value)
。
2.grades.items()
返回的是一個類似 [('Alice', 90), ('Bob', 75), ('Charlie', 88), ('David', 92)]
的列表。當你對這個列表使用 sorted
函數時,你需要告訴它按照哪個鍵進行排序。這裡使用 key=lambda x: x[1]
,表示按照每個元組中的第二個元素(即成績)進行排序。
key=lambda x: x[1]
: 使用 lambda
函數定義排序的鍵,這裡是使用每個元組的第二個元素(即成績)作為排序的依據。reverse=True
: 指定降序排列。sorted_grades
。key
參數進行排序:排序的依據是每個字典中 'age'
鍵對應的值,此範例已經是列表,所以不用像上面的範例去做轉換。
students = [
{'name': 'Alice', 'age': 25},
{'name': 'Bob', 'age': 22},
{'name': 'Charlie', 'age': 28}
]
# 根據年齡升序排列
sorted_students = sorted(students, key=lambda x: x['age'])
print(sorted_students)
# 輸出: [{'name': 'Bob', 'age': 22}, {'name': 'Alice', 'age': 25}, {'name': 'Charlie', 'age': 28}]
students
:定義了一個列表,其中包含三個字典,每個字典表示一位學生,包含 'name'
和 'age'
兩個鍵。key=lambda x: x['age']
: 使用 lambda
函數定義排序的鍵,目的是取出['age']
的值讓sorted
來排序。sorted_students
。圖中的1,2,3代表依sorted_students元素編號依序引入取出,正常元素編號為0開始,這裡為方便大家聯想,故由順序1開始。