matlab函数'handle'和python函数'object'之间的区别

时间:2016-05-18 21:52:18

标签: matlab python-3.x object handle

this comment中建议Matlab和Python如何传递函数之间存在差异。通过观察和使用两者我可以看出,两者之间没有区别,但也许我错过了什么?

在Matlab中,您将创建一个这样的快速函数句柄:

fun = @(x) x.^2 + 1;

在Python中,使用lambda函数,您可以创建类似的函数:

def fun(x):
    return x^2

在这两种语言中,可以将“fun”这个词作为参数发送给另一个函数 - 但是我链接的评论者暗示它们不一样和/或需要以不同的方式使用。

我错过了什么?

1 个答案:

答案 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)