IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python-day10:装饰器详解、高阶函数、变量内存地址说明 -> 正文阅读

[Python知识库]Python-day10:装饰器详解、高阶函数、变量内存地址说明

1、代码

# 2021年12月07日,第四周1~7
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import time


def time_low_low(func):  # 计算函数运行时间
    start_time = time.time()
    func()
    stop_time = time.time()
    print("不使用装饰器:the func run time is %s" % (stop_time - start_time))
    return func


def day10_case():
    print("不使用装饰器")


# 装饰器:装饰器本质是函数(装饰函数),为函数添加功能,不修改原函数代码
# 装饰器 =》 高阶函数+嵌套函数
# 参考文章:https://www.cnblogs.com/wupeiqi/articles/4980620.html

def time_low(func):  # 计算函数运行时间
    # 错误装饰器示例
    # 此装饰器仅仅适用无传参与无返回值的函数,
    # 若对有传参的函数与有返回值的函数使用会出现bug或报错。
    # def warpper(): #若函数无参数传入,可以不输入*args, **kwargs,把注释去掉,调用day10_case0()可检验
    def warpper(*args, **kwargs):
        start_time = time.time()
        func()
        stop_time = time.time()
        print("装饰1:the func run time is %s" % (stop_time - start_time))

    return warpper


@time_low
def day10_case0():
    # 使用了错误装饰器
    print("使用了错误装饰器")


@time_low
def day10_case1(hint="参数传不进来"):
    # 使用了错误装饰器
    print("使用了错误装饰器")
    print(hint)
    return hint


def time_new(func):  # 计算函数运行时间
    # 正确的装饰器示例
    # 必须添加*args, **kwargs,否则报错
    def warpper(*args, **kwargs):
        start_time = time.time()
        # 1、必须添加*args, **kwargs,否则被装饰的函数无法传入参数
        # 2、可使用一个变量承接函数返回值,若直接return func会返回一个函数的内存地址
        # 3、或者最后return func(*args, **kwargs)也可以,不会返回None
        func1 = func(*args, **kwargs)
        stop_time = time.time()
        print("the func run time is %s" % (stop_time - start_time))
        # return func # 直接return func会返回一个函数的地址
        return func1  # 必须return func函数的返回值,否则被装饰的函数返回值为None
        # return func(*args, **kwargs)  # 或者return func(*args, **kwargs)也可以

    return warpper
    # 函数可是看成变量,warpper可以看成变量,若没有调用,即是一堆字符串;
    # 例如匿名函数calc = lambda x:x*x; print(calc(10)); 输出100。
    # 若函数被调用,会先找到函数的内存地址,然后再运行。
    # 函数(装饰器)time_new(func)若被传入值(函数),
    # 会运行return warpper,因传入的func使得warpper(*args, **kwargs)变成一个完整函数,
    # 然后warpper函数体得以运行,然后再运行func函数体,从而构成一个装饰器


@time_new
def day10_case2(*args):
    # 使用了正确装饰器
    # 注意:因为*args只传如一个参数,所以传入的实际值为元组(args,)
    # 若传入2个参数,传入的实际值为元组(args1,args2)
    print("使用了正确装饰器")
    print(args)
    return args


def day10_case3(*args):
    # 高阶函数示例
    print("我是函数3")
    return args


def day10_case4(args):
    # 高阶函数示例
    print("我是函数4")
    args()  # 若args传入函数day10_case3,则运行函数3
    return args


def day10_case5():
    # 变量内存地址说明
    x = 1
    y = x
    print("x的内存地址为:{0},y的内存地址为:{1}".format(id(x), id(y)))
    y = 1
    print("因y的值不变,所以x与y的内存地址不变,"
          "x的内存地址为:{0},y的内存地址为:{1}".format(id(x), id(y)))
    y = 2
    print("因y的值改变,y的内存地址改变,x的值不变内存地址不变;"
          "x的内存地址为:{0},y的内存地址为:{1}".format(id(x), id(y)))
    x = 2
    print("因x的值改变,x的内存地址改变,y的内存不变;因x与y的值相等,所以共用地址;"
          "x的内存地址为:{0},y的内存地址为:{1}".format(id(x), id(y)))


if __name__ == '__main__':
    day10_case_new = time_low_low(day10_case)  # 不使用装饰器计算函数运行时间,高阶函数
    # day10_case的内存地址将赋值给day10_case_new,time_low_low返回的day10_case是内存地址
    day10_case_new()  # 加上括号可直接运行day10_case()函数,因为day10_case_new与其共用一个内存地址
    # day10_case1()使用了错误装饰器@time_low,参数传不进去,返回值为空
    print(day10_case0())
    print(day10_case1(hint="case1传入参数"))
    # day10_case2()使用了正确装饰器@time_new,参数可传进去,返回值返回正常
    print(day10_case2("case2传入参数"))
    calc = lambda x: x * x  # 匿名函数
    print("calc匿名函数结果:", calc(10))
    print(day10_case4(day10_case3))  # 高阶函数示例,返回函数3的内存地址
    day10_case5()  # 变量内存地址说明

2、函数内存地址说明

3、高阶函数

?4、函数day10_case5()运行结果

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-09 11:36:34  更:2021-12-09 11:36:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 5:25:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码