如何使用'* args'定义'do_twice'函数?

时间:2019-02-20 11:39:42

标签: python

我已经编写了重复执行功能过程的代码:

def do_twice(func, *args):
    func(func(args))
def div(number):
    print(number[0]/2)
do_twice(div, 8)

预期输出为:

4.0
2.0

但是输出是:

4.0
TypeError: 'NoneType' object is not subscriptable

这时我想:在第二轮比赛中,似乎numberNone。 我的猜测被证明是正确的:

…
def div(number):
    print(number)                          # i know, actually i shouldn't call it div NOW...

# output:
4
None

我怎么了?预先感谢。

4 个答案:

答案 0 :(得分:1)

无需太多更改即可解决。

def do_twice(func, *args):
    func(func(args[0]))
def div(number):
    result = number/2
    print(result)
    return result # Return the result
do_twice(div, 8)

div需要return的计算结果才能由do_twice存储,以便进行第二次迭代。否则,您的直觉是正确的,您将None除以div的第二次执行。

关键要点是: 返回使值可以在函数外部访问。

答案 1 :(得分:1)

您忘记了从函数中返回某些内容:

def do_twice(func, *args, **kwargs):
    return func(func(*args, **kwargs))

def div2(n):
    x = n / 2
    print(x)   # For debugging. A function like this normally would not print.
    return x

do_twice(div2, 8)

答案 2 :(得分:1)

在调用func(func(args))中,函数func不返回任何值。因此,func(args)没有在外部调用中为number提供必需的func自变量

功能div应该进行如下修改

def div(number):
    print(number[0]/2)
    return [number[0]/2]

答案 3 :(得分:1)

Te的问题是,当首次调用'div'时,它将获得args作为输入,并且正在寻找args [0]。秒调用“ div”将返回一个数字,而args [0]将失败。

以下代码似乎有效:

def do_twice(func, *args):
    return func(func(args))


def div(number):
    return number[0] / 2 if isinstance(number, tuple) else number / 2


print(do_twice(div, 8))