閉包,迭代器,生成器,列表推導式

2022-08-13 08:24:14 字數 3103 閱讀 2212

1, 函式名就是函式的記憶體位址。

2, 函式名可以作為變數。

3, 函式名可以作為函式的引數。

4, 函式名可以作為容器類型別的元素。

5,函式名可以當做函式的返回值。

2:globals() locals()

globals() # 返回全域性變數的乙個字典。

locals()  返回 當前位置 的區域性變數的字典。

1 name = '

leiwenxuan'2

deffun():

3 a = 2

4 b = 356

print(globals()) #

返回的是全域性變數的字典修改其中的值,name 會發生變化

7 globals()['

name

'] = '

wuyan'8

print(name) #

此時name = wuyan

9 locals()['

a'] = 5

10print(locals()) #

輸出還是此時

11 fun()

def

func():

name1 = '

leiwenxuan

'def

inner():

print

(name1)

return

inner

f = func() #

形成閉包

f()

閉包的作用:當程式執行時,遇到了函式執行,他會在記憶體中開闢乙個空間,區域性命名空間, 如果這個函式內部形成了閉包,  那麼他就不會隨著函式的結束而消失。

物件內部物件內部含有__iter__方法就是可迭代物件.可迭代物件滿足可迭代協議。

可迭代物件:str list dict,tuple,set,range()1#

print('__iter__' in dir(s1))2#

print('__iter__' in dir(dic))

1

from collections import

iterable

2from collections import

iterator34

print(isinstance('

leiwenxuan

', iterator)) #

false56

print(isinstance('

leiwenxuan

', iterable)) #

true

1;可迭代物件vs迭代器:  

可迭代物件不能取值,迭代器是可以取值的。

可迭代物件 --->(轉化成)迭代器

2:可迭代物件轉化迭代器: 

iter1 = iter(lis)

iter2 = lis__iter()__

3:可迭代物件取值,

next() 一次取一次

iter.__next__()

4:可迭代物件的好處

1, 可迭代物件不能取值,迭代器是可以取值的。

2, 迭代器非常節省記憶體。

3,迭代器每次只會取乙個值。

4,迭代器單向的,一條路走到頭

5:自己實現for迴圈

1,將可迭代物件轉化成迭代器。

2,呼叫__next__方法取值。

3,利用異常處理停止報錯。

iter1 = s1.__iter__()

1

while 1:

2try:3

print(iter1.__next__

())4

except

stopiteration:

5break

用以下兩種方式構建生成器

return and yield

return 結束函式, 給函式執行者返回值

yield 不會結束函式, 乙個next物件乙個yield給生成器物件__.next__()返回值

區別:1:記憶體級別的區別

2:迭代器是需要可迭代物件轉化, 可迭代物件是非常佔記憶體的

3:生成器直接建立, 不需要轉化, 從本質就節省記憶體。

send 與 yield 

def fun():

print(1)

yield 1

print(2)

yield 2

g = fun()

g.send('alex')

#send 與 next 一樣, 也是對生成器取值(執行乙個yield)的方法

#send 可以給上乙個yield傳值

#第一次永遠都是next

#最後乙個yield永遠也得不到send傳的值

列表推到式:一行**搞定你需要的任何列表

#迴圈模式 [變數 (加工後的變數) for ]

lis = [i for i in range(1,101)]

#篩選模式[變數 (加工後的變數) for i in name if 條件]

列表推導式:

優點:一行解決 , 方便

缺點:容易著迷, 不易排錯, 不超過太刻意用

#列表推到式不能解決所有列表的問題,不要刻意去用

生成器表示式:將列表推到式的 換成()即可。

g = (i for i in range(1,10000000000000))

每次只取乙個值

python 列表推導式 生成器 迭代器

列表推導式 字典推導式和元組推導式類似 列表推導式格式 表示式 for 變數 in 可迭代 if 條件 兩個列子 乙個有if乙個沒有if list1 1,2,3 4,5,6 1,3,5 name x 2 for x in list1 結果 3,6,5 列表推導式是可以使用兩個for的 name x,...

迭代器,生成器,可迭代物件 列表推導式,列表生成式

生成器 generator 迭代器 iterator 為什麼 list dict str 等資料型別不是 iterator 結論 val i i for i in range 10 if i 2 1 只有i 2 1時,才對i進行平方操作 print val 結果 1 9,25 49,81 val i...

閉包,生成器,迭代器

函式內部再定義乙個函式並且這個函式用到了外邊的函式的變數,那麼將這個函式以及用到的一些變數稱為閉包。def line conf a,b def line x return a x b return line line1 line conf 1,1 line2 line conf 4,5 print ...