303_python_函数_闭包_装饰器
【摘要】 函数 闭包 装饰器 语法糖
1 定义&执行函数
def get_user_info(): # def + 函数名
""" 注释信息 """
print(123)
get_user_info() # 执行函数
2 参数
2.1 函数参数 — 位置参数
def send_email(x1,x2):
""" 注释 """
msg = "给{}发送了{}".format(x1,x2)
print(msg)
send_email("alex","email")
send_email("sully","快递")
2.2 函数参数- 关键字参数
def send_email(x1, x2):
""" 发送邮件 """
msg = "给{}发送了一封{}".format(x1, x2)
print(msg)
send_email(x1="alex", x2="邮件")
send_email(x2="快递", x1="sully")
2.3 函数参数混搭- 关键字一定在后面 - 默认参数
def send_email(x1, x2="快递"):
""" 发送邮件 """
msg = "给{}发送了一封{}".format(x1, x2)
print(msg)
send_email("alex", x2="邮件")
2.4 函数参数 -动态参数 *- **
* 封装成元祖
def send_email(*x1):
print(x1)
send_email("1")
send_email("11", "22")
send_email("111", "222", "333")
send_email(*[11, 22, 33]) # *在实参 代表把列表打散后传入
msg = "我叫{},今年{},朋友是{}".format(*["alex", 18,"sully"]) # 同理 *在实参代表 打散后传入
** 封装成字典
def send_email(**x1):
print(x1)
send_email(v1="xx", v2=123, m10=123)
* ** 混用
def func(*args, **kwargs):
print(args)
print(kwargs)
func(1, 2, 3, v1=99)
func(1, 2, 3)
3 函数返回值
如果函数中没有出现return,默认return None
函数遇到返回return,立即终止程序
def get_count():
text = "陈尚平过年就是老陈了"
count = 0
for item in text:
if item == "陈":
count += 1
return count
res = get_count() # 执行函数
print(res) # res=函数的返回值
def getResult(data):
result = []
for i in data:
if i.startswith("深圳"):
result.append(i)
return result
rr = getResult(["上海", "⿊⻰江", "北京1", "深圳2", "深圳1"])
print(rr)
闭包
函数中的嵌套, 外层函数的返回值是内层函数的函数名, 方便从外部将参数传入内部(函数作用域)
def outer(name):
def inner(action):
msg = "给{}一{}".format(name,action)
print(msg)
return inner
v1 = outer("alex") # inner函数
v2 = outer("sully") # inner函数
v1("刀")
v2("枪")
装饰器
闭包 + @语法糖 在不改变原函数的基础上,想要在函数之前、后定制功能(代码的迭代,开放-参数/配置文件 封闭-代码原则)
层级:
传统,2层
带参数,3层
2 层级
def outer(func): # func = do
def inner():
# 添加新业务代码
return func()
return inner
# 1. 执⾏outer函数 outer(do),并获取他的返回值,
# 2. 将返回值再重新赋值给do
# do = outer(do) # out(do) = inner, 所以 do = inner (返回 do) 有返回给了 do
@outer # 把do()当参数 传给了 def out(func)
def do():
return 123
2层例子
import time
# 例 在原函数上 添加执⾏时间功能
def outer (f):
def inner():
begin_time = time.time()
total = f() # 此时的 f 还是原来的 func
end_time = time.time()
result = end_time - begin_time
print("执行时间:" + str(result))
print("总和:" + str(total))
return f
return inner # 把内部的inner函数 重新指向了func
#原求和函数
@outer # func = outer(func) <function outer.<locals>.inner at 0x0000024B1C7EA5F0>
def func():
data = 0
for i in range(1000000):
data += i
return data
print(func) # <function outer.<locals>.inner at 0x0000024B1C7EA5F0>
print(func(), type(func)) # <function func at 0x00000208E19BA170> <class 'function'>
3 层 带参数
def tt(count):
def outer(func):
def inner(*args,**kwargs): # 接收func(xx,xx)等参数
return func(*args, **kwargs) # 再将函数 返回给 原来的 函数
return inner
return outer
@tt(5) # 先执行 tt(5) 将其返回值 (其实也是个函数), 然后再将do当参数 给返回的函数outer(do) 进行执行,
def do(v1, v2):
return v1 + v2
data = do(11, 22)
print(data, type(data))
def loop_exec(count):
def outer(f):
def inner(*args, **kwargs):
result = 0
for i in range(count):
data = f(*args, **kwargs)
result += data
return result
return inner
return outer
@loop_exec(3)
def get_info(a1, a2):
return a1 + a2 + 100
print(get_info(10, 20))
value1 = plus(1, 2)
print(value1)
value2 = do(10)
print(value2)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)