python學習筆記12 函數名是變量 閉包 迭代器

函數是一個變量,但他是一個特殊的變量,與括號配合可以執行函數的變量

函數名是個對象

函數名可以當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只能向前

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章