简洁版本
MATLAB代码应这样编写:
function [kf, Ek]=hysime(y, n, Rn, verbose);
error(nargchk(3, 4, nargin))
if nargin < 4
verbose = true;
else
verbose = ~strcmpi(verbose ,'off');
end
如果您了解MATLAB,这应该更加清楚。 (大多数)对应的Python代码可以这样编写:
def hysime(y, n, Rn, verbose=True):
# rest of the function here
return kf, Ek
长版
该函数需要3或4个输入参数,如果未提供第四个参数,则设置默认值。 但是,这样做的方式比所需的方式复杂得多(尽管我经常看到这种模式)。 理想情况下,您可以在MATLAB中指定类似以下内容:
function [varargout]=hysime(y, n, Rn, verbose)
error(nargchk(3, 4, nargin))
if nargin < 4
verbose = true;
else
verbose = ~strcmpi(verbose ,'off');
end
因此,它的工作是将第一个参数放在变量y ,将第二个参数放在变量n ,将第三个参数放在Rn ,如果指定了第四个参数,则将其放在verbose (基于与字符串'off'比较方式) ,否则将verbose设置为true 。
在python中,对可选参数的处理是内置的。 您可以通过设置name=value ,在函数定义中为参数指定默认值,其中name是参数名称,而value是默认值。 同样,由于历史原因,MATLAB通常使用'on'和'off'代替true和false 。 这在Python中几乎从未实现过,人们只使用True和False 。 因此,您可以在Python中指定相同的内容,如下所示:
def hysime(y, n, Rn, verbose=True):
这使y , n和Rn必需参数,但让verbose为可选。
这不适用于将verbose设置为字符串'off' 。 就像我说的那样,由于历史原因,这在MATLAB中很常见,但是在可以避免的情况下,您真的不应该再在MATLAB中进行此操作,并且绝对不应该在Python中进行。 但是,如果您确实需要处理这种情况,则可以执行以下操作:
def hysime(y, n, Rn, verbose=True):
if isinstance(verbose, str):
verbose = verbose.lower() != 'off'
对于输出,MATLAB代码要做的是让函数返回一个值或两个值。 所以有人可以这样做:
kf = hysime(y, n, Rn);
要么
[kf, Ek] = hysime(y, n, Rn);
但是,这也以比必需的更为复杂的方式进行。 如果仅返回两个值,并且仅使用一个返回值,MATLAB将丢弃其余的值。 因此,该函数可以只返回[kf, Ek] ,而不用搞乱varargout ,而MATLAB将执行相同的操作。 如果有人尝试使用两个以上的输出来调用该函数,则会自动发生错误,因此这也是不必要的。
仅当您希望程序根据输出数量更改其行为时,才需要以这种方式处理varargout 。 在这种结构中,您这样做的主要原因是,如果eK计算成本很高,在这种情况下,您将执行以下操作:
varargout(1) = {kf};
if nargout == 2
# calculate eK here
varargout(2) = {Ek};
end
至于return ,这仅在MATLAB中才需要,如果您想使函数在正常结束之前提前停止。 一旦正常到达终点,它将自动return 。 因此,如果您指定的最后一个代码块是函数的结尾,则return是多余的。
因此,您在MATLAB中显示的所有代码都可以简化为:
function [kf, Ek]=hysime(y, n, Rn, verbose);
error(nargchk(3, 4, nargin))
if nargin < 4
verbose = true;
else
verbose = ~strcmpi(verbose ,'off');
end
至于Python,正如我在对您的其他回答中提到的那样,Python要求处理所有返回的值。 除非您明确告知,否则它将永远不会丢弃返回的值。 在您的情况下,最简单的解决方案是在函数的末尾添加return kf, Ek 。 如果有人同时想要kf和Ek ,他们可以这样做:
kf, Ek = hysime(y, n, Rn)
如果他们只想要kf ,他们可以做到(其中_是您不关心的变量的python约定):
kf, _ = hysime(y, n, Rn)
要么:
kf = hysime(y, n, Rn)[0]
因此,python代码将是:
def hysime(y, n, Rn, verbose=True):
# rest of the function here
return kf, Ek
如果您确实希望能够有一个或两个返回值,则需要有另一个参数来更改行为。 如:
def hysime(y, n, Rn, verbose=True, ret_eK=False):
# rest of the function here
return (kf, Ek) if ret_eK else kf
因此,在这种情况下,如果指定ret_eK参数并将其设置为True ,则返回kf, Ek ,否则返回kf 。 但是,在Python中,您实际上不希望这样做,除非计算Ek花费一些主要的额外费用,这种情况下似乎没有。