nargout在Python(nargout in Python)

2019-07-17 19:35发布

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化的方式? 还是哈克的方式?

Answer 1:

该功能可以不知道是怎么回事要与返回值完成的,因此它无法知道有多少是必要的。 你可以做的是通过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) 。 所有这些都是保持,如果他们做不同的事情功能分开的明确方式。



Answer 2:

我不能说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的功能不限制你多少个参数可以返回。 (当然,总是单独一个可在以后破碎的元件,如果它是一个元组。)

如果你想在调用者代码来测试什么实际返回,您可以编写自己的函数,它的情况下,一些特别的东西在那里被送回以下值: Nonesingle ,一些长度(一个元组len(t)可以使用得到的元素在返回的元组的数量t )。 您的功能还可以测试的类型single或的每一个元组的元素,并相应地工作。



Answer 3:

在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'


Answer 4:

我倾向于做的就是我的函数返回的一切(作为一个元组的元素),那么只有解开我需要的:

def my_func():
    # do stuff...
    return mean, stddev, otherstat, a, b

mu, sig, _, a, _ = myfunc()

这里林回国的一切,但仅分配一日2次和第4个变量,变量,我会在呼叫范围内使用。 该_变量是充当我不想/需要变量的占位符暴殄天物。



Answer 5:

我有一个奇怪的想法...

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)


文章来源: nargout in Python