【问题标题】:Python: Can a function return an array and a variable?Python:函数可以返回数组和变量吗?
【发布时间】:2013-10-30 17:04:23
【问题描述】:

有没有简单的方法让函数返回一个 np.array 和一个变量?

例如:

my_array = np.zeros(3)
my_variable = 0.

def my_function():
    my_array = np.array([1.,2.,3.])
    my_variable = 99.
    return my_array,my_variable

my_function()

以便函数中计算的值可以在以后的代码中使用?以上忽略了函数中计算的值。

我尝试返回一个元组 {my_array, my_variable} 但得到了 np.array 的不可散列类型消息

DN

【问题讨论】:

  • 元组用括号写——()——不是大括号——{}
  • 如果要返回一个元组,应该是(my_array, my_variable)。使用大括号返回dict,这要求元素是可散列的,在这种情况下,list 不是。
  • @justhalf:使用不带冒号的花括号会生成set,而不是dict
  • 当前显示的代码没有错误,你只是没有将结果存储在任何地方。
  • @abamert:哎呀,对不起

标签: python arrays function


【解决方案1】:

你的函数是正确的。当你写return my_array,my_variable时,你的函数实际上是返回一个元组(my_array, my_variable)

你可以先把my_function()的返回值赋给一个变量,就是我描述的这个元组:

result = my_function()

接下来,由于您提前知道元组中有多少项,您可以将unpack the tuple 分成两个不同的值:

result_array, result_variable = result

或者你可以一行完成:

result_array, result_variable = my_function()

其他与返回元组、元组解包相关的注意事项:

如果我的函数可以在非异常失败或空情况下返回None,我有时会将这两个步骤分开:

result = my_function()
if result == None:
    print 'No results'
    return
a,b = result
# ...

您可以使用元组的索引来访问指定的项目,而不是解包:

result = my_function()
result_array = result[0]
result_variable = result[1]

如果出于某种原因您有一个 1 项元组:

return (my_variable,)

你可以用同样的(有点尴尬的)单逗号语法来解压它:

my_variable, = my_function()

【讨论】:

    【解决方案2】:

    它没有忽略返回的值,您没有将它们分配给变量。

    my_array, my_variable = my_function()
    

    【讨论】:

    • my_array, my_variable 一个元组。构成元组的是逗号,而不是括号。括号仅在某些消除歧义的地方是必需的,例如在函数调用中。 (它们几乎总是无害的,并且经常使事情更具可读性,即使它们不是必需的——这几乎是 Python 中唯一的地方,在复杂的代数表达式之外,不管怎样,不必要的括号通常值得输入。)
    • 'return tuple' 方法有效,并且是必需的,因为数组比 size=3 示例大得多。谢谢,安迪
    【解决方案3】:

    简单的回答

    my_array, my_variable = my_function()
    

    【讨论】:

      【解决方案4】:

      定义my_function后,使用my_function = np.vectorize(my_function)。
      例如,

      def jinc(x):
          if x == 0.0:
              return 1
          return 2*j1(x)/x
      
      jinc = np.vectorize(jinc)
      

      【讨论】:

      • 这个例子允许x和返回值为numpy数组。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      相关资源
      最近更新 更多