Есть ли Python альтернатива для len, которая возвращает 1 для простого float - PullRequest
0 голосов
/ 05 февраля 2020

Есть ли способ в Python, чтобы функция len(x) (или любая подобная функция) возвращала 1, если x - это простое число с плавающей точкой?

В моем случае, у меня есть x в качестве входного параметра для функции, и я хочу сделать его устойчивым к (NumPy) входам типа массива x, а также к простому скалярному вводу с плавающей запятой x. В функции используется функция len(x), но она выдает ошибку object of type 'float' has no len(), если x является плавающей точкой, тогда как я хочу, чтобы она возвращала 1. Конечно, я могу написать оператор if, но я чувствую, что там должно быть более короткое решение.

def myfunc(x):
    y=np.zeros((5,len(x)))
    y[1,:]=x
    ....
    return y

1 Ответ

0 голосов
/ 05 февраля 2020

Нет, встроенной функции, подобной этой, не существует.

Один из основных аспектов разработки Python заключается в том, что она строго типизирована , что означает, что значения неявно приведен от одного типа к другому. Например, вы не можете сделать 'foo' + 3, чтобы сделать строку 'foo3'; Вы должны написать 'foo' + str(3), чтобы явно преобразовать int в str, чтобы использовать конкатенацию строк. Поэтому наличие встроенных операторов или функций, которые могут обрабатывать скалярное значение, как если бы оно представляло собой последовательность длиной 1, нарушало бы принцип строгой типизации.

Это контрастирует со слабо типизированными языками, такими как Javascript и PHP, где приведение типов осуществляется с мыслью, что программисту не нужно так много думать о типах данных и о том, как они преобразуются; на практике, если вы пишете на этих языках, вам все равно приходится думать о типах и преобразованиях, вы просто должны знать, какие преобразования выполняются или не выполняются неявно.

Итак, в Python, если если вы хотите, чтобы функция работала с несколькими различными типами данных, вам нужно либо выполнить преобразование явно (например, if isinstance(x, float): x = np.array([x])), либо использовать только те операции, которые поддерживаются каждым типом данных, который принимает ваша функция (например, duck набрав ).

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