python 閉包蔫巩,可變參數

導論

首先,回顧下閉包的概念:返回函數

然后看下這篇文章里的例子:Default Parameter Values in Python

注意到叶组,

for i in range(10):
    def callback():
        print "clicked button", i
    UI.Button("button %s" % i, callback)
only to find that all callbacks print the same value (most likely 9, in this case). The reason for this is that Python’s nested scopes bind to variables, not object values, so all callback instances will see the current (=last) value of the “i” variable. To fix this, use explicit binding:

有兩種思路來解決:綁定默認參數拯田,構建閉包。

綁定默認參數

for i in range(10):
    def callback(i=i):
        print "clicked button", i
    UI.Button("button %s" % i, callback)

通過綁定默認參數甩十,把指向外部環(huán)境的動態(tài)變量(隨著for循環(huán)進行一直在變化)固定住船庇,類似于"take a snapshot"。

接下來枣氧,如果需要向callback傳遞別的參數怎么辦溢十?
方案:

for i in range(10):
    def callback(my_str, i=i):
        print my_str, i
    UI.Button("button %s" % i, callback)

閉包

for i in range(10):
    def closure()
        def callback():
            print "clicked button", i
        return callback
    UI.Button("button %s" % i, closure())

這里,因為closure()函數在返回另一個函數callback時达吞,需要將運行callback()所需的local variables都封裝好张弛,形成一個閉包,所以i的值被固定下來作為閉包的一部分一起返回酪劫。

應用

給定一個字典

character_start = {'examples': '例', 
                   'syns': '近', 
                   'ants': '反', 
                   'der': '派'}

希望通過一個循環(huán)吞鸭,把字典里的value由str轉變?yōu)槠ヅ渲付ㄗ址惺鬃址遣皇窃搒tr的函數。
比如覆糟,希望examples里存放的是一個判斷行首字符是否為的函數刻剥。該函數接受一個字符串作為輸入,根據判斷結果返回True或者False滩字。

不正確的實現方式:

incorrect_implement_character_start = {key: lambda s: s[0] == value.decode('utf-8') for key, value in character_start.iteritems()}
# pitfall: value is a global variable and is dynamically changing, 
# so finally all lambda's will refer to the last value, in this case it is the value of syns!

閉包 實現

for key, value in character_start.iteritems():
    def gen_match_fun_closure(_value):
        return lambda s: s[0] == _value.decode('utf-8')
    character_start[key] = gen_match_fun_closure(value)

綁定默認參數 實現

corrent_implement_character_start = {key: lambda (s, _value=value): s[0] == _value.decode('utf-8') for key, value in character_start.iteritems()}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末造虏,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子麦箍,更是在濱河造成了極大的恐慌漓藕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挟裂,死亡現場離奇詭異享钞,居然都是意外死亡,警方通過查閱死者的電腦和手機诀蓉,發(fā)現死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門栗竖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暑脆,“玉大人,你說我怎么就攤上這事狐肢√砺穑” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵处坪,是天一觀的道長根资。 經常有香客問我,道長同窘,這世上最難降的妖魔是什么玄帕? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮想邦,結果婚禮上裤纹,老公的妹妹穿的比我還像新娘。我一直安慰自己丧没,他們只是感情好鹰椒,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呕童,像睡著了一般漆际。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夺饲,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天奸汇,我揣著相機與錄音,去河邊找鬼往声。 笑死擂找,一個胖子當著我的面吹牛,可吹牛的內容都是我干的浩销。 我是一名探鬼主播贯涎,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼慢洋!你這毒婦竟也來了塘雳?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤普筹,失蹤者是張志新(化名)和其女友劉穎粉捻,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體斑芜,經...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年祟霍,在試婚紗的時候發(fā)現自己被綠了杏头。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盈包。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖醇王,靈堂內的尸體忽然破棺而出呢燥,到底是詐尸還是另有隱情,我是刑警寧澤寓娩,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布叛氨,位于F島的核電站,受9級特大地震影響棘伴,放射性物質發(fā)生泄漏寞埠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一焊夸、第九天 我趴在偏房一處隱蔽的房頂上張望仁连。 院中可真熱鬧,春花似錦阱穗、人聲如沸饭冬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昌抠。三九已至,卻和暖如春鲁僚,著一層夾襖步出監(jiān)牢的瞬間炊苫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工蕴茴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劝评,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓倦淀,卻偏偏與公主長得像蒋畜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子撞叽,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理姻成,服務發(fā)現,斷路器愿棋,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 兩本不錯的書: 《Python參考手冊》:對Python各個標準模塊科展,特性介紹的比較詳細。 《Python核心編程...
    靜熙老師哈哈哈閱讀 3,360評論 0 80
  • 要點: 函數式編程:注意不是“函數編程”糠雨,多了一個“式” 模塊:如何使用模塊 面向對象編程:面向對象的概念才睹、屬性、...
    victorsungo閱讀 1,510評論 0 6
  • 本章將會介紹 閉包表達式尾隨閉包值捕獲閉包是引用類型逃逸閉包自動閉包枚舉語法使用Switch語句匹配枚舉值關聯值原...
    寒橋閱讀 1,559評論 0 3
  • 86.復合 Cases 共享相同代碼塊的多個switch 分支 分支可以合并, 寫在分支后用逗號分開垮庐。如果任何模式...
    無灃閱讀 1,371評論 1 5