閉包,生成器,迭代器

2022-05-05 08:42:10 字數 1778 閱讀 8459

函式內部再定義乙個函式並且這個函式用到了外邊的函式的變數,那麼將這個函式以及用到的一些變數稱為閉包。

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(line1(5))

print(line2(5))

在python 中,這種一遍迴圈一遍計算的機制,稱為生成器:generator,節省大量的空間。

可以通過next()函式獲得生成器的下乙個返回值。

建立生成器

g = (x*2 for x in range(5))

>>>g

>>>at 0x7f626c132db0>

斐波拉契數列

著名的斐波拉契數列(fibonacci),除第⼀個和第⼆個數外,任意⼀

個數都可由前兩個數相加得到:

def fib(times):

n = 0

a,b = 0,1

while n>>f=fib(5)

>>>next(f)

>>>1

捕獲stoplteration

while true:

try:

x = next(g)

print("value:%d"%x)

except stopiteration as e:

print("生成器返回值:%s"%e.value)

break

value:1

value:1

value:2

value:3

value:5

生成器返回值:done

send

例子:執行到yield時,gen函式作⽤暫時儲存,返回i的值;temp接收下次

c.send("python"),send傳送過來的值,c.next()等價c.send(none)

def gen():

i = 0

while i <5:

temp = yield i

print(temp)

i+=1

in [45]: f.send('haha')

haha

out[45]: 1

直接作用於for 迴圈的資料型別:

1、是集合資料型別,如list、tuple、dict、set、str等;

2、generator,包括生成器和帶yield的generator function

作用於for迴圈的物件都是可迭代物件: iterable

判斷是否可以迭代

可以使用isinstance()判斷乙個物件是否是iterable物件:

from collections import iterable

in [51]: isinstance(, iterable)

out[51]: true

in [52]: isinstance({}, iterable)

out[52]: true

迭代器 生成器與裝飾器閉包

迭代器可以裂解為乙個容器,迴圈的時候,每次從容器中取出乙個資料,直到資料被取完為止 需要在類中實現兩個方法 iter 與 next iter方法需要返回本身,它是for迴圈使用迭代器的要求 next方法用於返回容器中下乙個元素,當容器中的資料取完時,需要引發stopiteration 自定義迭代器,...

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

1,函式名就是函式的記憶體位址。2,函式名可以作為變數。3,函式名可以作為函式的引數。4,函式名可以作為容器類型別的元素。5,函式名可以當做函式的返回值。2 globals locals globals 返回全域性變數的乙個字典。locals 返回 當前位置 的區域性變數的字典。1 name lei...

python 閉包函式 裝飾器 迭代器 生成器

閉包函式有三個特性 函式中巢狀函式 外層函式返回記憶體巢狀的函式名 巢狀函式對外部作用域有乙個非全域性變數的引用 def func a 100 deffunc2 print a return func2 語法 裝飾器 裝飾器的作用 在不更改原功能函式 和呼叫方式的基礎上給函式擴充套件新的功能。開放封...