首页 > 编程语言 >Python基础5-装饰器与推导式

Python基础5-装饰器与推导式

时间:2025-01-22 15:11:25浏览次数:1  
标签:return 推导 Python inner func time print 装饰 def

1.装饰器

  • 1.1 引入装饰器的代码
v = 1
v = 2
def func():
    pass
v = 10
v = fun # 变量v指向了函数func

def base():
    print(1)
def bar():
    print(2)
bar = base
bar()

def func():
    def inner():
        pass
    return inner
v = func()
print(v) # inner函数 <function func.<locals>.inner at 0x11fa53b00>

def func(arg):
    def inner():
        print(arg)
    return inner
v1 = func(1)
v2 = func(2)
print(v1, v2) # <function func.<locals>.inner at 0x11fa507c0> <function func.<locals>.inner at 0x11fa50860>

def func(arg):
    def inner():
        arg()
    return inner
def f1():
    print(123)
v1 = func(f1)
v1()

def func(arg):
    def inner():
        arg()
    return inner
def f1():
    print(123)
    return 666
v1 = func(f1)
result = v1() # 执行inner函数 f1含函数 ---> 123
print(result) # None

def func(arg):
    def inner():
        return arg() # v = arg() return v
    return inner
def f1():
    print(123)
    return 666
v1 = func(f1)
result = v1() # 执行inner函数 f1含函数 ---> 123
print(result) # 666

def func():
    print(1)
v1 = func
func = 666
v1()
print(func)
  • 1.2 装饰器代码
def func(arg):
    def inner():
        print('Before')
        v = arg()
        print('After')
        return v
    return inner
def index():
    print('123')
    return '666'

# 示例1
v1 = index() # 执行index函数,打印123并返回666赋值给v1
print(v1)
# 示例2
v2 = func(index) # v2是inner函数,arg即index函数
index = 666
v3 = v2()
print(v3)
# 示例3
v4 = func(index)
index = v4 # index指向了inner函数
index()
# 示例4
index = func(index)
index()
###################################################
def func(arg):
    def inner():
        v = arg()
        return v
    return inner

# 第1步:执行func函数并将下面的函数名当做参数传递,相当于:func(index)
# 第2步:将func的返回值重新赋值给下面的函数名,相当于:index = func(index)
@func
def index():
    print(123)
    return 666

print(index) # <function func.<locals>.inner at 0x11feb2c00>
  • 1.3 一个和装饰器有关的案例——计算函数执行时间
    • 不用装饰器编写,代码冗余度较高
    import time
    def func1():
        time.sleep(2)
        print(123)
    
    def func2():
        time.sleep(1)
        print(123)
    
    def func3():
        time.sleep(1.5)
        print(123)
    
    start_time1 = time.time() # 获取当前时间
    func1()
    end_time1 = time.time() # 获取当前时间
    print(end_time1-start_time1)
    
    start_time2 = time.time() # 获取当前时间
    func2()
    end_time2 = time.time() # 获取当前时间
    print(end_time2-start_time2)
    
    start_time3 = time.time() # 获取当前时间
    func3()
    end_time3 = time.time() # 获取当前时间
    print(end_time3-start_time3)
    
    • 用装饰器编写:代码重用
      • 在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能
    # 应用:计算函数执行时间
    import time
    def wrapper(func):
        def inner():
            start_time = time.time()
            v = func()
            end_time = time.time()
            print(end_time-start_time)
            return v
        return inner
    
    @wrapper
    def func1():
        time.sleep(2)
        print(123)
    
    @wrapper
    def func2():
        time.sleep(1)
        print(123)
    
    @wrapper
    def func3():
        time.sleep(1.5)
        print(123)
    
    func1()
    
    ###################################################
    def x(func):
        def y():
            pass # 执行func函数前要做的事情
            ret = func()
            pass # 执行func函数后要做的事情
            return ret
        return y
    
    # 装饰器的应用
    @x
    def index():
        return 10
    
    @x
    def manage():
        pass
    
    # 执行函数,自动触发装饰器了
    v = index()
    print(v)
    
  • 1.4 装饰器编写格式
def outer_func(param):
    def inner_func(*args, **kwargs):
        return param(*args, **kwargs)
    return inner_func
# 问题:为什么要加*args **kwargs
@outer_func
def index():
    pass
index()


def wrapper(func):
    def inner(*args, **kwargs):
        return func(*args, **kwargs)
    return inner

@wrapper
def index():
    print(1123)
index() # 无参数传递

@wrapper
def show(a1):
    print(a1+100)

show(1) # 有参数传递
# index和show传递给装饰函数的参数func,在inner内部index和show会被调用,虽然两个函数被同一个装饰器装饰,
# 但参数个数不一定一致,所以要加可变参数
# 被装饰的函数index show可能不接收参数,也可能接收1个或多个参数,它们最后都会指向inner函数,所以inner
# 要带可变参数

2.列表推导式

  • 2.1 使用目的
    • 简化代码
    • 方便生成一个列表
  • 2.2 格式
v1 = [i for i in 可迭代对象]
v2 = [i for i in 可迭代对象 if 条件 ] # 条件为True才进行append
  • 2.3 案例
v1 = [i for i in 'alex']
v2 = [i + 100 for i in range(10)]
v3 = [99 if i>5 else 66 for i in range(10)]
print(v1, v2, v3)

def func():
    return 100
