函数简介与函数装饰器的推导

昨日内容回顾

  • 函数实参补充
*
在形参用于接收多余的位置参数
*args
在实参中相当于for循环一次性取出所有的数据值按照位置参数传入函数
	func(*[1,2,3,4,5]) # func(1,2,3,4,5)
  func(*{'1':1,'2':2}) #func(name = 'jason')
  

命名关键字参数

针对某些形参在传实参的时候必须使用关键字参数的形式
def func(a,b,*args,name,**kwargs)
pass
func(1,2,3,4,5,name = 'jason',)

名称空间与作用域

#1.名称空间用于存放变量名与数据值绑定关系的地方
内置名称空间 任意位置可用
解释器启动创建,解释器关闭销毁
全局名称空间 任意位置可用
py文件运行创建,py文件关闭销毁
name = 'jason'
	if 1==1:age=18
 	for i in range(10):pass
	while True:pwd=123
	def func():pass
	class MyClass():pass
局部名称空间  局部可用
函数体代码运行创建,结束销毁

global与nonlocal

主要针对不可变类型的数据
global
局部修改全局
nonlocal
局部修改局部

函数名的多种用法

1.类似变量名可以参与赋值
2.函数名可以当作函数的实参
3.函数名可以当作函数的返回值
4.函数名可以当作容器类型的数据值

今日内容概要

  • 闭包函数的简介
  • 闭包函数的实际应用
  • 装饰器的简介
  • 装饰器推到流程
  • 装饰器功能完善
  • 装饰器统一模版
  • 装饰器语法糖
  • 装饰器修复计数

今日详细内容

闭包函数的简介
1.定义函数内部的函数
2.内部函数使用了外部函数名称空间的名字
符合以上两点称之为闭包函数
def func(username):
  #username = 'jason'
  def index()
  	print(username)
  return inedx
# 在全局使用idnex函数
res = func('填什么打印什么')  #先调用func函数后接收函数func运行的返回值index
res()  # 返回的是函数名加括号直接执行

装饰器简介

'''
装饰器不是一个全新的知识而是由我们前面知识的整合
'''
1.装饰器的本质
在不改变被装饰对像原来调用方式和内部代码的情况下给被装饰对象添加新的功能
			def func()
  			print(123)
			func()  # 每次调用之前需要验证用户身份
 2.装饰器的原则
对修改封闭,对扩展开放
3.储备知识
import time
print(time.time())  #时间戳秒数 1970年1月1日距今所经历的秒数
实际应用 统计代码运行的时间
import time  # 倒入时间模块
star_time = time.time()  #时间开始
time.sleep(4)  # 等待三秒再执行代码
for i in range(10):  #循环取出0到9
    print(i)
end_time = time.time()  #结束时间
print('for循环执行的时间是%s'%(end_time - star_time))  #打印代码执行时间
倒入时间模块后可以使用
time.sleep(时间) 可以让程序等待后执行

装饰器前期推导

import time  #倒入时间模块
def index():  #定义函数
    time.sleep(3)
    print('from index')
    '''统计index函数执行的时间'''
stat_time = time.time()  # 开始时间
index()  #调用函数
end_time = time.time()
print('函数index执行%s'%(end_time - stat_time))  # 打印时间
'''
缺陷
如果有多个index需要统计时间则需要重复编写代码

解决措施:
封装成函数
'''
def func():
  stat_time = time.time()  # 开始时间
	index()  #调用函数
	end_time = time.time()
	print('函数index执行%s'%(end_time - 			stat_time))  # 打印时间
  
  
'''
缺陷
如果有多个不同的函数需要统计时间那么上述的解决措施不够完美
解决措施:
给函数添加形参(动态形参)

'''
import time  #倒入时间模块
def index():  #定义函数
    time.sleep(3)
    print('from index')
    '''统计index函数执行的时间'''
def dict():
    time.sleep(1)
    stat_time = time.time()
    print('大家好我是dict函数')
    end_time = time.time()

def func(xxx):
    stat_time = time.time()  # 开始时间
    xxx()  #调用函数
    end_time = time.time()
    print('函数index执行%s'%(end_time - stat_time))  # 打印时间
func(dict)
func(index)  #此处实参填函数名可以调用局部空间内的函数
'''
缺陷不同参数个数的函数无法兼容统计
解决措施
*args **kwargs
目前代码无法实现

'''
def func1(a)
	time.sleep(1)
  print('from func1')
def func(xxx):
    stat_time = time.time()  # 开始时间
    xxx(*args,*kwargs)  #调用函数
    end_time = time.time()
    print('函数index执行%s'%(end_time - stat_time))  # 打印时间
def func1(a):
    time.sleep(1)
    print('from func1')
func(func1)  #此时报错 无法识别函数*
'''
缺陷改变了原来的调用方式
解决措施
装饰器推导


'''
装饰器模版
import time  #倒入时间模块
def dict(xxx):
    def func(*a,**c):
        stat_time = time.time()  # 开始时间
        res = xxx(*a,**c)  #调用函数  home()
        end_time = time.time()
        print('函数index执行%s'%(end_time - stat_time))  # 打印时间
        return res
    return func
def home():
    time.sleep(1)
    print('你好')
home = dict(home)
home()

image

posted @ 2022-07-05 22:00  懒羊羊A  阅读(35)  评论(0)    收藏  举报