python's eleventh day for me
阿新 • • 發佈:2018-03-31
war 什麽是 ret inner tar 緩存 url append 函數名
python2 中沒有nonlocal。
函數名是什麽?
函數名就是函數的名字, 本質:變量,特殊的變量。
1.單獨打印函數名:
def func(): print(666) print(func) # <function func at 0x0000020C8C7C8F28> 函數的存儲位置。
2.函數名的賦值:
def func(): print(666) f = func print(f) #<function func at 0x0000015710A08F28>
3.函數名可以作為參數:
a = 1 def f(x): print(x) f(a) # 1
4.函數名可以作為容器類數據的元素。
def func1(): print(1111) def func2(): print(2222) def func3(): print(3333) # func1() # func2() # func3() l = [func1,func2,func3] for i in l: i() # 1111 # 2222 # 3333 def func1(): print(1111) def func2(): print(2222) def func3():print(3333) l = [] for i in range(1,4): l.append(‘func‘+str(i)) for i in l: eval(i)() # i 裏面是什麽類型 eval(i) 就可以直接把i提出來。
5.函數名可以作為函數的返回值。
def func(x): return x ret = func(5) print(ret) # 5
閉包:就是內層函數對外層函數(非全局)變量的引用。
def wraaper(): def inner(): print(666) return inner ret= wraaper() # inner ret() # inner()
如何判斷是否為閉包:內層函數名.__closure__ 如果有cell 就是閉包。
def wrapper(): name = ‘老男孩‘ def inner(): print(name) inner() print(inner.__closure__) wrapper() # 老男孩 # (<cell at 0x000001473F9A0B58: str object at 0x000001474033A5D0>,)
如果不是閉包就打印None.
name = ‘顧清秋‘ def wraaper(): def inner(): print(name) inner() print(inner.__closure__) wraaper() # 顧清秋 # None
面試題:‘閉包’
閉包:當函數開始執行時,如果遇到了閉包,他有一個機制,他會永遠開辟一個內存空間,將閉包中的變量等值放入其中,不會隨著函數的執行完畢而消失。
name = ‘老男孩‘ def wraaper(n): # 相當於 n = ‘老男孩‘ def inner(): print(n) # 老男孩 inner() print(inner.__closure__) # (<cell at 0x0000017B8CCD0B58: str object at 0x0000017B8D63A5D0>,) wraaper(name)
第一類對象(first - class object)指
1. 可在運行期創建。
2. 可用作函數參數或返回值。
3. 可存入變量的實體。
閉包:
閉包函數:
內部函數包含對外部作用域而非全局作用域變量的的引用,該內部函數成為閉包函數。
## 函數內部定義的函數被稱為內部函數。
閉包函數獲取網絡應用:
from urllib.request import urlopen def index(): url = "http://www.xiaohua100.cn/index.html" def get(): return urlopen(url).read().decode(‘utf-8‘) return get xiaohua = index() content = xiaohua() print(content)
什麽是裝飾器?
裝飾器本質上就是一個python函數,它可以讓其他函數在不需要做任何代碼變動的前提下,增加額外的功能,裝飾器的返回值也是一個函數對象。
裝飾器的應用場景:比如插入日誌,性能測試,事務處理,緩存等等場景。
裝飾器的形成過程:
裝飾器---簡單版
import time def func1(): print(‘in func1‘) def timer(func): # func = func1 def inner(): start = time.time() func() time.sleep(0.3) print(time.time()-start) return inner func1 = timer(func1) #inner func1() # inner()
裝飾器---語法糖
import time def timer(func): def inner(): start_time = time.time() func() time.sleep(0.3) end_time = time.time() print(end_time-start_time) return inner @timer #語法糖 # func1 = timer(func1) def func1(): print("in func1") func1()
帶參數的裝飾器:
import time def timer(func): def inner(a): start_time = time.time() func(a) time.sleep(0.3) end_time = time.time() return inner @timer def func1(a): print(a) # 1 func1(1)
hold 住所有參數的裝飾器
import time def timer(func): def inner(*args,**kwargs): start_time = time.time() ret = func(*args,**kwargs) time.sleep(0.3) end_time = time.time() print(end_time-start_time) return ret return inner @timer def func1(a,b): print(a,b) @timer def func2(a,b,c): print(a,b,c) return True func1(‘aaa‘,‘bbb‘) print(func2(‘aaa‘,‘bbb‘,‘ccc‘))
python's eleventh day for me