303_python_函数_闭包_装饰器

举报
alexsully 发表于 2022/02/28 20:14:25 2022/02/28
【摘要】 函数 闭包 装饰器 语法糖

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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。