Python中是否有MATLAB nargout的任何等同? 我发现nargout一个非常整洁的方法,如果我们想保持的回报参数的灵活数量。 有没有一种方法,我可以找出有多少输出参数已要求? 类似下面的伪 - python的代码:
def var_returns_func(a):
"""
a is a 1D numpy array
"""
if nargout==1: return a.sum()
elif nargout==2: return a.sum(),a.std()
所以,如果我把这个功能mean = var_returns_func(someNumPyarray)
它应该返回一个值。 但是,如果我把它作为mean,std = var_returns_func(someNumPyarray)
它应该返回2倍的值。
是否有这样做的一个Python化的方式? 还是哈克的方式?
该功能可以不知道是怎么回事要与返回值完成的,因此它无法知道有多少是必要的。 你可以做的是通过nargout
作为参数传递给你的函数,并用它来决定如何返回:
def f(a, nargout=1):
if nargout == 1:
return "one value"
elif nargout == 2:
return "two", "values"
else:
raise ValueError, "Invalid nargout!"
这是“明确优于隐式”作为一个Python哲学的例子。 如果你想两个参数时,你必须明确地说要两个参数了。 决胜盘隐基于展望未来,看看将要与结果在Python不鼓励做了。 这是完全可以做到a = f(x)
并希望在获得两个元素的元组。
对于像你这样的例子,有很多更好的方法。 一个是只是mean, std = a.mean(), a.std()
或者更一般x, y = someFunc(a), otherFunc(a)
。 如果值的这种特殊的组合通常需要,并有由你不想重复这两个操作分享了一些昂贵的计算,做出第三个功能明确同时返回并做x, y = funcThatReturnsTwoThings(a)
。 所有这些都是保持,如果他们做不同的事情功能分开的明确方式。
我不能说nargout
在MATLAB,因为我不知道,我不能想象应该如何正确使用。 然而,你可能想改变你浏览一下Python函数(或方法)确实)。
事实上,Python的总是返回一个值。 或者,它是无,或者是某些特定类型的单个值,或者它是一个单一的对象tuple
类型。
如果没有return
的命令,函数返回None
如果函数体结束。 这是一样的,如果你明确写道return
在体温年底不带任何参数,或者return None
在身体的末端。
如果使用return None
(在None
可以存储在一个变量)或return
无参数, None
是returne给调用者。
如果你return single
,该single
对象返回给调用者。
如果return v1, v2, v3
,你实际上返回一个元组(v1, v2, v3)
它只是你不需要写括号中有语法糖。
的result1, result2, result3 = f()
的情况下仅仅是另一个语法糖。 的f()
返回的元组和它的元素自动提取给定的变量。 您真正做到:
result1, result2, result3 = (v1, v2, v3)
要么
t = f() # where t is the (v1, v2, v3)
result1, result2, result3 = t
实际上,Python中不允许定义输出参数,因为它是在其他语言中常用的。 你可以认为你是路过的说法对象的地址条件,如果传递的对象允许修改,你可以修改它。 但你永远无法得到新的结果给了一个最初传入的参数None
值,例如。 您不能分配通过函数的输出参数一个Python变量 - 就像在Python的机制。
从函数内部返回新创建的值(对象)的唯一自然和直接的方式是利用return
命令。 然而,Python的功能不限制你多少个参数可以返回。 (当然,总是单独一个可在以后破碎的元件,如果它是一个元组。)
如果你想在调用者代码来测试什么实际返回,您可以编写自己的函数,它的情况下,一些特别的东西在那里被送回以下值: None
, single
,一些长度(一个元组len(t)
可以使用得到的元素在返回的元组的数量t
)。 您的功能还可以测试的类型single
或的每一个元组的元素,并相应地工作。
在Matlab中,输出参数的数目实际上是输入到功能之一。 这不是在Python的情况下,所以你已经设置了函数的接口以不同的方式反映了这一点。
例如,下面是适用上()的一组字符串的功能,并且用户可以预期的输入的数目等于输出的数量。 语法也很相似,Matlab的。
>>> def var_returns_f(*args):
... return [str.upper() for str in args]
...
>>>
>>> a, b = var_returns_f('one', 'two')
>>>
>>> a
'ONE'
>>> b
'TWO'
我倾向于做的就是我的函数返回的一切(作为一个元组的元素),那么只有解开我需要的:
def my_func():
# do stuff...
return mean, stddev, otherstat, a, b
mu, sig, _, a, _ = myfunc()
这里林回国的一切,但仅分配一日2次和第4个变量,变量,我会在呼叫范围内使用。 该_
变量是充当我不想/需要变量的占位符暴殄天物。
我有一个奇怪的想法...
def nargout():
import traceback
callInfo = traceback.extract_stack()
callLine = str(callInfo[-3].line)
split_equal = callLine.split('=')
split_comma = split_equal[0].split(',')
return len(split_comma)
def fun():
this = nargout()
if this == 1:
return 3
else:
return 3, 4
a = fun()
a, b = fun()
我真的很想念Matlab的现在:d
改进方式:
def nargout(*args):
import traceback
callInfo = traceback.extract_stack()
callLine = str(callInfo[-3].line)
split_equal = callLine.split('=')
split_comma = split_equal[0].split(',')
num = len(split_comma)
return args[0:num] if num > 1 else args[0]
def fun(nparray):
return nargout(np.mean(nparray), np.std(nparray))
arr = np.array([3, 4, 5])
mean = fun(arr)
mean, std = fun(arr)