1、函数作为对象
2、函数作为另一个函数的入参
3、函数嵌套
4、函数的返回值为函数对象(也称函数闭包,该函数并未执行,直到调用时才执行,返回函数中不要引用任何可能会变化的变量)
def printMessage(message):
print("Get a message1:{}".format(message))
def func2(func,message): #函数作为参数
return func(message) #返回的是函数调用结果
def func3(message): #函数嵌套
def printMessage():
print("Get a func3 message:{}".format(message))
return printMessage() #返回的是函数调用结果
def func4(message): #函数的返回值也可以是函数对象
def printMessage():
print("Get a func4 message:{}".format(message))
return printMessage #返回的是函数对象
sendMessage = printMessage #函数作为对象
sendMessage("春节") #调用函数
func2(printMessage,"元宵") #返回的是函数调用结果
func3("清明") #
print ("调用func4")
func4("五一") # 注意,返回的是函数对象,所以不会打印五一
print(func4("五一")) #只是返回了一个对象
sendMessage2 = func4("hello,五一") #返回的是函数对象
sendMessage2() #函数调用
函数闭包注意事项
def count():
fs =[]
for i in range(1, 4):
def func():
return i *i
fs.append(func) #返回的函数对象并没有立刻执行,而是直到调用了f()才执行
return fs
f1,f2,f3 = count()
print(f1(),f2(),f3()) #打印的是9,9,9
def count2():
def func(j):
def f():
return j *j
return f
fs =[]
for i in range(1,4):
fs.append(func(i)) #func(i)立刻被执行,因此i的当前值被传入func()
return fs
f1,f2,f3 = count2()
print(f1(),f2(),f3()) #打印的是1,4,9
二、装饰器
装饰器:通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改。
用途:身份认证、日志记录、输入合理性检查以及缓存等。
import functools
def my_decorator(func):
def printMessage(*args,**kwargs): #接受任意数量和任意参数类型
print("get a deractor message ")
func(*args,**kwargs)
return printMessage #返回的是函数对象
def my_decorator2(func):
@functools.wraps(func) #调用该装饰器,不改变函数名称
def printMessage(*args,**kwargs): #接受任意数量和任意参数类型
print("get a deractor message ")
func(*args,**kwargs)
return printMessage #返回的是函数对象
def greet(message):
print("greet {}".format(message))
@my_decorator #装饰器
def greet2(a,b,c):
print("greet {},{},{}".format(a,b,c))
@my_decorator2 #装饰器
def greet3(a,b,c):
print("greet {},{},{}".format(a,b,c))
print("---函数方式调用---")
d = my_decorator(greet)
d("中秋")
print("函数名称:",greet.__name__) #函数调用后,没有改变函数名称
print("---装饰器方式调用---")
greet2("国庆",1949,["10月","1日"])
print("函数名称:",greet2.__name__) #装饰器调用后,改变了函数名称
print("---装饰器方式调用2,不改变函数名称---")
greet3("元旦",1,["月","1日"])
print("函数名称:",greet3.__name__) #装饰器调用后,改变了函数名称



