python有趣的面试题_一道3行代码的Python面试题,我懵逼了...|python基础教程|python入门|python教程...
https://www.xin3721.com/eschool/pythonxin3721/
前言
本文的文字及圖片來源于網(wǎng)絡(luò),僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,版權(quán)歸原作者所有,如有問題請及時聯(lián)系我們以作處理。
今天來說說交流群里一位群友問的Python題目。剛開始由于沒有電腦,我也沒有運行出來,之后查閱了一下資料才知道里面的知識還挺多的。廢話不多說,我們直接開始。
有意思的題目
題目:寫出下面程序運行結(jié)果
defmultipliers():return [lambda x:i*x for i in range(4)]print([m(2) for m in multipliers()])
正確答案:
[6,6,6,6]
第一眼看,不就是匿名函數(shù)嗎?但是仔細(xì)想想匿名函數(shù)在平時的開發(fā)中沒怎么用,所以也忘的差不多了。例如那個m(2)當(dāng)時就不懂是啥意思了。
好,我們就來看看這個題目,首先第一段代碼:
defmultipliers():return [lambda x:i*x for i in range(4)]
這是一個典型的列表推導(dǎo)式,簡而言之就是在列表中推導(dǎo)計算并且將計算的結(jié)果放入列表,上面這串代碼我們可以寫成:
squares =[]for i in range(4):
res= lambda x:i*x
squares.append(res)
這樣可能看的更加的簡單明了。但是這里面也有一個匿名函數(shù),計算i*x的值,如果大家對匿名函數(shù)不太懂的,可以去翻閱相關(guān)資料了解一下。
我們接下來看這段代碼:
print([m(2) for m in multipliers()])
其實這段代碼也很好理解,m(2)的意思就是將2作為參數(shù)傳入上面的匿名函數(shù)當(dāng)中,但是為什么結(jié)果等于[6,6,6,6]呢?
我們來debug一下看看:
斷點,開始debug
跳到了multipliers函數(shù)當(dāng)中
仍然在循環(huán)體中
運行到3,循環(huán)即將結(jié)束
跳轉(zhuǎn)下來
重新進(jìn)入匿名函數(shù)計算
計算
這里我省略了幾張圖,因為結(jié)果都是i=3 ,x=2,所以相乘自然為6。
相信大家看到這里仍然有很多的疑問,為什么i最后等于3?
其實這里涉及到閉包函數(shù)的概念,什么是閉包函數(shù)呢?
當(dāng)前函數(shù)引用到上一層函數(shù)的局部命名空間的變量時就會觸發(fā)閉包規(guī)則。我們說觸發(fā)了閉包的函數(shù)叫做閉包函數(shù),但是要注意一點:只有當(dāng)調(diào)用閉包函數(shù)的時候它才會去引用外層函數(shù)的變量,因為在調(diào)用閉包函數(shù)之前,閉包內(nèi)部的命名空間還不存在。
defmultipliers():
squares=[]for i in range(4):
res= lambda x:i*x
squares.append(res)
我們用這種方法來看待這個閉包函數(shù)lambda x:i*x,為什么稱它為閉包函數(shù)呢?因為當(dāng)執(zhí)行l(wèi)ambda x:i*x這串代碼時調(diào)用了上一層函數(shù)multipliers()的局部命名空間的變量i,所以此處是閉包函數(shù)。
但是此時的列表中并不是匿名函數(shù)計算出來的值,因為此時還沒有被調(diào)用,此時列表中只是有四個匿名函數(shù)的內(nèi)存地址:
[. at 0x1057d1710>, . at 0x10586dd40>, . at 0x10586de60>, . at 0x10586df80>]
那什么時候才算真正調(diào)用呢?在上面我們講過
print([m(2) for m in multipliers()])
這串代碼將2作為參數(shù)傳入上面的匿名函數(shù)當(dāng)中,此時也就是調(diào)用了匿名函數(shù)。當(dāng)去調(diào)用的時候,for i in range(4)這個循環(huán)已經(jīng)執(zhí)行完畢,此時的i已經(jīng)是3了,所以就有了最后的結(jié)果:
[6,6,6,6
歡迎點擊右上角關(guān)注小編,除了分享技術(shù)文章之外還有很多福利,私信學(xué)習(xí)資料可以領(lǐng)取包括不限于Python實戰(zhàn)演練、PDF電子文檔、面試集錦、學(xué)習(xí)資料等。
總結(jié)
以上是生活随笔為你收集整理的python有趣的面试题_一道3行代码的Python面试题,我懵逼了...|python基础教程|python入门|python教程...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (七)linux操作系统-linux韩顺
- 下一篇: python如何对一个属性或方法进行封装