Предположим, у меня есть
def distance2(vector1, vector2):
zipped = zip(vector1, vector2)
difference2 = [(vector2 - vector1) ** 2 for (vector1, vector2) in zipped]
return sum(difference2)
где distance2(vector1, vector2)
находит (квадрат) евклидово расстояние между vector1
и vector2
. Функция будет работать для итерируемых элементов, но предположим, что мы также хотим, чтобы она работала и для неитерируемых элементов (т. е. distance2(1,3)
). Есть ли питонический способ сделать это? (т. е. автоматически превращая обычный ввод в одноэлементный список).
@chepner, я согласен, хотя некоторые встроенные функции работают так, например. max()
принимает итерируемый или несколько аргументов
@Chris_Rands Разница в том, что max
не работает в зависимости от типа своего первого аргумента; он принимает решение на основе того, какие позиционные аргументы много он получает. Если он получает только один, он предполагает, что это итерируемый объект. Рассмотрим ошибку, которую вы получаете с чем-то вроде max(1)
.
Выполнение теста внутри функции увеличивает нагрузку на каждый звонок до distance2
, даже если аргументы на самом деле являются итерируемыми.
Вы можете использовать numpy:
np.atleast_1d(1)
# array([1])
np.atleast_1d([1,2,3])
# array([1,2,3])
Не надо. Всем заинтересованным будет намного проще, если звонящий просто напишет
distance([1], [2])
.