1、函数名的应用
函数名是什么?
函数名是函数的名字,本质:变量,特殊的变量。
函数名()执行此函数
1、单独打印函数名
def func1(): print(666) print(func1) # <function func1 at 0x0000000000872378> a = 6 print(a)
2、函数名的赋值
def func2(): print(666) f = func2 print(f())
3、函数名可以作为容器类数据的元素
def f1(): print(1211) def f2(): print(1222) def f3(): print(1233) def f4(): print(1233) ‘‘‘ f1() f2() f3() f4() ‘‘‘ l1 = [f1, f2, f3, f4] for i in l1: i() l1 = [] for i in range(1,5): l1.append(‘f‘+str(i)) # print(l1) for i in l1: eval(i)()
4、函数名可以作为参数
a = 1 def f1(x): print(x) f1(a)
def f1(): print(666) def f2(x): # x = f1 x() # f1() f2(f1)
5、函数名可以作为函数的返回值
def f11(x): return x ret = f11(5) # 5 print(ret)
def f1(): print(666) def f2(x): # x = f1 return x ret = f2(f1) # f1 ret()
def wraaper(): def inner(): print(666) inner() wraaper()
def wraaper():
def inner():
print(666)
return inner
ret = wraaper() # inner
ret() # inner()
闭包:就是内层函数对外层函数(非全局)变量的引用
如何判断 内层函数名.__clousure__ 返回cell就是闭包
def wraaper1(): name = ‘老男孩‘ def inner(): print(name) inner() print(inner.__closure__) # cell wraaper1()
name = ‘老男孩‘ def wraaper2(): name1 = ‘alex‘ def inner(): print(name) print(name1) inner() print(inner.__closure__) wraaper2()
闭包:当函数开始执行时,如果遇到了闭包,他有一个机制,他会永远开辟一个内存空间,将闭包中的变量
等值放入其中,不会随着函数的执行完毕而消失
爬虫
from urllib.request import urlopen # content1 = urlopen(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘).read().decode(‘utf-8‘) # content2 = urlopen(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘).read().decode(‘utf-8‘) # content3 = urlopen(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘).read().decode(‘utf-8‘) # print(content) def index(): url = "http://www.xiaohua100.cn/index.html" def get(): def fun(): pass return urlopen(url).read() a = 3 return get print(index()()) print(index()()) print(index()()) print(index()()) print(index()()) print(index()())
2、装饰器初识
在不改变原函数的执行的情况下,为原函数增加额外的功能。
最简单版本的装饰器
def func1(): print(‘怎么找,不相信我还是怎么滴,还测我执行效率‘) def timmer(f): #f=func1 def inner(): strat_time=time.time() f() time.sleep(0.3) end_time=time.time() print(‘此函数的执行效率%s‘ % (end_time-start_time)) return inner #语法糖@ @timmer #func1=timmer(func1) func1() #inner()
被装饰函数带参数的装饰器
def timmer(f): def inner(*args,**kwargs): start_time=time.time() f(*args,**kwargs) time.sleep(0.3) end_time=time.time() print(‘此函数的执行效率%s‘ %(end_time-start_time)) return inner @timmer def func1(a,b): print(a,b) print(‘瞎几把测‘) func1(1,2)
带返回值的装饰器
def timmer(f): # f = func1 函数名 def inner(*args,**kwargs): start_time = time.time() ret = f(*args,**kwargs) time.sleep(0.3) end_time = time.time() print(‘此函数的执行效率%s‘ % (end_time - start_time)) return ret return inner @timmer # func1 = timmer(func1) # inner def func1(a,b): print(a,b) print(‘你有病呀,领导,测试我的执行效率干甚。‘) return 666 print(‘************‘,func1(1,2))
def wrapper(func): def inner(*args,**kwargs): ‘‘‘被装饰函数之前‘‘‘ ret= func(*args,**kwargs) ‘‘‘被装饰函数之后‘‘‘ return ret return inner @wrapper def func(a,b): pass return 666 func(1,2)