1. 程式人生 > >函式 之 閉包 迭代器 推到式

函式 之 閉包 迭代器 推到式

閉包:
def func():
name = "alex" # 常駐記憶體 防止其他程式改變這個變數
def inner():
print(name) # 在內層函式中呼叫了外層函式的變數,叫閉包, 可以讓一個區域性變數常駐記憶體
     print(inner.__closure__)    # 檢視inner是否是閉包, 如果有東西就是閉包, 沒東西就不是閉包
  return inner
func()()
ret = func()
ret() # 執行的是inner()

迭代器 與可迭代:
# for i in 123:
# print(i)#b報錯 因為不是可迭代
# 可迭代物件: str, list, tuple, set, f, dict
# 所有的以上資料型別中都有一個函式__iter__(), 所有包含了__iter__()的資料型別都是可迭代的資料型別 Iterable
# dir()來檢視一個物件,資料型別中包含了哪些東西
 
# 獲取迭代器 .__iter__()

it=list.__iter__()
迭代器往外拿元素. __next__()
print(it.__next__())    # 皇阿瑪
 
lst = ["皇阿瑪", "皇額娘", "容嬤嬤", "紫薇"]
# 模擬for迴圈
it = lst.__iter__()
print(it)
while True:
try:
name = it.__next__()
print(name)
except StopIteration: # 拿完了
break
 
from collections import Iterable    # 可迭代的
from collections import Iterator # 迭代器
isinstence(物件, 型別) 判斷xx物件是否是xxx型別的
# it = lst.__iter__()
# print(isinstance(it, Iterable)) # 判斷是否是可迭代的 迭代器一定是可迭代的
# print(isinstance(it, Iterator)) # 迭代器裡面一定有__next__(), __iter__()
# print("__iter__" in dir(lst))   # 確定是一個可迭代的
# print("__next__" in dir(lst)) # 確定是不是一個迭代器
 
f = open("01 今日內容大綱",mode="r", encoding="utf-8")
print(isinstance(f, Iterable))
print(isinstance(f, Iterator))

檔案也是一個迭代器