函數名 閉包 叠代器
阿新 • • 發佈:2018-08-10
__next__ 進行 內存 font 網絡應用 判斷 money 調用函數 獲取
函數名
函數名就是變量; 函數名可以作為參數進行傳遞
1. 函數名的內存地址
def func(): print("哈哈") print(func) #<function func at 0x01CDD4B0>
2. 函數名可以賦值給其他變量
def func(): print("呵呵") print(func) a = func #把函數當成變量 賦值給另一個變量 a() # 函數調用 func()
3. 函數名可以作為列表中的元素進行存儲
def func1(): print("呵呵") def func2(): print("哈哈") lst= [func1,func2] for el in lst: el()#相當於func1() 和func2()
4.函數名可以當做參數
def func(): print("吃了麽") def func2(fn): print("我是func2") fn() #執行傳遞過來的fn print("我是func2") func2(func) #把函數func當做參數傳遞給func2的參數fn
運行結果: 我是func2 吃了麽 我是func2
5.函數名可以作為函數的返回值
def func1(): print("這裏是函數1")def func2(): print("這裏是函數2") print("這裏是函數1") return func2 fn = func1() #執行完函數1 返回的是函數2 所以fn 就是func2 fn() #func2() 執行結果: 這裏是函數1 這裏是函數1 這裏是函數2
閉包
1. 閉包就是內層函數對外層函數(非全局)的變量的引用
def func1(): name = "alex" def func2(): print(name) func2() func1() 結果是 alex
怎麽檢測函數是不是閉包?
使用函數名 .__closure__返回cell就是閉包, 返回None就不是閉包
def func1(): name = "alex" def func2(): print(name) # 閉包 alex func2() print(func2.__closure__) #(<cell at 0x013F55D0: str object at 0x01307420>,) func1()
2. 如何在函數外調用函數內部的函數呢?
def outer(): name = "alex" def inner(): print(name) return inner fn = outer() #訪問外部函數,獲取到內部函數的函數地址 fn() #訪問內部函數
3. 如果是多層嵌套,只需要一層一層的往外層返回就行了
閉包嵌套
def wrapper(): money = 1000 def func(): name = ‘eva‘ def inner(): print(name,money) return inner return func f = wrapper() #func i = f() #func() i=inner i() #inner()
4. 閉包函數獲取網絡應用
from urllib.request import urlopen def but(): content = urlopen("http://www.xiaohua100.cn/index.html").read() def get_content(): return content return get_content fn = but() #get_content 返回給but() 所以fn = get_content content = fn() #fn()就是get_content(),執行函數得到 content print(content) content2 = fn() #重新獲取內容 print(content2)
叠代器
lst = ["趙四","花生哥", "天臺見"] it = lst.__iter__() #獲取到叠代器 print(it.__next__()) #取值 print(it.__next__()) print(it.__next__()) print(it.__next__()) #這一行就超過叠代的元素的個數了 所以會報錯StopIeration
這裏的__iter__是幫助我們獲取到對象的叠代器
叠代器中的__next__()用來獲取一個叠代器中的元素
可以把要叠代的內容當成子彈,
叠代器__iter__()就是把子彈都裝進彈夾中,
發射就是用__next__()把每一個子彈(元素)打出來
也就是說,for循環的時候,一開始是__iter__()來獲取叠代器,
後面每次獲取元素都是通過__next__()來完成的
叠代器模擬for循環
lst = ["張一寧","石可欣","姚明"] it = lst.__iter__() #獲取叠代器 while 1: try: #嘗試執行 el = it.__next__() #獲取下一個元素 print(el) except StopIteration: #錯誤處理 break
查看一個對象是否是可叠代對象的方法
from collections import Iterable #可叠代對象 from collections import Iterator #叠代器 print(isinstance(A,B)) #判斷某個對象 A 是不是 B 類型中的實例
函數名 閉包 叠代器