在this comment中建议Matlab和Python如何传递函数之间存在差异。通过观察和使用两者我可以看出,两者之间没有区别,但也许我错过了什么?
在Matlab中,您将创建一个这样的快速函数句柄:
fun = @(x) x.^2 + 1;
在Python中,使用lambda函数,您可以创建类似的函数:
def fun(x):
return x^2
在这两种语言中,可以将“fun”这个词作为参数发送给另一个函数 - 但是我链接的评论者暗示它们不一样和/或需要以不同的方式使用。
我错过了什么?
答案 0 :(得分:3)
第一条评论似乎只是重申了你可以将MATLAB函数句柄作为参数传递的想法(虽然答案没有说明任何会让我想到的东西)。第二条评论似乎解释为这意味着第一位评论者认为您无法在Python中执行此操作并回复说您可以使用 一个lambda或直接传递函数。
无论如何,假设您正确使用它们,MATLAB中的函数句柄在功能上等同于使用 lambda或函数对象作为Python中的输入参数。
在python中,如果你没有将()
附加到函数的末尾,它就不会执行该函数而是产生函数对象,然后可以将函数对象传递给另一个函数
# Function which accepts a function as an input
def evalute(func, val)
# Execute the function that's passed in
return func(val)
# Standard function definition
def square_and_add(x):
return x**2 + 1
# Create a lambda function which does the same thing.
lambda_square_and_add = lambda x: x**2 + 1
# Now pass the function to another function directly
evaluate(square_and_add, 2)
# Or pass a lambda function to the other function
evaluate(lambda_square_and_add, 2)
在MATLAB中, 使用函数句柄,因为即使省略()
,MATLAB也会尝试执行函数。
function res = evaluate(func, val)
res = func(val)
end
function y = square_and_add(x)
y = x^2 + 1;
end
%// Will try to execute square_and_add with no inputs resulting in an error
evaluate(square_and_add)
%// Must use a function handle
evaluate(@square_and_add, 2)