Python 知識點 面試小點列表生成式小坑

2022-05-17 15:37:20 字數 2177 閱讀 1195

有這麼乙個小面試題:

看下面**請回答輸出的結果是什麼?為什麼?

result = [lambda x: x + i for i in range(10)]

print(result[0](10))

當你看到這篇文章的時候如果不知道這個知識點肯定會拿去直接執行,輸出的結果是什麼呢?

結果是:19

通過result[0~9](10)結果都是19就,懵逼了吧~~

想知道這個我們先看幾個知識點

顧名思義,列表生成式就是乙個用來生成列表的特定語法形式的表示式。

語法格式:

[expression for iterable_var in iterable]

工作過程:

工作過程類似於:

l =

for i in range(10):

#舉例expression 表示式 iterable_var * 5 ,最後把這個結果加到列表中

點到為止,我們來看下我們的這個小面試題

result = [lambda x: x + i for i in range(10)]

#後面的lambada x:x +i 為expression 這是乙個普通的lambada表示式那他生成的結果是什麼? 乙個乙個的函式

#看下面的例子就舒服多了

l =for i in range(10):

lambda x: x +i)

那在我們執行result[0](10),其實就是在執行lambda 10: 10 + i ,但是為什麼每個i都是9呢?

我們在寫乙個函式的時候,函式內不儲存這個變數的值,而是在執行的時候去找這個值在**繫結上的。

舉個例子來說我們在函式中定引用了乙個變數,可以不需要提前定義我們只要在使用前定義就可以了,如下面**

def

func():

print

(foo)

foo = "

hello tim

"func()

注:這裡有個點稍微提醒下,呼叫函式時這個函式必須是提前定義好的,這個我們稱之為「前向引用」,而函式內部變數可以後期再定義,我們稱之為「後期繫結」

因為這個變數不是在lambda內定義的,而是在列表生成式內定義的,我先把列表生成式翻譯一下:

def

make_list():

l =for i in range(10):

definner(arg):

return i +arg

return

lresult =make_list()

print(result[2](10))

看上面的**最後返回的都是乙個乙個的函式,而這個i的值是在迴圈的時候賦值的,那我們知道這個i的值不是在,inner(lambda)函式中定義的,而是引用的上層函式的變數,當我們使用inner去呼叫的時候,這時這個for迴圈已經結束了,i的值也就變成固定了9

所以每當我們通過函式lambda x: x + i 的時候這個i永遠是9

那如果說我不想要這樣的結果,我想要i是迴圈的值怎麼辦,不要直接引用上層變數,把變數傳進來就可以了

result = [lambda x, i=i, : x + i for i in range(10)]

print(result[1](10))

翻譯一下

def

make_list():

l =for i in range(10):

def inner(arg, i=i):

return i +arg

return

lresult =make_list()

print(result[2](10))

簡單解釋下這個概念,在巢狀函式內,巢狀函式應用上層函式的變數(不是全域性變數)稱之為閉包,

def

func():

x = 1

definner():

print(x)

當我們執行func的時候就會生成乙個閉包,func執行完後裡面的變數x不會被**,因為巢狀函式inner還在使用它,常見的應用場景就是我們的裝飾器

搞定Python面試必問知識點 列表

python3有6種標準型別 number 數字 string 字串 tuple 組 list 列表 dictionary 字典 set 集合 其中,列表是python中最基本也是最常用的資料結構。列表中的每個元素都分配乙個數字,即它的位置,或索引,第乙個索引是0,第二個索引是1,依此類推。在關於p...

python列表知識點總結

list1 1,2,3,string 1,2,3 索引 print list1 3 print list1 3 2 切片 print list1 0 5 2 print list1 1 str1 1,2,3,string 1,2,3 insert 在列表中插入元素 print list1.inser...

知識點 面試

參 dom document object model,即文件物件模型 是 w3c 組織推薦的處理 xml 的一種方式。dom解析器在解析xml文件時,會把文件中的所有元素,按照其出現的層次關係,解析成各個node物件 節點 優點 把xml檔案在記憶體中構造樹形結構,可以遍歷和修改節點 缺點 如果檔...