Python 在其他函数中作为参数传递函数

Python 在其他函数中作为参数传递函数,python,function,Python,Function,我有这些函数,并且我在使用dou tweep函数时出现了错误,但是我在调试它时遇到了问题 #!/usr/bin/python #functins exercise 3.4 def do_twice(f): f() f() def do_four(f): do_twice(f) do_twice(f) def print_twice(str): print str + 'one' print str + 'two' str = 'spam

我有这些函数,并且我在使用dou tweep函数时出现了错误,但是我在调试它时遇到了问题

#!/usr/bin/python
#functins exercise 3.4

def do_twice(f):
    f()
    f()

def do_four(f):
    do_twice(f)
    do_twice(f)

def print_twice(str):
    print str + 'one' 
    print str + 'two'


str = 'spam'
do_four(print_twice(str))
调试器错误

:!python 'workspace/python/functions3.4.py'
spamone
spamtwo
Traceback (most recent call last):
  File "workspace/python/functions3.4.py", line 18, in <module>
    do_four(print_twice(str))
  File "workspace/python/functions3.4.py", line 9, in do_four
    do_twice(f)
  File "workspace/python/functions3.4.py", line 5, in do_twice
    f()
TypeError: 'NoneType' object is not callable

shell returned 1
:!python'workspace/python/functions3.4.py'
斯帕蒙
spamtwo
回溯(最近一次呼叫最后一次):
文件“workspace/python/functions3.4.py”,第18行,在
do_四(打印两次(str))
文件“workspace/python/functions3.4.py”,第9行,第4行
做两次(f)
文件“workspace/python/functions3.4.py”,第5行,在do_中两次
f()
TypeError:“非类型”对象不可调用
壳返回1

问题是表达式
print\u tweep(str)
的计算方法是使用
str
调用
print\u tweep
,并获得返回的结果,*而该结果就是作为参数传递给
dou four
的结果

您需要传递给
dou\u four
的是一个函数,当调用该函数时,会调用
print\u两次(str)

您可以手动构建这样的函数:

def print_twice_str():
    print_twice(str)
do_four(print_twice_str)
或者,您也可以在线执行相同的操作:

do_four(lambda: print_twice(str))
或者,您可以使用高阶函数为您执行此操作:

from functools import partial
do_four(partial(print_twice, str))
partial
的文档有一个很好的解释:

partial()。例如,
partial()



*如果您想“但是我没有返回任何东西,那么
None
从何而来?”:在Python中,每个函数总是返回一个值。如果您不告诉它返回什么,它会立即返回
None

打印两次
返回
None
,这是作为参数传递给
dou\u four
的结果。换句话说,您传递的是函数调用的结果,而不是函数调用本身

相反,您希望将该函数调用包装到lamda函数中,如下所示:

do_four(lambda: print_twice(str))

这将实际函数调用作为参数传递,而不是调用函数并传递其结果。

do\u four(print\u tweep(str))
在传递前首先计算括号中的表达式。由于print_tweep不返回任何内容,因此假定
None
,并通过该操作。

作为旁注,调用变量
str
是个坏主意;这是Python中最重要的内置类型之一的名称,也是用于获取任何对象的友好表示的函数,因此您不想隐藏它。哦,是的。。。现在我明白了。我没有传递函数,而是返回函数。。换句话说,要从我的函数调用中获得一些东西,我必须在print_tweep函数中添加一个return语句,或者传递函数和参数,这就是partial(下面)有效的功能。