Python 在其他函数中作为参数传递函数
我有这些函数,并且我在使用dou tweep函数时出现了错误,但是我在调试它时遇到了问题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
#!/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(下面)有效的功能。