日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python有趣的面试题_一道3行代码的Python面试题,我懵逼了...|python基础教程|python入门|python教程...

發(fā)布時間:2023/12/10 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python有趣的面试题_一道3行代码的Python面试题,我懵逼了...|python基础教程|python入门|python教程... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。