我已经编写了重复执行功能过程的代码:
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
这时我想:在第二轮比赛中,似乎number
是None
。
我的猜测被证明是正确的:
…
def div(number):
print(number) # i know, actually i shouldn't call it div NOW...
# output:
4
None
我怎么了?预先感谢。
答案 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))