第一類對象 函數對象對象可以像變數一樣進行賦值 還可以作為列表的元素進行使用 可以作為返回值返回 可以作為參數進行傳遞 閉包 閉包(函數的嵌套) 內層函數對外層函數中的變數的使用 好處: 1. 保護變數不被侵害 2. 讓一個變數常駐記憶體 如何通過代碼查看一個閉包 __closure__: 有東西就是 ...
第一類對象
函數對象對象可以像變數一樣進行賦值
還可以作為列表的元素進行使用
可以作為返回值返回
可以作為參數進行傳遞
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. 只能向前. 不能後退
作用:
統一了各種數據類型的遍歷