Зачем использовать кортеж в параметрах функции? - PullRequest
4 голосов
/ 16 марта 2012

Мне было интересно, почему многие функции, особенно в numpy, используют кортежи в качестве параметров функции?

например:.

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

Что может быть полезным для этого? Почему бы просто не иметь что-то вроде следующего, поскольку ясно, что первые параметры всегда будут обозначать размер массива?

a = numpy.ones(10, 5)

Это потому, что могут быть дополнительные параметры, такие как dtype? даже если так,

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

кажется мне намного чище, чем использование соглашения об извилистых кортежах.

Спасибо за ваши ответы

Ответы [ 4 ]

3 голосов
/ 16 марта 2012

Поскольку вы хотите иметь возможность:

a = numpy.ones(other_array.shape)

и other_array.shape - это кортеж.Есть несколько функций, которые не соответствуют этому и работают так, как вы описали, например, numpy.random.rand()

2 голосов
/ 16 марта 2012

Мое предположение: это потому, что в таких функциях, как 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'

]

2 голосов
/ 16 марта 2012

Я думаю, что одним из преимуществ этого является то, что оно может привести к согласованности между различными методами.Я не очень знаком с numpy, но мне кажется, что первый случай использования, который приходит на ум, - это если numpy может возвращать размер массива, этот размер, как одна переменная, может быть напрямую передан другому numpy методу,без необходимости знать что-либо о внутренностях того, как этот элемент размера построен.

Другая часть этого состоит в том, что размер массива может иметь два компонента, но это обсуждается как одно значение, а не как два.

0 голосов
/ 16 марта 2012

Чтобы 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 не принимает никаких ключевых слов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...