# def my_sum(*args):
# sum = 0
# for i in args:
# sum +=i
# return sum
# print(my_sum(99,1))
# a = 10
# b = 20
# def func(a,b):
# a = 3
# b = 5
# print(a,b)
# c = func(b,a)
# print(c)
# import time
# def func():
# time.sleep(0.01)
# print('哈哈哈')
#
# def timmer(f):
# def inner():
# start = time.time()
# f()
# end = time.time()
# print(end - start)
# return inner
# func = timmer(func)
# func()
# 三元运算符
# 接收结果的变量 = 条件为真的结果 if 条件 else 条件为假的结果
# 接收结果的变量 = “真结果” if 条件 else “假结果”
#
# 命名空间 和 作用域
# 三种:内置 全局 局部
# 作用域:全局 局部 globals() locals()
# global 在局部声明一个全局变量
# nonlocal 在局部声明最近的上一层局部中的变量
# 作用域链 : 小范围用变量的时候,先从自己的名字空间找,
# 找不到就一层一层向外层找,知道找到为止。
# 找不到就报错。
# 函数的嵌套调用和嵌套定义
# 定义在函数内部的函数不能被外界直接调用
# 内部函数可以使用外部的变量
# 函数名的本质
# 就是一串内存地址
# 可以赋值、可以作为容器类型的元素、函数的参数和返回值 —— 第一类对象
# 闭包 : 内部函数使用外部函数的变量
# def outer():
# a =1
# def inner():
# print(a)
# return inner
# i = outer()
# i()
# 今日内容
# 装饰器的形成过程
# 装饰器的作用-->不修改函数的调用方式,但为函数加上新的功能
# 开放封闭原则
#开放:对扩展是开放的
#封闭:对修改是封闭的--->封版
# 语法糖:@
# 装饰器的固定模式
# import time
#
# def timmer(f):
# def inner():
# start = time.time()
# ret = f()
# time.sleep(0.01)
# end = time.time()
# print(end - start)
# return ret
# return inner
#@timmer就等于func = timmer(func)
# def func():
# print(123)
# func = timmer(func)
# func()
#最简单 装饰器模型:
# def outer():
# def inner():
# return inner
# inner()
# outer()
#万能参数装饰器模型
# def wapper(func):
# def inner(*args,**kwargs):
# #在装饰函数之前要做的事
# ret = func(*args,**kwargs)
# # 在装饰函数之后要做的事
# return ret
# return inner