第一類物件
函式物件物件可以像變數一樣進行賦值
還可以作為列表的元素進行使用
可以作為返回值返回
可以作為引數進行傳遞
def wrapper():
def inner():
print("alex")
return inner # 可以返回函式名
ret = wrapper()
ret() # 在函式外訪問函式內的函式
閉包
閉包(函式的巢狀)
內層函式對外層函式中的變數的使用
好處:
1. 保護變數不被侵害
2. 讓一個變數常駐記憶體
如何通過程式碼檢視一個閉包
__closure__: 有東西就是閉包. 沒東西就不是閉包
def wrapper():
name = "peter"
def inner():
print(name)
print(inner.__closure__) #是閉包
# 檢視是否是閉包. 有內容就是閉包, 沒有內容就不是閉包
inner()
wrapper()
迭代器
固定的思路: for迴圈
一個資料型別中包含了__iter__函式表示這個資料是可迭代的
dir(資料): 返回這個資料可以執行的所有操作
print("__iter__" in dir(lst)) # 是True
it = lst.__iter__() # 拿到的是迭代器 <list_iterator object at 0x0000000001DCC160>
判斷迭代器和可迭代物件的方案(野路子)
__iter__ 可迭代的
__iter__ __next__ 迭代器
判斷迭代器和可迭代物件的方案(官方)
from collections import Iterable, Iterator
isinstance(物件, Iterable) 是否是可迭代的
isinstance(物件, Iterator) 是否是迭代器
lst = ["a","b","c"]
print(isinstance(lst, Iterable)) # xxx是否是xxx型別的. True
print(isinstance(lst, Iterator)) # False
it = lst.__iter__() # 迭代器一定可迭代, 可迭代的東西不一定是迭代器
print(isinstance(it, Iterable)) # xxx是否是xxx型別的. True
print(isinstance(it, Iterator)) # True
模擬for迴圈
lst= ["a","b","c"]
it = lst.__iter__()# 拿迭代器
while 1:
try:
it.__next__()
except StopIteration:
break
特徵:
1. 省記憶體(生成器)
2. 惰性機制
3. 只能向前. 不能後退
作用:
統一了各種資料型別的遍歷