- 函数可以当作一个变量
- 函数的参数也可以是函数
- 函数是可以嵌套的
1 2 3 4 5 6 7 8
| def f(): print('hello')
def f2(a): return a
f2(f())
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| def login(username='mengxun',passwd='123456'): if username=='mengxun' and passwd=='123456': return 'sadfeg1234' else: return '帐号登录错误'
def profile(token): if token=='sadfeg1234': return '欢迎访问个人主页' else: return '请登录系统'
print(profile(login()))
|
1 2 3 4 5 6 7 8 9
|
def f3(): def f4(): return 'hello' return f4()
print(f3())
|
封闭:已实现的功能代码尽可能的不要做修改
开放:对现有的功能代码可扩展
需求:在调用f1 or f2函数的时候,先打印 星际穿越,再打印 火星救援
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| def getInfo(func): def inner(): print("星际穿越") func() return inner
@getInfo def f5(): print("火星救援")
def f6(): print("降临")
f5()
|
步骤:
- 当我们执行getInfo函数的时候,把被装饰的函数f1当作参数来传递
- getInfo函数的返回值会重新赋值
- 一旦结合了装饰器后,调用f1的函数其实执行的是inner函数的内部,原来的函数f1被覆盖
- 被装饰的函数f1重新赋值给装饰器的内层函数inner
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
def login1(username='mengxun',passwd='123456'): if username=='mengxun' and passwd=='123456': return 'asd123d' else: return '帐号错误'
def profile1(token): """个人主页""" if token=='asd123d': return '你的主页信息' else: return '请登录,谢谢!'
def login2(func): def inner(token): if token=='asd123d': return func(token) else: return '请登录,谢谢!' return inner
@login2 def profile2(token): return '你的主页信息'
print(profile2('asd123d'))
|
1 2 3 4 5 6
| def outer(func): def inner(*args,**kwargs): print(args,kwargs) func() return inner
|