python装饰器举例详解一看就会

本文介绍了如何使用Python装饰器来实现函数执行时间的计时,并逐步解决装饰器处理有返回值和参数的函数问题。通过装饰器,可以提高代码的可读性和复用性,同时保持函数逻辑的清晰。

写在前面:

此文为视频笔记,视频传送门,感谢B站up主“正月点灯笼”。

一、正常写一段函数

import time

# is_prime函数是判断一个数是不是质数
def is_prime(num):
    if num < 2:
        return False
    elif num == 2:
        return True
    else:
        for i in range(2,num):
            if num%i == 0:
                return False
        return True

# 求2-10000里面哪些数是质数并打印出来
def prime_nums():
    t1 = time.time()
    for i in range(2,10000):
        if is_prime(i): # 如果是质数
            print(i)
    t2 = time.time()
    print(t2-t1)

prime_nums()

输出结果:

...
...
9991
9993
9995
9997
9999
0.012510061264038086

这个我们都能正常理解。
但是由于prime_nums()函数里面包含代码逻辑部分也包含一个计时的模块,可读性较低,要将两者分开。假设很多函数都需要计时,如何复用这个代码?

二、装饰器第一版

import time

# 先写个装饰器
def dispaly_time(func): # 这里的传参是一个函数
    def wrapper():
        t1 = time.time()
        func() # 传进来的函数在这里执行
        t2 = time.time()
        print("time:",t2-t1)
    return wrapper # 最终要把这个返回出去

# is_prime函数是判断一个数是不是质数
def is_prime(num):
    if num < 2:
        return False
    elif num == 2:
        return True
    else:
        for i in range(2,num):
            if num%i == 0:
                return False
        return True

# 求2-10000里面哪些数是质数并打印出来
@dispaly_time
def prime_nums():
    for i in range(2,10000):
        if is_prime(i): # 如果是质数
            print(i)

prime_nums() # 先进装饰器,然后进入自己函数的逻辑

输出结果:

...
...
9991
9993
9995
9997
9999
time: 0.011608123779296875

这样就讲一个函数的逻辑部分和计时部分分开了,且这个装饰器可以一直被大家复用。

但是如果我自己的逻辑函数有返回值怎么办?

三、有返回值的处理办法

import time

# 先写个装饰器
def dispaly_time(func): # 这里的传参是一个函数
    def wrapper():
        t1 = time.time()
        func() # 传进来的函数在这里执行
        t2 = time.time()
        print("time:",t2-t1)
    return wrapper # 最终要把这个返回出去

# is_prime函数是判断一个数是不是质数
def is_prime(num):
    if num < 2:
        return False
    elif num == 2:
        return True
    else:
        for i in range(2,num):
            if num%i == 0:
                return False
        return True

# 统计2-10000的质数个数
@dispaly_time
def prime_nums():
    cnt = 0
    for i in range(2,10000):
        if is_prime(i): # 如果是质数
            cnt += 1
    return cnt

cnt = prime_nums() # 先进装饰器,然后进入自己函数的逻辑
print(cnt)

输出结果:

time: 0.0039861202239990234
None

并没有打印出来
因为return的这个cnt并没有传到装饰器里面,wrapper函数没有返回值,wrapper里面没有接收到这个参数,所以没有取到对应的函数值。
这样写就能够正常做返回:

import time

# 先写个装饰器
def dispaly_time(func): # 这里的传参是一个函数
    def wrapper():
        t1 = time.time()
        result = func() # 传进来的函数在这里执行
        t2 = time.time()
        print("time:",t2-t1)
        return result
    return wrapper # 最终要把这个返回出去

# is_prime函数是判断一个数是不是质数
def is_prime(num):
    if num < 2:
        return False
    elif num == 2:
        return True
    else:
        for i in range(2,num):
            if num%i == 0:
                return False
        return True

