2024-01-17|閱讀時間 ‧ 約 31 分鐘

[Python基礎]Lambda匿名函式

[Python基礎]理解自定函式

有別於上一篇自定函式,如果我只是想要重複做一些很簡單的運算,還有沒有更簡潔的方式,那就是Lambda匿名函式。

本文將介紹,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

導入1,2代入x,y返回x+y

計算平方的函式

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,...)
  • function : 函式
  • iterable : 一個或多個可迭代對象,例如list,dit,tuple,set。

計算平方的函式 + 列表輸入

結合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,...)
  • function : 函式
  • iterable : 一個或多個可迭代對象,例如list,dit,tuple,set。

只取偶數+列表輸入

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]
  1. numbers中的元素,依序代入x
  2. 代入至運算式的x做運算,滿足餘除2等於0的狀況就將該值返回至even_numbers的list儲存
  3. 最後輸出[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 進行排序:

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],表示按照每個元組中的第二個元素(即成績)進行排序

  1. key=lambda x: x[1]: 使用 lambda 函數定義排序的鍵,這裡是使用每個元組的第二個元素(即成績)作為排序的依據。
  2. reverse=True: 指定降序排列。
  3. 並將排序後的結果賦值給 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}]
  1. 學生列表 students定義了一個列表,其中包含三個字典,每個字典表示一位學生,包含 'name' 'age' 兩個鍵。
  2. key=lambda x: x['age']: 使用 lambda 函數定義排序的鍵,目的是取出['age']的值讓sorted來排序。
  3. 將排序後的結果賦值給 sorted_students

圖中的1,2,3代表依sorted_students元素編號依序引入取出,正常元素編號為0開始,這裡為方便大家聯想,故由順序1開始。

依元素編號來做排序

注意key取出來的值是要使用整數浮點數或其他可比較型態

程式一定要練習打打看,或修改其參數試試,才能理解貫通


謝謝大家觀看~ 希望大家會喜歡,喜歡的話可以給愛心~追蹤一下,不會漏掉之後的文章喔~





分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.