def fn():
print("我叫fn")
fn()
print(fn)## <function fn at 0x0000000001D12E18>
fn()
gn = fn #函數名可以進行指派
print(gn)# <function fn at 0x0000000001D12E18>
gn()
fn = 666
print(fn) #666
def func1()
print("朱祁鎮")
def func2()
print("徐傑")
def func3():
print("王陽明")
def func4():
print("魏忠賢")
lst = [func1,func2,func3,func4]#函數+() 就是調用
print(lst)
lst[0]()
for el in lst: #el是清單中的每一項
el() #拿到的是函數. 執行函數
def wrapper():
def inner():
print("哈哈哈")
return inner#函數名可以像傳回值一樣傳回
ret = wrapper() #接收的是inner函數
ret() #調用函數inner 在函數外面通路了函數内部的函數
函數可以作為參數進行傳遞
def func1():
print("謝晉")
def func2():
print('楊士奇')
def func3():
print('徐渭')
def func4():
print("柳如是")
#代理.裝飾器的雛形
de proxy(a)
print("我是代理")
a()
print("代理執行完畢")
proxy(func1)
proxy(func2) #将函數當做參數進行傳參
閉包
閉包的優點
1.可以保持變量不被其他人侵害
2.保持一個常量常駐與記憶體
def wrapper():
a = "哈哈" #如果把a放到全局作用域是不安全的一種寫法,因為好多内容用着同一個變量,則把它放到一個局部作用域中
name = "周傑倫"
def inner
print(name)#在内層函數中使用了外層的函數的局部變量
print(a)
return inner #傳回函數名
ret = wrapper() #ret是inner函數
ret() #調用函數
def wrapper():
name = "周傑倫" #局部變量常駐與記憶體
def inner():
print(name) #在内層函數中使用外層函數的局部變量
return inner #傳回函數名
#inner()
ret = wrapper() #ret是一個内層函數
ret() #ret是inner,執行的時機是不确定的,必須保證裡邊的name是存在的
#超級簡單的爬蟲
from urllib.request import urlopen #導入一個子產品
def func():
#擷取到網頁中的内容,當網速很慢的時候.反複的打開這個網站 很慢
content = urloppen("https://www.dytt8.net/").read()
def inner():
return content.decode("gbk") #網頁内容
return inner
print("開始網絡請求")
ret = func() #網絡請求已經關閉
print("網絡請求完畢")
print("第一次",ret())
print("第二次",ret()) #加載到記憶體 不用每次都進行網絡請求 直接進行記憶體的調用 但是變量多的話 記憶體可能撐不下
def wrapper():
name = "alex"
def inner():
print("name")
print(inner.__closure__) #檢視是否閉包.有内容就是閉包,沒有内容就不是閉包
inner()
wrappe()
疊代
s = "今天下午考試,你們還要睡覺嗎 "
for c in s: #字元串是一個可疊代對象
print (c)
for i in 123: # 'int' object is not iterable整型是不可以疊代的
print(i)
dir(對象) #可以幫我們檢視xxx資料能夠執行的操作
print(dir(str)) #__iter__
字元串 清單 字典 元組 集合 是可以疊代的
int 和 bool 是不可以疊代的
共性:所有帶有__iter__的東西可以進行for循環,帶有__iter__的東西就是可以疊代的
lst = ["賈樟柯", "李安", "楊德昌", "王家衛"]
it = lst.__iter__() #拿到的是疊代器
print(it.__next__()) #下一個
print(it.__next__()) #下一個
print(it.__next__()) #下一個
print(it.__next__()) #下一個
print(it.__next__()) #下一個 會報錯 stopinteration 停止疊代
##想回去隻能重新獲得疊代器
1.隻能項下執行,不能反複
2.結束的時候會扔給我們一個錯誤 stopiteration
3.整合所有的資料類型進行周遊 (int,bool除外)
用while循環來模拟for循環
it = list.__iter__()
while 1:
try:
el = it.__next__: #拿資料
print(el)
except stopiteration: #出現錯誤說明資料拿完了
break #退出循環
官方通過代碼判斷是否是疊代器
借助于兩個子產品 Iteration 疊代器,iterable 可疊代的
from collections import iterable,iterator
lst = [1,2,3]
print(lst.__next__())
print(isinstance(lst, Iterable)) # xxx是否是xxx類型的. True
print(isinstance(lst, Iterator)) # False
疊代器一定是可疊代的,可疊代的東西不一定是疊代器
isinstens(參數,iterable) 判斷xxx是不是某某類型