函數是一個變量,但他是一個特殊的變量,與括號配合可以執行函數的變量
函數名是個對象
函數名可以當list裏的元素進行使用
函數名可以作爲參數,傳遞給另一個函數
函數名總結:
函數名的應用,第一類對象
函數名可以像變量一樣進行使用: 1 賦值 2作爲list元素 3作爲參數 4 作爲返回值
閉包:
定義: 內層函數對外層函數的局部變量的訪問
可以讓一個局部變量常駐內存
變量直接寫在全局是不安全的,容易被其他層函數通過 global 修改
閉包的作用
1 常駐內存,以待隨時調用
2 防止其他程序改變這個變量
函數名._closure_ 檢測函數是否是閉包,運行結果爲None表明不是閉包
閉包總結
內部函數訪問外部函數的局部變量
好處: 1 安全 2常駐內存,提交效率
[
首先給出閉包函數的必要條件:
- 閉包函數必須返回一個函數對象
- 閉包函數返回的那個函數必須引用外部變量(一般不能是全局變量),而返回的那個函數內部不一定要return
__closure__屬性返回的是一個元組對象,包含了閉包引用的外部變量。
· 若主函數內的閉包不引用外部變量,就不存在閉包,主函數的_closure__屬性永遠爲None:
· 若主函數沒有return子函數,就不存在閉包,主函數不存在_closure__屬性:
三、爲何叫閉包?
先看代碼:
def line_conf(a):
b = 1
def line(x):
return a * x + b
return line
line_A = line_conf(2)
b = 20
print(line_A(1)) # 3
如你所見,line_A對象作爲line_conf返回的閉包對象,它引用了line_conf下的變量b=1,在print時,全局作用域下定義了新的b變量指向20,最終結果仍然引用的line_conf內的b。這是因爲,閉包作爲對象被返回時,它的引用變量就已經確定(已經保存在它的__closure__屬性中),不會再被修改。
是的,閉包在被返回時,它的所有變量就已經固定,形成了一個封閉的對象,這個對象包含了其引用的所有外部、內部變量和表達式。當然,閉包的參數例外。
————————————————
版權聲明:本文爲CSDN博主「海的鄰居」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/sc_lilei/article/details/80464645
]
迭代器
可迭代對象數據類型中都有一個函數__iter__(),所有包含了__iter__()的數據類型都是可迭代的數據類型 iterable
dir() 可以查看一個對象,數據類型中包含了哪些東西
迭代器使用__next__() 往外拿元素,迭代到最後一個元素之後,再進行迭代就會報錯StopIteration
迭代器一定是可迭代的,迭代器裏面一定有__next__(),__iter__()
迭代器的迭代器是他本身
迭代器的特點:
1 節省內存
2 惰性機制
3 只能往前拿,不能反着拿
迭代器總結:
可迭代對象(Iterable) :內部包含__iter__() 比如 str, list,tuple,se,dict, range isinstance( ) ----> Iterable
迭代器(Iterator) :內部含有__iter__() __next__() 比如 f isinstance( ) ----> Iterator
迭代器特點: 1 省內存 2 惰性機制 3只能向前