【问题标题】:Why tuple convention in function parameters?为什么在函数参数中使用元组约定?
【发布时间】:2012-03-16 18:18:00
【问题描述】:

我想知道为什么许多函数(尤其是在 numpy 中)使用元组作为函数参数?

例如:

a = numpy.ones( (10, 5) )

这可能有什么用?为什么不简单地使用以下内容,因为显然第一个参数将始终表示数组的大小?

a = numpy.ones(10, 5)

是不是因为可能有额外的参数,比如dtype?即便如此,

a = numpy.ones(10, 5, dtype=numpy.int)

对我来说似乎比使用卷积元组约定要干净得多。

感谢您的回复

【问题讨论】:

  • 元组在这些数字将一起传递的情况下是有意义的——有效地,作为一个单一的值——或者可以合理地期望调用者希望以这种方式对待它们。
  • 请注意,NumPy 并不完全一致:ndarray.reshape 采用可变数量的参数它们的元组。
  • @larsmans - 没错,但不管它值多少钱,我很确定这是一个相对较新的变化(~1.3,也许?)。我绝对记得必须明确地使用x.reshape((nrows, ncols)) 而不是x.reshape(nrows, ncols)

标签: python coding-style numpy


【解决方案1】:

因为你希望能够做到:

a = numpy.ones(other_array.shape)

other_array.shape 是一个元组。有一些功能与此不一致并且按照您的描述工作,例如numpy.random.rand()

【讨论】:

  • 如果np.ones 采用可变数量的参数,np.ones(*other.shape) 会工作得很好,所以这不是全部。
  • @mklauber:对不起,我删除了我的评论,因为我得到了明显的印象,我混淆了这个问题,因为我不知道 numpy 函数是如何工作的。我最初说过os.path.join 的工作方式让我很困扰,因为如果我已经有要加入的路径名列表,我必须说os.path.join(*args)。对我来说,使用列表或数组作为函数参数似乎比使用可变数量的参数更合适,因为我要求函数处理一个相同类型的项目列表。也与str.join一致。
  • np.ones(*other.shape) 不适用于采用多个参数的函数。显式传递单个参数允许该函数将相同的参数传递给其他函数。
【解决方案2】:

我认为这样做的好处之一是它可以导致各种方法之间的一致性。我对 numpy 不太熟悉,但在我看来,第一个想到的用例是,如果 numpy 可以返回数组的大小,那么该大小作为一个变量,可以直接传递给另一个 numpy 方法,无需了解该尺寸项目的内部构造。

它的另一部分是数组的大小可能有两个分量,但它被讨论为一个值,而不是两个。

【讨论】:

    【解决方案3】:

    我的猜测:这是因为在 np.onesshape 这样的函数中,当它是单个值时,它可以作为关键字参数传递。试试

    np.ones(dtype=int, shape=(2, 3))
    

    请注意,您获得的值与您从 np.ones((2, 3), dtype=int) 获得的值相同。

    [这在 Python 中更普遍:

    >>> def f(a, b):
    ...     return a + b
    ... 
    >>> f(b="foo", a="bar")
    'barfoo'
    

    ]

    【讨论】:

    • 这是最好的答案,不可能是一致性 - 其他函数确实使用可变数量的参数。
    【解决方案4】:

    为了让 python 区分 foo(1, 2)foo(1, dtype='int')foo(1, 2, dtype='int'),您必须使用在 python 3 之前才正式引入的纯关键字参数。可以使用 **kargs在 python 2.x 中实现仅关键字参数,但它不自然并且看起来不像 Pythonic。我认为出于这个原因array 不允许array(1, 2)reshape(1, 2) 可以,因为reshape 不接受任何关键字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-09
      • 2011-01-17
      • 1970-01-01
      • 2023-03-24
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多