函式內部再定義乙個函式並且這個函式用到了外邊的函式的變數,那麼將這個函式以及用到的一些變數稱為閉包。
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 語法 裝飾器 裝飾器的作用 在不更改原功能函式 和呼叫方式的基礎上給函式擴充套件新的功能。開放封...