您好,登錄后才能下訂單哦!
本篇內容主要講解“python面試題實例代碼分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“python面試題實例代碼分析”吧!
def multiply(): return [lambda x: i * x for i in range(4)] print([m(100) for m in multiply()])
運行結果:
[300, 300, 300, 300]
上面代碼的運行結果很容易被誤判為[0, 100, 200, 300]
。首先需要注意的是multiply
函數用生成式語法返回了一個列表,列表中保存了4個Lambda函數,這4個Lambda函數會返回傳入的參數乘以i
的結果。需要注意的是這里有閉包(closure)現象,multiply
函數中的局部變量i
的生命周期被延展了,由于i
最終的值是3
,所以通過m(100)
調列表中的Lambda函數時會返回300
,而且4個調用都是如此。
如果想得到[0, 100, 200, 300]
這個結果,可以按照下面幾種方式來修改multiply
函數。
方法一:使用生成器,讓函數獲得i
的當前值。
def multiply(): return (lambda x: i * x for i in range(4)) print([m(100) for m in multiply()])
或者
def multiply(): for i in range(4): yield lambda x: x * i print([m(100) for m in multiply()])
方法二:使用偏函數,徹底避開閉包。
from functools import partial from operator import __mul__ def multiply(): return [partial(__mul__, i) for i in range(4)] print([m(100) for m in multiply()])
到此,相信大家對“python面試題實例代碼分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。