v4 = [func for i in range(10)]
print(v4) # [<function func at 0x12e9d84a0>, <function func at 0x12e9d84a0>, <function func at 0x12e9d84a0>, <function func at 0x12e9d84a0>, <function func at 0x12e9d84a0>, <function func at 0x12e9d84a0>, <function func at 0x12e9d84a0>, <function func at 0x12e9d84a0>, <function func at 0x12e9d84a0>, <function func at 0x12e9d84a0>]

v5 = [lambda: 100 for i in range(10)]
result = v5[9]()
print(result)
def func():
    return i
v6 = [func for i in range(10)]
result = v6[5]()
print(result)

v7 = [lambda:i for i in range(10)]
result = v7[5]()
print(result)

v8 = [lambda x:x*i for i in range(10)] # 新浪微博面试题
# 1.请问 v8 是什么? ---> 8个匿名函数
# 2.请问v8[0](2)的结果是什么? 执行匿名函数 2*9
print(v8)
print(v8[0](2))

def num():
    return [lambda x:i*x for i in range(4)]
# num()执行后返回了一个列表,列表元素是4个匿名函数,4个函数的内容一样
print([m(2) for m in num()])

3.集合推导式

v1 = {i for i in 'alexxe'}
print(v1)

4.字典推导式

v2 = {'K'+str(i):i for i in range(10)}
print(v2)

标签:return,推导,Python,inner,func,time,print,装饰,def
From: https://www.cnblogs.com/zjl-linux/p/18685783

相关文章

  • python操作mysql
    前言在Python3中,我们可以使用mysqlclient或者pymysql三方库来接入MySQL数据库并实现数据持久化操作。二者的用法完全相同,只是导入的模块名不一样。我们推荐大家使用纯Python的三方库pymysql,因为它更容易安装成功。下面我们仍然以之前创建的名为hrs的数据库为例,为大家......
  • 【Python】函数(一)
    函数是什么?编程中的函数和数学中的函数有一定的相似之处.数学上的函数,比如y=sinx,x取不同的值,y就会得到不同的结果.编程中的函数,是一段可以被重复使用的代码片段代码示例:求数列的和,不使用函数#1.求1-100的和sum=0foriinrange(1,101):......
  • 如何在Python中高效地读写大型文件?
    大家好,我是V哥。上一篇给大家介绍如何使用Python进行文件读写操作的方法,问题来了,如何读写的是大型文件,有没有什么方法来提高效率呢,不要捉急,这一篇来聊聊如何在Python中高效地读写大型文件。以下是在Python中高效读写大型文件的一些方法:一、逐行读取大型文件:defread_larg......
  • Python和Python 3 的区别
    Python和Python3都是非常流行的编程语言,在开发中都有各自的优点和特点。以下是其中一些值得注意的区别:代码兼容性:Python2.x和Python3.x不兼容,这是最重要的区别之一。Python2.x是早期版本,而Python3.x是重大更新后的版本,并且不完全向后兼容。这意味着在迁移过程中,需......
  • Python多继承时子类如何调用指定父类
    在Python中,多继承是一种强大的特性,允许一个类同时继承多个父类的属性和方法。然而,当多个父类中存在同名方法时,子类需要明确调用哪个父类的方法。本文将详细介绍如何在多继承情况下,子类调用指定父类的方法。一、多继承的基本概念1.1多继承的定义多继承指一个类可以继承多个父类......
  • 抽取网易云音乐热门评论:html+css+python+js 音乐与灵魂的碰撞
    抽取网易云音乐热门评论:html+css+python+js音乐与灵魂的碰撞代码链接不说废话,上代码!!!get.py#get.pyimporturllib.requestimporturllib.errorimporturllib.parseimportjson#抓取网易云音乐指定url的热评defget_hotComments(id):url='https://music.163.......
  • 6. 马科维茨资产组合模型+AI金融智能体(DeepSeek-V3)识别政策意图方案(理论+Python实战
    目录0.承前1.幻方量化&DeepSeek1.1Whatis幻方量化1.2WhatisDeepSeek2.重写AI金融智能体函数3.汇总代码4.反思4.1不足之处4.2提升思路5.启后0.承前本篇博文是对上一篇文章,链接:5.马科维茨资产组合模型+AI金融智能体(qwen-max)+政策信息优化方案......
  • 抽取网易云音乐热门评论(附代码):html+css+python+js 音乐与灵魂的碰撞
    抽取网易云音乐热门评论:html+css+python+js音乐与灵魂的碰撞代码链接不说废话,上代码!!!get.py#get.pyimporturllib.requestimporturllib.errorimporturllib.parseimportjson#抓取网易云音乐指定url的热评defget_hotComments(id):url='https://musi......
  • python 读取word、pdf文件内容
    importdocx2txtimportfitzimportdocxfromdocx.oxmlimportparse_xmldefget_doc_content(filepath):"""获取word文本内容"""try:doc=docx.Document(filepath)content=[]forelementindoc.elem......
  • 使用Python3.8写的代码比Python3.10写的性能差吗?
    一般情况下,Python3.10的性能是要好于Python3.8的。那么是否意味着同等条件下,使用Python3.8写出来的代码要比Python3.10写出来的代码性能差呢?笔者曾经写过一个项目,项目一开始使用Python3.8。重构时,因为3.8不支持某些功能,一度将Python版本升到了Python3.10。升到3.10......