# 统计2-10000的质数个数
@dispaly_time
def prime_nums():
    cnt = 0
    for i in range(2,10000):
        if is_prime(i): # 如果是质数
            cnt += 1
    return cnt

cnt = prime_nums() # 先进装饰器,然后进入自己函数的逻辑
print(cnt)

输出结果:

time: 0.3815629482269287
1229

逻辑函数有返回值已经可以处理,但是如果逻辑函数存在参数呢?

四、有参数的处理方式

import time

# 先写个装饰器
def dispaly_time(func): # 这里的传参是一个函数
    def wrapper(*args): # 不知道参数有多少个可以直接写*args
        t1 = time.time()
        result = func(*args) # 传进来的函数在这里执行
        t2 = time.time()
        print("time:",t2-t1)
        return result
    return wrapper # 最终要把这个返回出去

# is_prime函数是判断一个数是不是质数
def is_prime(num):
    if num < 2:
        return False
    elif num == 2:
        return True
    else:
        for i in range(2,num):
            if num%i == 0:
                return False
        return True

# 统计2-10000的质数个数
@dispaly_time
def prime_nums(maxNum):
    cnt = 0
    for i in range(2,maxNum):
        if is_prime(i): # 如果是质数
            cnt += 1
    return cnt

cnt = prime_nums(10000) # 先进装饰器,然后进入自己函数的逻辑
print(cnt)

输出结果:

time: 0.41730189323425293
1229
Python 中集成 Ollama 可以通过使用 `ollama` 官方提供的 Python 客户端库来实现。Ollama 是一个本地运行的大型语言模型(LLM)工具,它支持多种模型,如 Llama 2、Mistral 等,并且可以通过简单的 APIPython 应用程序集成。 ### 安装 Ollama Python 库 首先,需要确保你已经在本地系统上安装了 Ollama。你可以从 [Ollama 官方网站](https://ollama.com/)下载并安装适用于你操作系统的版本。 接下来,安装 Python 客户端库。Ollama 提供了一个官方的 Python 包,可以通过 `pip` 安装: ```bash pip install ollama ``` ### 使用 Ollama Python 库 安装完成后,可以使用 `ollama` 模块来调用 OllamaAPI。以下是一个简单的示例,展示如何使用 Ollama 的 `generate` 方法来生成文本: ```python import ollama # 生成文本 response = ollama.generate(model='llama3', prompt='为什么天空是蓝色的?') # 打印响应 print(response['response']) ``` 在这个例子中,`model` 参数指定了要使用的模型(例如 `llama3`),`prompt` 参数是用户输入的提示词。Ollama 会根据提示词生成相应的文本,并返回一个包含 `response` 字段的字典。 ### 获取模型列表 如果你想查看当前可用的模型,可以使用以下代码: ```python import ollama # 获取模型列表 models = ollama.list() # 打印模型列表 for model in models['models']: print(model['name']) ``` ### 模型对话(Chat) Ollama 还支持更复杂的对话模式,允许你在多轮对话中保持上下文。以下是一个使用 `chat` 方法的示例: ```python import ollama # 开始对话 response = ollama.chat( model='llama3', messages=[ {'role': 'user', 'content': '你好,你能帮我做什么?'}, {'role': 'assistant', 'content': '你好!我可以帮助你回答问题、提供建议,甚至进行简单的创作。有什么我可以帮你的吗?'}, {'role': 'user', 'content': '你能告诉我关于机器学习的基础知识吗?'} ] ) # 打印响应 print(response['message']['content']) ``` 在这个例子中,`messages` 参数是一个包含多个对话记录的列表,每个记录都有一个 `role` 和 `content` 字段。Ollama 会根据这些对话记录生成相应的回复。 ### 错误处理 在实际应用中,建议添加错误处理逻辑,以应对可能出现的网络问题或模型加载失败等情况: ```python import ollama try: response = ollama.generate(model='llama3', prompt='为什么天空是蓝色的?') print(response['response']) except Exception as e: print(f"发生错误: {e}") ``` ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值