【问题标题】:How do you count how many times a function returns a specific value?您如何计算函数返回特定值的次数?
【发布时间】:2020-08-17 08:58:05
【问题描述】:

我有一个函数 def recFib,它返回一堆不同的数字,但我希望能够计算它返回“计算 fib(3)”的次数。我试图实现一个计数器,但它只返回 0。有谁知道我会怎么做?

代码:

# fib.py
def loopFib(n):
    # pre: n > 0
    # returns the nth Fibonacci number
    curr = 1
    prev = 1
    for i in range(n-2):
        curr, prev = curr+prev, curr
    return curr

def recFib(n):
    print("Computing fib" "(",n,")" )

    if n<3:
        print("Leaving fib" "(",n,")" "returning",1)
        return 1
    else:
        x=recFib(n-1)
        y=recFib(n-2)
        print("Leaving fib" "(",n,")" "returning",x+y)
        return x+y



n = 10
#print(recFib(n))



counter = []
if (recFib(n) == "Computing fib( 3 )"):
    counter.append('Three')

count3s = counter.count('Three')
print("Threes", count3s )

#Should return 21 instances of "Computing fib(3)"

输出: (输出的示例)

Computing fib( 10 )
Computing fib( 9 )
Computing fib( 8 )
Computing fib( 7 )
Computing fib( 6 )
Computing fib( 5 )
Computing fib( 4 )
Computing fib( 3 )
Computing fib( 2 )
Leaving fib( 2 )returning 1
Computing fib( 1 )
Leaving fib( 1 )returning 1
Leaving fib( 3 )returning 2
Computing fib( 2 )
Leaving fib( 2 )returning 1
Leaving fib( 4 )returning 3
Computing fib( 3 )

【问题讨论】:

  • 你做过调试吗?顺便说一句,变量和函数名称通常应遵循 lower_case_with_underscores 样式。

标签: python


【解决方案1】:

你的函数永远不会返回"Computing fib( 3 )",它只会打印那个。这就是为什么你的条件recFib(n) == "Computing fib( 3 )" 永远不会实现。修改代码最简单的方法是:

counter = 0

def recFib(n):
    global counter
    print("Computing fib" "(",n,")" )
    if n==3:
        counter += 1
    if n<3:
        print("Leaving fib" "(",n,")" "returning",1)
        return 1
    else:
        x=recFib(n-1)
        y=recFib(n-2)
        print("Leaving fib" "(",n,")" "returning",x+y)
        return x+y

print(recFib(10))
print(counter)

确实输出 21。

【讨论】:

    【解决方案2】:

    使用call counter decorator

    装饰器

    def call_counter(func):
        def helper(x):
            if x == 3:
              # Counts calls when argument is 3
              helper.calls += 1
            return func(x)
        helper.calls = 0
        return helper
    

    只需在原始代码中添加装饰器

    @call_counter   # Add decorator
    def recFib(n):
        print("Computing fib" "(",n,")" )
    
        if n<3:
            print("Leaving fib" "(",n,")" "returning",1)
            return 1
        else:
            x=recFib(n-1)
            y=recFib(n-2)
            print("Leaving fib" "(",n,")" "returning",x+y)
            return x+y
    

    用法

    print(recFib(10))
    print(f'Instances of computing fib 3 is {recFib.calls}')
    

    输出

    Instances of computing fib 3 is 21
    

    【讨论】:

    • 谢谢!这个解决方案效果很好,我以前从未使用过或听说过 Python 中的装饰器,所以这非常有见地!
    • @Dorinas--很高兴我能帮上忙。装饰器是流行的功能之一。 More info on decorators
    猜你喜欢
    • 2017-03-16
    • 2011-07-30
    • 2021-12-12
    • 2018-10-10
    • 2014-11-15
    • 2021-07-20
    • 1970-01-01
    • 2021-02-04
    • 2022-12-22
    相关资源
    最近更新 更多