函式名是 乙個變量, 但它是 乙個特殊的變量, 與括號配合可以執行函式的變量.
1. 函式名的記憶體位址
2. 函式名可以賦值給其他變數
3. 函式名可以當做容器類的元素
4. 函式名可以當做函式的引數
5. 函式名可以作為函式的返回值
什麼是閉包? 閉包就是內層函式, 對外層函式(非全域性)的變數的引用. 叫閉包
我們可以使用__closure__來檢測函式是否是閉包. 使用函式名.__closure__返回cell就是
閉包. 返回none就不是閉包
問題, 如何在函式外邊呼叫內部函式呢?
那如果多層巢狀呢? 很簡單, 只需要 一層 一層的往外層返回就行了
由它我們可以引出閉包的好處. 由於我們在外界可以訪問內部函式. 那這個時候內部函式訪問的時間和時機就不 一定了, 因為在外部, 我可以選擇在任意的時間去訪問內部函式.
這個時候. 想 一想. 我們之前說過, 如果 乙個函式執 行完畢. 則這個函式中的變量以及區域性命名空間中的內容都將會被銷毀. 在閉包中. 如果變數被銷毀了, 那內部函式將不能正常執行.
所以. python規定. 如果你在內部函式中訪問了外層函式中的變量. 那麼這個變量將不會消亡.將會常駐在記憶體中. 也就是說. 使用閉包, 可以保證外層函式中的變量在記憶體中常駐. 這樣做有什什麼好處呢? 非常 大的好處.
我們來看 乙個關於爬蟲的**
我們之前 一直在用可迭代物件進行迭代操作. 那麼到底什什麼是可迭代物件. 本 小節主要討論可迭代物件. 首先我們先回顧 一下目前我們所熟知的可迭代物件有哪些:
str, list, tuple, dict, set. 那為什麼我們可以稱他們為可迭代物件呢? 因為他們都遵循了可迭代協議. 什麼是可迭代協議. 首先我們先看 一段錯誤**:
注意看報錯資訊中有這樣一句話. 'int' object is not iterable . 翻譯過來就是整數型別物件是不可迭代的.
iterable表 示可迭代的. 表示可迭代協議. 那麼如何進行驗證你的資料型別是否符合可迭代協議. 我們可以通過dir函式來檢視類中定義好的所有方法.
在列印結果中. 尋找__iter__ 如果能找到. 那麼這個類的物件就是 乙個可迭代物件.
我們發現在字串串中可以找到__iter__. 繼續看 一下list, tuple, dict, set
我們發現這 幾個可以進 行行for迴圈的東 西都有__iter__函式, 包括range也有. 可以自己試 一下.
這是檢視 乙個物件是否是可迭代物件的第 一種辦法. 我們還可以通過isinstence()函式來檢視 乙個物件是什麼型別的
綜上. 我們可以確定. 如果物件中有__iter__函式. 那麼我們認為這個物件遵守了可迭代協議.就可以獲取到相應的迭代器.
這里的__iter__是幫助我們獲取到物件的迭代器. 我們使用迭代器中的__next__() 來獲取到 乙個迭代器中的元素.
那麼我們之前講的for的工作原理到底是什麼? 繼續看**
for迴圈的機制:
使 用while迴圈+迭代器來模擬for迴圈(必須要掌握)
iterable: 可迭代物件. 內部包含__iter__()函式
iterator: 迭代器. 內部包含__iter__() 同時包含__next__().
迭代器的特點:
我們可以把要迭代的內容當成子彈. 然後呢. 獲取到迭代器__iter__(), 就把子彈都裝在彈夾中. 然後發射就是__next__()把每 乙個 子彈(元素)打出來.
也就是說, for迴圈的時候. 一開始的時候是__iter__()來獲取迭代器. 後面每次獲取元素都是通過__next__()來完成的. 當程式遇到stopiteration將結束迴圈.
python基礎之閉包與迭代器
一 閉包 1.寫法 在外層函式中宣告乙個變數,在記憶體函式使用或者返回這個變數。這個結構叫閉包。def fun1 a 10 deffun2 print a return fun2 這種結構就叫做閉包 2.作用 1 保護變數 2 使變數常駐記憶體 closure 有東西,就是閉包 none就不是閉包 ...
python核心 迭代器和閉包
就是迭代是重複反饋過程的活動,也可以粗俗的理解為可以用 for迴圈。那啥東西可以迭代呢?list 元組tuple 字典dictionary 字串string 等資料型別都是可迭代的。我們下面就來 驗證一下 這裡就介紹乙個判斷乙個東西是否可以迭代的方法 from collections import ...
閉包與迭代器
1.python內建函式 def compare args return max args min args a,b compare 1,2,3,4,5,6 print max min format a,b 2.若定義的函式引數為可變型別的變數,若果呼叫改變了此變數,其他可以看到此位置的變數也跟隨改...