25. 函数名的多种用法
★★★★★函数就是多了传参与返回值★★★★★
函数名也是绑定的一个内存地址,只是该内存地址存放的是一段代码块。
函数名(),如 “fun()”,'''执行'''这个函数名fun的函数体代码。函数名不加括号,可以当'''变量名'''调用。
(1) 可以当变量名赋值
def fun1(): funny = fun1
print('OK') funny()
(2) 可以当函数参数
def fun1(a):
print('OK')
def fun2():
print('Hi')
fun1(fun2)
(3) 可以当函数返回值
def fun1():
print('OK')
def fun2():
print('Hi')
return fun1
res = fun2()
print(res)
res()
(4) 可以当容器类型
def lian():
print("b.杭州")
def lian1():
print('a.山外青山楼外楼')
def lian2():
print('52.5')
t = [lian, lian1, lian2]
t[2]()
for i in t:
t()
26. 闭包函数
★★★★★调用函数体,可以简单考虑 相当于调用变量名★★★★★
保存外部函数的变量,不会随着外部函数调用完而销毁。
闭包三要素: 1. 函数嵌套
2. 内部函数必须使用了外部函数的变量或者参数 # 调用外部的参数或变量,外部返回值是内部函数?
闭包函数实际应用:另外一种函数体代码传参方式。
1. 给函数体代码传参的方式1: 代码里面缺什么变量名形参里面就补什么变量名
def fun(aa, bb):
print('暗号,对白', aa, bb)
fun('花', '草') # 执行fun代码体,传参‘花’,‘草’给aa,bb
2. 给函数体代码传参的方式2: 闭包函数
def fun(a, b):
def fun1(): # 嵌套函数体
print(f'''鲁智深:{a} 张三:{b}''') # 调用函数外层变量名a,b
return fun1
res = fun(18, 28) # 赋值给变量名
res() # 执行res,相当于fun函数体
27. 装饰器
概括与定义:
在不改变原函数的情况下,对已有函数进行额外的功能扩展。装饰器本质就是一个高阶函数
不修改已有函数的源代码 不修改已有函数的调用方式 给已有函数增加额外的功能
本质:是由函数参数、名称空间、函数名多种用法、闭包函数组合到一起的结果。
global 全局变量关键字 局部名称 直接 修改 全局名称 数据
nonlocal 函数体内,函数内层 修改 外层函数
1. 装饰器模板
def fun1(fun):
def fun2(*args, **kwargs):
print("执行原函数体之前")
res = fun(*args, **kwargs) # 有标红的下划线变量名,可以放到第一行括号里。原函数体‘真身’
print("之后")
return res
return fun2
调用 装饰器模板:
def fun(withdraw):
def fun2(*args, **kwargs):
user_data = {'jason': '1', 'Mei': '2'}
username = input("请输入用户名:")
password = input('请输入密码:')
if username in user_data.keys(): # 判断用户名是否在字典中
if password == user_data[username]: # 取字典键的值,与password匹配 是否一样
print("登陆成功")
else:
res = withdraw(*args, **kwargs)
return res
return fun2
@fun # login = fun(login)
def login(*args, **kwargs):
print("登陆失败")
2. 装饰器语法糖
@fun # fun = dec(fun1) 把函数fun当作参数传给dec,并且把返回值再次绑定到原函数,也就是覆盖了原函数的定义
@fun # login = fun(login)
def login(*args, **kwargs):
print("登陆")
login()
@fun # withdraw = fun(withdraw)
def withdraw():
print("退出")
withdraw()
注意与包的区别:
装饰器实质上是一个闭包函数,但是装饰器这个闭包函数。他的参数有且只有一个并且是函数类型的话,他才是装饰器,否则他就是闭包函数!
口诀:对修改封闭 对扩展开放
标签:闭包,25,fun1,函数,res,print,fun,def
From: https://www.cnblogs.com/xingxingdiandeng22/p/16782899.html