加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – Decorator使函数返回None

发布时间:2020-12-20 11:56:46 所属栏目:Python 来源:网络整理
导读:我建立了两个函数来找到素数因子.一个版本比大数字上的另一个版本慢.我想评估这两个函数的运行时间.为此,我建立了一个装饰器来评估黯然失色的时间. 因为我插入了装饰器,我的两个函数返回None.我的代码有什么问题? import mathimport timedef time_usage(fun
我建立了两个函数来找到素数因子.一个版本比大数字上的另一个版本慢.我想评估这两个函数的运行时间.为此,我建立了一个装饰器来评估黯然失色的时间.
因为我插入了装饰器,我的两个函数返回None.我的代码有什么问题?

import math
import time

def time_usage(func):
    def wrapper(*args,**kwargs):
        beg_ts = time.time()
        func(*args,**kwargs)
        end_ts = time.time()
        print("[INFO] elapsed time: %f" % (end_ts - beg_ts))
    return wrapper

@time_usage
def find_factors(n):
    factors = []
    i = 2
    while i < n:
        while (n % i) == 0:
            factors.append(i)
            n /= i
        i += 1
    if n > 1:
        factors.append(n)
    return factors

@time_usage
def improved_prime_factor(n):
    factors = []
    # No need to test whether the number is divisible by any 
    # even number other than 2
    while n % 2 == 0:
        factors.append(2)
        n /= 2
    i = 3
    # If n = p * q,either p or q must be <= sqrt(n)
    max_factor = math.sqrt(n)
    while i <= max_factor:
        while n % i == 0:
            factors.append(i)
            n /= i
            # Update the upper band on possible factors
            max_factor = math.sqrt(n)
        i += 2
    if n > 1:
        factors.append(n)
    return factors

if __name__ == '__main__':
    print(improved_prime_factor(125556))  # return None
    print(find_factors(125556)) # return None

解决方法

你需要返回func(* args,** kwargs).使用functools.wraps装饰包装器方法也是一种好习惯

import functools


def time_usage(func):       
    @functools.wraps
    def wrapper(*args,**kwargs):
        beg_ts = time.time()
        result = func(*args,**kwargs)   # save the result to a name
        end_ts = time.time()
        print("[INFO] elapsed time: %f" % (end_ts - beg_ts))
        return result # return the name
    return wrapper

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读