(二十)python 3 匿名函數

匿名函數lambda

Python使用lambda關鍵字創造匿名函數。所謂匿名,意即不再使用def語句這樣標準的形式定義一個函數。這種語句的目的是由于性能的原因,在調用時繞過函數的棧分配。其語法是:

lambda [arg1[, arg2, ... argN]]: expression

其中,參數是可選的,如果使用參數的話,參數通常也會在表達式之中出現。

無參數
# 使用def定義函數的方法
def true():return True#等價的lambda表達式
>>> lambda :True
<function <lambda> at 0x0000000001E42518># 保留lambda對象到變量中,以便隨時調用
>>> true = lambda :True
>>> true()
True
一個參數 
# 使用def定義的函數
def add( x, y ):return x + y# 使用lambda的表達式
lambda x, y: x + y# lambda也允許有默認值和使用變長參數
lambda x, y = 2: x + y
lambda *z: z# 調用lambda函數
>>> a = lambda x, y: x + y
>>> a( 1, 3 )
4
>>> b = lambda x, y = 2: x + y
>>> b( 1 )
3
>>> b( 1, 3 )
4
>>> c = lambda *z: z
>>> c( 10, 'test')
(10, 'test')

lambda是單個的表達式,不是一個代碼塊 lambda的設計是為了滿足簡單函數的場景,僅能封裝有限的邏輯,有復雜邏輯的情況有def來處理,所以lambda的功能要比def小的多  

lambda表達式是可以嵌套的(閉包)

>>> action = (lambda x : (lambda y : x + y))
>>> a = action(10)
>>> a(5)
15

匿名函數的使用  

匿名函數通常被用作高階函數(higher-order function,參數為函數的函數)的參數。比如,幾個內置函數:filter(),map(),reduce()。下面我們分別看看這幾個函數的用法及達到相同效果的python另一種特征的用法

filter函數

>>> list = [1, 2, 3]
>>> result = filter(lambda x: x%2==0, list)
>>> result
[2]
>>> result = [x for x in list if x%2==0]
>>> result
[2]

map函數

>>> result = map(lambda x: x*2, list)
>>> result
[2, 4, 6]
>>> result = [x*2 for x in list]
>>> result
[2, 4, 6]

reduce函數

>>> result = reduce(lambda x, y: x+y,list)
>>> result
6
>>> result = sum(list)
>>> result
6

跳轉表(jump table) 

lambda的另一種用法是用來編寫跳轉表,也就是行為列表或字典,能按需執行特定的動作。

>>> key = "get"
>>> {"abc":(lambda : 2 + 2),"bcd" : (lambda : 3 + 3), "get" : (lambda : 4 + 4)}

[key]() 8

  

注意問題:

x = 10
a = lambda y: y + xx = 20 
b = lambda y: y + x#猜想一下:a(10) 和 b(10)返回的結果是什么?如果你認為結果是20 和 30,那么就錯了print(a(10))  ##輸出:30print(b(10))  ##輸出:30

lambda表達式中的x是一個自由變量, 是在運行時綁定值,而不是定義時就綁定,即lambda表達式中的x是執行時的值,這與函數的默認值參數定義是不同的。例如:

x = 15
print(a(10))  ##輸出:25x = 3
print(a(10)) ##輸出:13

如果想讓匿名函數,在定義時就捕獲到參數值,可以將那個參數值定義成默認參數即可,例如:

m = 4
c = lambda n, m = m: m + nprint(c(10))  ##輸出:14m = 2
print(c(10))  ##輸出:14

  

有時候,可能會不恰當的使用lambda表達式。 比如,通過在一個循環或列表推導中創建一個lambda表達式列表,并期望函數能在定義時就記住每次的迭代值。例如:

funcs = [lambda x: x+n for n in range(3)]
for f in funcs:print(f(0))# 2
# 2
# 2

但是實際效果是,n的值為迭代的最后一個值。將參數值設置為默認參數,才能得到想要的效果,修改代碼如下:

funcs = [lambda x, n = n: x+n for n in range(3)]
for f in funcs:print(f(0))# 0
# 1
# 2

  

?

