国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python 面試中 8 個必考問題

2020-02-15 23:43:54
字體:
來源:轉載
供稿:網友

1、下面這段代碼的輸出結果是什么?請解釋。

def extendList(val, list=[]):  list.append(val)  return listlist1 = extendList(10)list2 = extendList(123,[])list3 = extendList('a')print "list1 = %s" % list1print "list2 = %s" % list2print "list3 = %s" % list3

怎樣修改extendList的定義能夠產生以下預期的行為?

上面代碼輸出結果將是:

list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']

很多人都會誤認為list1=[10],list3=[‘a'],因為他們以為每次extendList被調用時,列表參數的默認值都將被設置為[].但實際上的情況是,新的默認列表只在函數被定義的那一刻創建一次。

當extendList被沒有指定特定參數list調用時,這組list的值隨后將被使用。這是因為帶有默認參數的表達式在函數被定義的時候被計算,不是在調用的時候被計算。因此list1和list3是在同一個默認列表上進行操作(計算)的。而list2是在一個分離的列表上進行操作(計算)的。(通過傳遞一個自有的空列表作為列表參數的數值)。

extendList的定義可以作如下修改。

盡管,創建一個新的列表,沒有特定的列表參數。

下面這段代碼可能能夠產生想要的結果。

def extendList(val, list=None): if list is None:  list = [] list.append(val) return list

通過上面的修改,輸出結果將變成:

list1 = [10]
list2 = [123]
list3 = ['a']

2、下面這段代碼的輸出結果將是什么?請解釋。

def multipliers(): return [lambda x : i * x for i in range(4)]print [m(2) for m in multipliers()]

你如何修改上面的multipliers的定義產生想要的結果?

上面代碼輸出的結果是[6, 6, 6, 6] (不是我們想的[0, 2, 4, 6])。

上述問題產生的原因是Python閉包的延遲綁定。這意味著內部函數被調用時,參數的值在閉包內進行查找。因此,當任何由multipliers()返回的函數被調用時,i的值將在附近的范圍進行查找。那時,不管返回的函數是否被調用,for循環已經完成,i被賦予了最終的值3。

因此,每次返回的函數乘以傳遞過來的值3,因為上段代碼傳過來的值是2,它們最終返回的都是6(3*2)。碰巧的是,《The Hitchhiker's Guide to Python》也指出,在與lambdas函數相關也有一個被廣泛被誤解的知識點,不過跟這個case不一樣。由lambda表達式創造的函數沒有什么特殊的地方,它其實是和def創造的函數式一樣的。

下面是解決這一問題的一些方法。

一種解決方法就是用Python生成器。

def multipliers(): for i in range(4): yield lambda x : i * x
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兴山县| 安龙县| 星子县| 阳泉市| 绥芬河市| 宝山区| 改则县| 九龙坡区| 铁力市| 遂川县| 深圳市| 德保县| 广丰县| 吴堡县| 苏尼特右旗| 历史| 二连浩特市| 镇安县| 依兰县| 沛县| 兖州市| 阿坝县| 望奎县| 建湖县| 克什克腾旗| 邓州市| 天柱县| 永川市| 陵水| 格尔木市| 安塞县| 石阡县| 洪雅县| 德庆县| 辽中县| 旬邑县| 堆龙德庆县| 怀化市| 平利县| 安陆市| 上思县|