一、函数
函数名是函数的名字,本质:变量,特殊的变量。
# 1.函数名()执行次函数
# 1,单独打印函数名 <function func1 at 0x0000000000872378> # def func1(): # print(666) # print(func1) # <function func1 at 0x0000000000872378> # a = 6 # print(a)
# 单独打印就是此函数的内存地址<function func1 at 0x1019748c8>
# 2.函数名的赋值
def func2(): print(666) f=func2 print(f()) #none因为没有return值
# 3.函数名可以作为容器类数据的元素
def f1(): print(1211) def f2(): print(1233) def f3(): print(1299) def f4(): print(1233)
f1()
f2()
f3()
f4()
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 f1(): print(666) def f2(x): #x=f1 return x f2(f1)()
# 不明白就当普通变量使
#6. 闭包:就是内层函数对外层函数变量(非全局)的引用
def wrapper(): def inner(): print(666) inner() wrapper() def wrapper(): def inner(): print(666) return inner wrapper()()
# 如何判断闭包:内层函数名__closure__就是闭包
name ='laonanhai' def wrapper(): name1 ='alex' def inner(): print(name1) print(name) inner() print(inner.__closure__) wrapper()
# (<cell at 0x10212d378: str object at 0x102177e30>,)判断是闭包
# ?面试题:相当于把name传进去了
name ='laonanhai' def wrapper(n): def inner(): print(n) inner() print(inner.__closure__) wrapper(name) laonanhai (<cell at 0x10212d378: str object at 0x102177e30>,)
# 闭包的作用,当函数开始执行时,如果遇到了闭包,他有一个机制,
# 他会永远开辟一个内存,将闭包中的变量等值放入其中不会随着函数的执行完毕而消失
# 节省内存空间
# ?03 装饰器:
# 作用:1.在不改变原函数的执行的情况下,为愿函数增加了额外的功能
def func1(): print('你有病么') import time # print(time.time())#测试现在到1970年的时间,时间戳 start_time =(time.time()) func1() time.sleep(0.3) end_time =(time.time()) print('此函数的执行效率%s' % (end_time-start_time))
import time def func1(): print('你有病么') func1() def timmer(f): start_time= time.time() f() time.sleep(0.3) end_time=time.time() print('此函数的执行效率%s' % (end_time - start_time)) f1= func1 func1 =timmer func1(f1)
# 无限接近原来的函数,装饰器的雏形
# 语法糖?
def timmer(f): #f=func1 def inner(): start_time= time.time() f() time.sleep(0.3) end_time=time.time() print('此函数的执行效率%s' % (end_time - start_time)) return inner
# 语法糖? @timmer #@+装饰器名字 def func1(): print('你有病么') # func1=timmer(func1) #左面的func1和最开始的func1没有任何关系 等于inner timmer里面的func1是之前的func1 func1() #inner()
# 被装饰函数带参数的装饰器
def timmer(f): def inner(a,b): f(a,b) return inner @timmer def func1(a,b): print(a,b) func1(1,2)
# 默写 def wrapper(func): def inner(*args,**kwargs): ret=func(*args,**kwargs) return ret return inner @wrapper def func(a,b,c): pass print(666)