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‘))