[編程基礎] Python lambda函數總結

Python lambda函數教程展示瞭如何在Python中創建匿名函數。Python中的匿名函數是使用lambda關鍵字創建的。

1 介紹

Python lambda函數也稱爲匿名函數,是沒有名稱的內聯函數。它們是用lambda關鍵字創建的。這是內置Python的函數範型的一部分。
Python lambda函數僅限於一個表達式。它們可以在任何可以使用正常功能的地方使用。

Python lambda具有以下語法:

z = lambda x: x * y

語句使用lambda關鍵字創建匿名函數。函數將兩個值相乘。x是傳遞給lambda函數的參數。參數x後面跟着一個冒號字符。冒號右邊的代碼是在調用lambda函數時執行的表達式。lambda函數被分配給z變量。

1.1 簡單使用

在下面示例中,我們有兩個函數對一個值求平方。

def square(x):
    
    return x * x

# 這裏我們用lambda定義一個匿名的內聯函數。請注意,該函數沒有名稱。sqr_fun是保存創建的lambda函數的變量的名稱
sqr_fun = lambda x: x * x

print(square(3))

print(sqr_fun(4))
9
16

lambda函數也可以不輸入,示例如下:

def constant():
    return 1

# lambda本質是一個匿名函數
constant_fun = lambda: 1 

print(constant())
print(constant_fun())
1
1

lambda函數也可以多輸入參數,示例如下:

def product(x, y):
    
    return x * y

# 冒號左邊輸入兩個參數
product_fun = lambda x,y : x * y

print(product(3,4))

print(product_fun(4,3))
12
12

1.2 Python lambda與map

Python lambda函數對於該map() 函數很有用。我們可以創建更簡潔的代碼。Python map() 是一個內置函數,它將給定的函數應用於迭代器iterable的每一項,並返回一個迭代器iterator對象。
注意的是Python2 map函數返回列表,Python3 map函數返回迭代器。

def square(x):
    return x * x

# 計算列表各個元素的平方
result=map(square,[1,2,3,4,5])

print(result)

# 需要遍歷迭代器
for i in result:
    print(i)
<map object at 0x7fc638814c10>
1
4
9
16
25

Python lambda函數對於map()函數很有用。我們可以創建更簡潔的代碼。Python map()是一個內置函數,它將給定的函數應用於iterable的每個項,並返回一個迭代器對象。
以下示例爲map()創建了一個內聯函數作爲參數。使用map()函數,我們將lambda函數應用於列表的每個元素。

nums = [1, 2, 3, 4, 5, 6]

nums_squared = map(lambda x: x * x, nums)

for num in nums_squared:
    print(num)
1
4
9
16
25
36

當然lambada函數可以結合map()函數,輸入兩個參數,以下示例提供了兩個列表,對兩個列表中相同位置的數據進行相加

num_add = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])

for num in num_add:
    print(num)
3
7
11
15
19

1.3 Python lambda與filter

Python lambda函數可以與filter()函數一起使用。函數的作用是:從iterable中返回true的元素構造一個列表。

filte()函數爲python自帶函數,主要用於過濾掉不符合設定條件的元素,並返回符合條件元素組成的迭代器iterable。該函數有兩個輸入參數,第一個參數爲處理函數,第二個參數爲要處理的序列。序列的每個元素作爲參數給函數進行判斷,返回True或 False,過濾到返回False的參數,並將返回 True 的元素放到迭代器中。

下面示例展示通過使用filter()濾除奇數示例如下:

def is_even(x):
    return x % 2 == 0

result = filter(is_even, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(result)

for i in result:
    print(i)
<filter object at 0x7fc638548650>
2
4
6
8
10

以下示例中,lambda函數結合filter函數過濾了整數列表。新列表僅包含奇數整數。filter()中第一個函數爲處理列表元素的函數,也就是lambda函數。

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

nums_filtered = list(filter(lambda x: x % 2, nums))

print(nums_filtered)
[1, 3, 5, 7, 9, 11]

1.4 Python lambda與sort

Python列表有一個內置的列表排序()就地修改列表的方法。該方法有一個關鍵參數,用於在進行比較之前指定要在每個列表元素上調用的函數。在這裏我們可以使用lambda函數。以下示例展示了使用lambda函數,按照用戶的出生日期以相反的順序對其進行排序。

users = [
  {'name': 'John Doe', 'date_of_birth': 1987},
  {'name': 'Jane Doe', 'date_of_birth': 1996},
  {'name': 'Robert Brown', 'date_of_birth': 1977},
  {'name': 'Lucia Smith', 'date_of_birth': 2002},
  {'name': 'Patrick Dempsey', 'date_of_birth': 1994}
]

# 獲取列表的date_of_birth對應的值
def takeBirth(elem):
    return elem['date_of_birth']

# 從小到大排列
users.sort(key=takeBirth)
for user in users:
    print(user)

print('-'*50)

# list.sort()中reverse表示從大到小排列,key表示指定列表中的某個元素進行排列
users.sort(reverse=True, key=lambda e: e['date_of_birth']) 

for user in users:
    print(user)
{'name': 'Robert Brown', 'date_of_birth': 1977}
{'name': 'John Doe', 'date_of_birth': 1987}
{'name': 'Patrick Dempsey', 'date_of_birth': 1994}
{'name': 'Jane Doe', 'date_of_birth': 1996}
{'name': 'Lucia Smith', 'date_of_birth': 2002}
--------------------------------------------------
{'name': 'Lucia Smith', 'date_of_birth': 2002}
{'name': 'Jane Doe', 'date_of_birth': 1996}
{'name': 'Patrick Dempsey', 'date_of_birth': 1994}
{'name': 'John Doe', 'date_of_birth': 1987}
{'name': 'Robert Brown', 'date_of_birth': 1977}

2 參考

http://zetcode.com/python/lambda/

https://www.runoob.com/python/python-built-in-functions.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章