为什么在函数参数中使用常规?

时间:2012-03-16 18:18:01

标签: python coding-style numpy

我想知道为什么许多函数 - 特别是在numpy中 - 使用元组作为函数参数?

e.g:

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

可能是什么用途?为什么不简单地使用以下内容,因为第一个参数总是表示数组的大小?

a = numpy.ones(10, 5)

是否因为可能有其他参数,例如dtype?即便如此,

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

对我来说似乎比使用复杂的元组约定更清晰。

感谢您的回复

4 个答案:

答案 0 :(得分:3)

因为你希望能够做到:

a = numpy.ones(other_array.shape)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

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'

答案 3 :(得分:0)

为了让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不接受任何关键字。