ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

函数补充与装饰器介绍

2022-03-18 21:07:09  阅读:112  来源: 互联网

标签:index 函数 补充 time print 装饰 def


目录

今日补充函数的另一种用法冲刺吧年轻人!!!!!

一.闭包函数

闭包函数分为两大特性

1.闭:

定义在函数内部的函数(先定义在调用)

2.包:

内部函数使用了外层函数名称空间中的

def outer():
  x = 999
  def inner():
    print(user name', x)
  return inner
ser = outer()
ser()

# 结果999 符合闭包函数的特征

二.闭包函数的实际应用

闭包函数是给函数体传参的另一种方式

1.函数体传参:形参

def oute(username):
    print(username)
oute('jason')
# 结果 jason
函数体代码要什么写什么

2.函数体传参:闭包

def outer(username):   
    def index():
        print(username) 
    return index     
res = outer('kevin') # 形参username与值kevin临时绑定到局部名称空间中
res()
# 结果 kevin

三.装饰器简介

1.装饰器本质:

是在不改变被装饰对象原有的‘调用方式’和‘内部代码’的情况下给被装饰对象添加新的功能

2.装饰器的原则:

对扩展开放 对修改封闭

import time  
def index():
    time.sleep(3)   #让程序原地等待3面后运行
    print('from index')
'''给index函数增加了一个统计执行时间的功能'''
start_time = time.time()  # 函数执行之前获取一个时间戳
index()
end_time = time.time()  # 函数执行之后获取一个时间戳
print(end_time - start_time)  # 两个时间戳的差值就是函数的执行时间

四.建议简易版本装饰器

五.进阶版本装饰器

def outer(func_name):
    def get_time(*args, **kwargs):
        start_time = time.time()
        func_name(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
    return get_time
# 解决的是参数问题

六.完整版装饰器

# 解决的是返回值问题
def outer(func_name):
    def get_time(*args, **kwargs):
        start_time = time.time()
        res = func_name(*args, **kwargs)  # 执行真正的index函数
        end_time = time.time()
        print(end_time - start_time)
        # return '不要急躁' # 如何在此处返回真正index函数的返回值
        return res
    return get_time

七.重要环节 装饰器模板(通用类型)

def outer(func_name):  # func_name用于接收被装饰的对象(函数)
    def inner(*agrs, **kwargs):
        print('执行被装饰之可进行的操作')
        res = func_name(*agrs, **kwargs)  #执行真正被装饰的函数
        print('执行被装饰函数之后的额外操作')
        return res   # 返回真正的函数返回值
    return inner

八.装饰器的语法糖

还是为了让代码编写更加简洁
def outer(func_name):
    def inner(*args, **kwargs):
        print('执行函数之前的操作')
        res = func_name(*args, **kwargs)
        # 额外操作
        return res
    return inner

@outer  # 等价于 index = outer(index)
def index(*args, **kwargs):
    print('from index')
# index = outer(index)  # 不好看

@outer  # 等价于 home = outer(home)
def home(*args,**kwargs):
    print('from home')

8.1语法糖内部原理

1.使用时候紧跟在被装饰对象的上方
2.语法糖会自动将下边紧挨这的函数名传输给@后边函数调用

九.装饰器修复技术

from functools import wraps
def outer(func_name):
    @wraps(func_name)
    def inner(*args, **kwargs):
        print('执行被装饰对象之前可以做的操作')
        res = func_name(*args, **kwargs)
        return res
    return inner
@outer
def index():
    print('from index')
@outer
def home():
    '''这是home函数的注释'''
    print('from home')
# help(home)  # help可以查看指定函数的注释信息
# help(len)
# index()  # 目前的以假乱真 有瑕疵
# print(index)
# help(home)
# help(index)
# print(home)
# print(index)
home()
index()

标签:index,函数,补充,time,print,装饰,def
来源: https://www.cnblogs.com/xwkg/p/16023539.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有