轉載于:https://www.cnblogs.com/a-ant/p/11030145.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386634.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386634.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386634.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker中啟動關閉刪除所有的容器命令

docker中 重啟啟動所有的容器命令 docker restart $(docker ps -a | awk { print $1} | tail -n 2)docker中 啟動所有的容器命令 docker start $(docker ps -a | awk { print $1} | tail -n 2)docker中 關閉所有的容器命令 docker stop $(docker ps -a | awk { print $1} | …

真香警告!2021Android高級面試題,揮淚整理面經

前言 這是“拔劍金九銀十”的第二篇文章&#xff0c;本文主要針對3年以上的Android開發者進階面試中高級開發工程師而整理。 希望可以對你們有所幫助。不多廢話&#xff0c;進入正題。 目錄&#xff1a; Java中高級 計算機網絡 Android高級面試—性能優化 Android優秀第三方…

51nod1584加權約數和

題目大意&#xff1a; 求:\[ \sum_{i-1}^n\sum_{j1}^nmax(i,j)\sigma(i*j) \] 題解 對于這個\(\max\)&#xff0c;套路的把它轉化成&#xff1a;\[ 2*\sum_{i1}^n\sum_{j1}^ii*\sigma(i*j)-\sum_{i1}^n i*\sigma(i*i) \] 對于前面的部分&#xff0c;我們可以&#xff1a;\[ \su…

冗余的阿里云實例開啟和停止API

停止使用的API URL:https://api.aliyun.com/?spm5176.12818093.resource-links.dapi_platform.488716d0OrHCwQ#/?productEcs&version2014-05-26&apiStopInstance&tabDEMO&langJAVA 啟動實例&#xff1a; URL:https://api.aliyun.com/?spm5176.12818093.re…

知乎大V推薦!面試官6個靈魂拷問,原理+實戰+視頻+源碼

概述 想了很久怎么樣可以讓文章的標題不那么悲觀&#xff0c;但是各種文案都在我腦海里面不斷的被否定&#xff0c;要么是不那么抓眼球&#xff0c;要么是立意不匹配。最后想了想&#xff0c;這個標題是真的符合我最近的感悟。 希望看過文章&#xff0c;能有同感的朋友也能多…

Codeforces Round #499 (Div. 1) Solution

Codeforces Round #499 (Div. 1) Solution https://codeforces.com/contest/1010 為啥我\(\rm Div.1\)能\(A4\)題還是\(\rm specialist....\) A. Fly 二分答案&#xff0c;送分題。 #include<bits/stdc.h> using namespace std;void read(int &x) {x0;int f1;char ch…

Windows10家庭版安裝Docker Desktop(非Docker Toolbox)

現在大部分筆記本預裝的都是win10家庭版&#xff0c;而家庭版又不支持Hyper-V&#xff0c;Docker Desktop是無法直接安裝的。但其實家庭版是可以通過腳本開啟Hyper-V來安裝Docker Desktop的。下面就教大家如何操作。 開啟Hyper-V 添加方法非常簡單&#xff0c;把以下內容保存…

阿里P7手把手教你!阿里P7級別面試經驗總結,搞懂這些直接來阿里入職

什么是中年危機 根據權威數據顯示&#xff0c;國內IT程序員鼎盛時期是在25-27歲左右&#xff0c;30歲對于程序員而言完全是一個38線&#xff0c;接著就是轉業轉崗的事情&#xff0c;這一點在業界也算是一個共識了。 大學畢業步入IT行業普遍年齡也是在22歲左右&#xff0c;然而…

自適應閾值化操作:adaptiveThreshold()函數

在圖像閾值化操作中&#xff0c;更關注的是從二值化圖像中&#xff0c;分離目標區域和背景區域&#xff0c;但是僅僅通過設定固定閾值很難達到理想的分割效果。而自適應閾值&#xff0c;則是根據像素的鄰域塊的像素值分布來確定該像素位置上的二值化閾值。這樣做的好處&#xf…

阿里P8親自教你!Activity的6大難點,你會幾個?年薪50W

前言 網上有很多對程序員簡歷的一些指導&#xff0c;這里就不重述&#xff0c;大家可以搜下網上其他大神的總結&#xff0c;結合自身情況修改下。我有幾點建議&#xff1a; 1.盡量不要花哨&#xff0c;程序員和設計師或者產品運營還不一樣&#xff0c;我們的簡歷成功與否決定…

為什么選用NACOS

Nacos Nacos 致力于幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集&#xff0c;幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。 Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。 Nacos 是構建以“服務”為中心的現代應用架構 (例如…

Qt樣式表之一:Qt樣式表和盒子模型介紹

一、Qt樣式表介紹 Qt樣式表是一個可以自定義部件外觀的十分強大的機制&#xff0c;可以用來美化部件。Qt樣式表的概念、術語和語法都受到了HTML的層疊樣式表&#xff08;Cascading Style Sheets, CSS)的啟發&#xff0c;不過與CSS不同的是&#xff0c;Qt樣式表應用于部件的世界…

阿里P8大佬親自教你!Android內存泄漏總結,看看這篇文章吧!

前言 這次去騰訊面試的是我大學同學&#xff0c;我們大學都是一學習&#xff0c;一起吃飯&#xff0c;一起洗腳&#xff0c;一起。。。 他們公司最近也裁員了&#xff0c;不過他是裁員前去的騰訊&#xff0c;不知道誰撈到他簡歷了&#xff0c;莫名就走了流程&#xff0c;他莫…

Sentinel在訂單大量服務調用的應用場景

Sentinel譯為“哨兵”&#xff0c;顧名思義&#xff0c;面對您后臺的大量服務/微服務&#xff0c;前置一個哨兵&#xff0c;但面對大量請求時&#xff0c;讓后臺服務有序被調用&#xff0c;但某些服務的不可用時&#xff0c;采用服務熔斷降級等措施&#xff0c;讓系統仍能平穩運…

leetcode 214 Shortest Palindrome

lc214 Shortest Palindrome 可以將問題轉化成找到原字符串的最長palindrome子串&#xff08;注意&#xff0c;子串必須以s[0]為起始&#xff09; 例如&#xff1a;sdserf sds為最長palindrome子串 只需要將sds之后的子串翻轉一下&#xff0c;補充到原字符串之前即可 fre sdser…

程序員深度學習!我想談談關于Android面試那些事,附贈課程+題庫

想要成為一名優秀的Android開發&#xff0c;你需要一份完備的知識體系&#xff0c;在這里&#xff0c;讓我們一起成長為自己所想的那樣~。 25%的面試官會在頭5分鐘內決定面試的結果60%的面試官會在頭15分鐘內決定面試的結果 一般來說&#xff0c;一場單面的時間在30分鐘左右&…

MOSS 代替Spring Boot Admin 的服務治理工具

1.1 什么是服務治理 服務治理&#xff0c;我也稱之為微服務治理&#xff0c;是指用來管理微服務的整個生命周期。包括應用的創建&#xff0c;服務名的規范&#xff0c;服務的上下線&#xff0c;服務的遷移&#xff0c;整個服務的生老病死等方方面面的治理。 1.2 Moss概述 Mo…

Django之form表單組件、cookie與session

---恢復內容開始--- Form表單組件 引例&#xff1a; 先來看一個注冊的例子&#xff0c;全部用的是reg函數來實現的。 views.py文件 def reg(request):errors {username:,password:}if request.method POST:username request.POST.get(username)password request.POST.get(p…

程序員經驗分享:Android高級工程師系列學習路線介紹,面試必備

前言 曾聽過很多人說Android學習很簡單&#xff0c;做個App就上手了&#xff0c;工作機會多&#xff0c;畢業后也比較容易找工作。這種觀點可能是很多Android開發者最開始入行的原因之一。 在工作初期&#xff0c;工作主要是按照業務需求實現App頁面的功能&#xff0c;按照設…

Java實現將文件或者文件夾壓縮成zip

Java實現將文件或者文件夾壓縮成zip 最近碰到個需要下載zip壓縮包的需求&#xff0c;于是我在網上找了下別人寫好的zip工具類。但找了好多篇博客&#xff0c;總是發現有bug。因此就自己來寫了個工具類。 這個工具類的功能為&#xff1a; &#xff08;1&#xff09;可以壓縮文件…