I was wondering if there was a function built into Python that can determine the distance between two rational numbers but without me telling it which number is larger.
e.g.
>>>distance(6,3)
3
>>>distance(3,6)
3
Obviously I could write a simple definition to calculate which is larger and then just do a simple subtraction:
def distance(x, y):
if x >= y:
result = x - y
else:
result = y - x
return result
but I’d rather not have to call a custom function like this.
From my limited experience I’ve often found Python has a built in function or a module that does exactly what you want and quicker than your code does it. Hopefully someone can tell me there is a built in function that can do this.
asked Nov 28, 2012 at 9:47
abs(x-y)
will do exactly what you’re looking for:
In [1]: abs(1-2)
Out[1]: 1
In [2]: abs(2-1)
Out[2]: 1
answered Nov 28, 2012 at 9:49
NPENPE
483k107 gold badges943 silver badges1007 bronze badges
1
Although abs(x - y)
and equivalently abs(y - x)
work, the following one-liners also work:
-
math.dist((x,), (y,))
(available in Python ≥3.8) -
math.fabs(x - y)
-
max(x - y, y - x)
-
-min(x - y, y - x)
-
max(x, y) - min(x, y)
-
(x - y) * math.copysign(1, x - y)
, or equivalently(d := x - y) * math.copysign(1, d)
in Python ≥3.8 -
functools.reduce(operator.sub, sorted([x, y], reverse=True))
All of these return the euclidean distance(x, y).
answered Oct 16, 2016 at 20:23
AsclepiusAsclepius
56.3k17 gold badges163 silver badges142 bronze badges
1
Just use abs(x - y)
. This’ll return the net difference between the two as a positive value, regardless of which value is larger.
answered Nov 28, 2012 at 9:49
Chris HealdChris Heald
61.1k10 gold badges122 silver badges137 bronze badges
0
If you have an array, you can also use numpy.diff
:
import numpy as np
a = [1,5,6,8]
np.diff(a)
Out: array([4, 1, 2])
Asclepius
56.3k17 gold badges163 silver badges142 bronze badges
answered Nov 15, 2016 at 9:09
G MG M
20.3k10 gold badges81 silver badges83 bronze badges
So simple just use abs((a) – (b)).
will work seamless without any additional care in signs(positive , negative)
def get_distance(p1,p2):
return abs((p1) - (p2))
get_distance(0,2)
2
get_distance(0,2)
2
get_distance(-2,0)
2
get_distance(2,-1)
3
get_distance(-2,-1)
1
answered Nov 11, 2019 at 16:13
Siva SSiva S
7426 silver badges12 bronze badges
use this function.
its the same convention you wanted.
using the simple abs feature of python.
also – sometimes the answers are so simple we miss them, its okay 🙂
>>> def distance(x,y):
return abs(x-y)
answered Nov 28, 2012 at 9:49
Inbar RoseInbar Rose
41.3k24 gold badges83 silver badges130 bronze badges
0
This does not address the original question, but I thought I would expand on the answer zinturs gave. If you would like to determine the appropriately-signed distance between any two numbers, you could use a custom function like this:
import math
def distance(a, b):
if (a == b):
return 0
elif (a < 0) and (b < 0) or (a > 0) and (b > 0):
if (a < b):
return (abs(abs(a) - abs(b)))
else:
return -(abs(abs(a) - abs(b)))
else:
return math.copysign((abs(a) + abs(b)),b)
print(distance(3,-5)) # -8
print(distance(-3,5)) # 8
print(distance(-3,-5)) # 2
print(distance(5,3)) # -2
print(distance(5,5)) # 0
print(distance(-5,3)) # 8
print(distance(5,-3)) # -8
Please share simpler or more pythonic approaches, if you have one.
answered Nov 19, 2017 at 16:17
phiphi
2933 silver badges4 bronze badges
4
If you plan to use the signed distance calculation snippet posted by phi (like I did) and your b might have value 0, you probably want to fix the code as described below:
import math
def distance(a, b):
if (a == b):
return 0
elif (a < 0) and (b < 0) or (a > 0) and (b >= 0): # fix: b >= 0 to cover case b == 0
if (a < b):
return (abs(abs(a) - abs(b)))
else:
return -(abs(abs(a) - abs(b)))
else:
return math.copysign((abs(a) + abs(b)),b)
The original snippet does not work correctly regarding sign when a > 0 and b == 0.
answered May 23, 2018 at 16:40
abs function is definitely not what you need as it is not calculating the distance. Try abs (-25+15) to see that it’s not working. A distance between the numbers is 40 but the output will be 10. Because it’s doing the math and then removing “minus” in front. I am using this custom function:
def distance(a, b):
if (a < 0) and (b < 0) or (a > 0) and (b > 0):
return abs( abs(a) - abs(b) )
if (a < 0) and (b > 0) or (a > 0) and (b < 0):
return abs( abs(a) + abs(b) )
print distance(-25, -15)
print distance(25, -15)
print distance(-25, 15)
print distance(25, 15)
answered Nov 15, 2016 at 14:36
3
You can try:
a=[0,1,2,3,4,5,6,7,8,9];
[abs(x[1]-x[0]) for x in zip(a[1:],a[:-1])]
answered Apr 8, 2014 at 19:35
Для ввода значений с клавиатуры используем функцию input(“…”) с соответствующей подсказкой
Для для нахождения остатка от деления используется оператор –
Для обработки целых значений делимого и делителя (x и y) подойдёт следующая программа:
x=int(input(“Уменьшаемое X=”))
y=int(input(“Вычитаемое Y=”))
print(f’Разность X-Y={x-y}’)
Результат выполнения:
Уменьшаемое X=25
Вычитаемое Y=8
Разность X-Y=17
Если x и y могут быть десятичными числами, то код программы будет таким:
x=float(input(“Уменьшаемое X=”))
y=float(input(“Вычитаемое Y=”))
print(f’Разность X-Y={x-y}’)
Пример выполнения
Уменьшаемое X=25.5
Вычитаемое Y=8.3
Разность X-Y=17.2
В этом руководстве мы будем работать с двумя типами данных в Python – целыми числами (integer) и числами с плавающей точкой (floats):
- Целые – числа без дробной части, которые могут быть положительными, отрицательными или нулём (…, -1, 0, 1, …).
- С плавающей точкой – это числа, содержащие десятичную точку (например, 9.0 или -2.25).
В этой статье будут описаны операции с числовыми типами данных в Python.
- Математические операторы Python 3
- Сумма в питоне и разность в питоне
- Унарные арифметические операции Python
- Умножение и деление в питоне
- Деление с остатком Python
- Возведение в степень Python
- Приоритет операторов
- Операторы присваивания Python
- Заключение
Оператор – это символ, которая обозначает операцию. Например, в математике знак плюса или + – это оператор сложения.
Мы рассмотрим схожие операторы, которые перешли в Python из математики. Но другие операторы специфичны именно для программирования.
Ниже представлена таблица с кратким обзором математических операторов, доступных в Python.
Операция | Возвращаемое значение |
x + y | Сумма x и y. |
x – y | Разность x и y. |
-x | Изменение знака x. |
+x | Тождественность x. |
x * y | Произведение x и y. |
x / y | Частное от деления x на y. |
x // y | Частное от целочисленного деления x на y. |
x % y | Остаток от деления x / y. |
x ** y | x в степени y. |
В Python операторы суммы и разности выполняют те же операции, что и в математике. Поэтому вы можете использовать этот язык программирования как калькулятор.
Рассмотрим некоторые примеры. Начнём с целых чисел:
Вывод
Вместо передачи целых чисел напрямую в функцию print
мы можем инициализировать переменные для этих значений:
a = 88 b = 103 print(a + b)
Вывод
Целые числа могут быть как положительными, так и отрицательными. Поэтому можно добавлять отрицательные числа к положительным:
c = -36 d = 25 print(c + d)
Вывод
Прибавление работает аналогично и с числами с плавающей запятой:
e = 5.5 f = 2.5 print(e + f)
Вывод
Синтаксис разности тот же, что и для прибавления, за исключением того, что вместо оператора сложения (+
) необходимо использовать оператор вычитания (-
):
g = 75.67 h = 32 print(g - h)
Вывод
В этом примере мы вычитаем целое число из числа с плавающей точкой. Python возвратит число с плавающей точкой, если хотя бы одно из чисел выражения является числом с плавающей точкой.
Унарное математическое выражение состоит из одного элемента. Знаки плюса и минуса в питоне могут быть использованы как единичный оператор, чтобы вернуть тождественное значение (+) или сменить знак числа (-).
Знак плюса означает тождественное значение. Мы можем использовать его с положительными значениями:
Вывод
Когда мы используем знак плюса с отрицательным значением, он также вернёт значение тождественное данному. В этом случае он вернёт отрицательное значение:
Вывод
При использовании с отрицательным значением знак плюса возвращает то же отрицательное значение.
Минус (в отличие от знака плюса) изменяет знак числа. Поэтому при передаче положительного числа мы получим отрицательное значение:
Вывод
А когда мы используем минус в качестве унарного оператора с отрицательным значением, будет возвращено положительное число:
Вывод
Унарные арифметические операторы возвращают тождественное значение в случае с +i, или противоположное по знаку число в случае с -i.
Оператор, которые мы будем использовать в Python для умножения «*», а для деления «/». Пример умножения двух чисел с плавающей точкой в Python:
k = 100.1 l = 10.1 print(k * l)
Вывод
Когда вы выполняете деление в Python 3, частное всегда будет числом с плавающей точкой, даже если вы используете два целых числа:
m = 80 n = 5 print(m / n)
Вывод
Это одно из наиболее существенных отличий Python 2 от Python 3. В Python 3 результатом будет дробное число. Поэтому, когда вы используете оператора «/» для деления 11 на 2, возвращено будет 5.5. В Python 2 возвращаемое значение деления 11 / 2 было 5.
В Python 2 оператор «/» выполняет целочисленное деление, где частное x, а возвращаемое число – это наибольшее целое число, меньшее или равное x. Если вы выполните пример, приведённый выше, в Python 2, то получите 16 без десятичной точки.
Целочисленное деление python 3 использует оператор «//». Выражение 100 // 40 вернёт значение 2.
Оператор % используется для деления по модулю, и возвращает остаток от деления, а не частное. Это полезно, например, для нахождения множителей числа.
Деление по модулю Python (с остатком) – пример:
o = 85 p = 15 print(o % p)
Вывод
В этом примере 85 делится на 15. Результат – 5 с остатком 10. Значение 10
выводится, поскольку оператор возвращает остаток от деления.
Если мы используем два числа с плавающей точкой для деления по модулю, число с плавающей точкой будет возвращено в качестве остатка:
q = 36.0 r = 6.0 print(o % p)
Вывод
В приведенном выше примере 36.0 делится на 6.0 без остатка, поэтому возвращается значение 0.0.
Оператор «**» в Python используется для возведения числа, расположенного слева от оператора в степень, указанную справа. То есть, в выражении 5 ** 3, число 5 возводится в третью степень.
В математике часто используется выражение 5³. То есть 5 умножается на себя три раза. В Python мы получим тот же результат (125) выполнив 5 ** 3 или 5 * 5 * 5.
Пример с переменными:
s = 52.25 t = 7 print(s ** t) 1063173305051.292
Возведение числа с плавающей точкой 52.25 в степень 7 с помощью оператора ** приводит к выводу большого числа с плавающей точкой.
Операторы Python выполняются в порядке приоритета. Посмотрим на следующее выражение:
Умножение выполняется первым. Поэтому, если мы вызовем метод print(u)
, то получим следующее значение:
Вывод
Это потому, что 10 * 5
равно 50
, а затем мы прибавляем 10
, чтобы получить 60
.
Если нужно было сложить 10
и 10
, и умножить сумму на 5
, то пришлось бы использовать скобки, как в математике:
u = (10 + 10) * 5 print(u)
Вывод
Оператор «=» присваивает значение, расположенное справа, переменной слева. Например, v = 23 присваивает значение числа 23 переменной v.
В программировании часто используют составные операторы присваивания. Они соединяют арифметический оператор с оператором «=». Поэтому для сложения мы используем оператор «+» с оператором «=», чтобы получить составной оператор «+=». Пример:
Вывод
Сначала мы задаём переменной w
значение 5
. Затем используем составной оператор присваивания +=
, чтобы прибавить число справа, к переменной, расположенной слева, и присвоить результат переменной w
.
Составные операторы присваивания часто используются в циклах for:
for x in range (0, 7): x *= 2 print(x)
Вывод
При помощи for можно автоматизировать процесс использования оператора «*=»
. Он умножает переменную w
на число 2
, а затем присваивает полученный результат переменной w
для следующей итерации цикла.
В Python предусмотрен составной оператор присваивания для каждой арифметической операции:
y += 1 # добавить число и присвоить результат y -= 1 # отнять число и присвоить результат y *= 2 # умножить на число и присвоить результат y /= 3 # разделить на число и присвоить результат y // = 5 # разделить без остатка на число и присвоить результат y **= 2 # возвести в степень и присвоить результат y %= 3 # вернуть остаток от деления и присвоить результат
Составные операторы присваивания полезны в тех случаях, когда переменная должна увеличиваться или уменьшаться с помощью инкремента. А также когда необходимо автоматизировать некоторый процесс в создаваемой программе.
В этой статье рассмотрены операторы, которые используются для математических операций с целыми и дробными десятичными числами.
script1adsense2code
script1adsense3code
Python Basic: упражнение 16 с решением
Напишите программу на Python, чтобы получить разницу между заданным числом и 17, если число больше 17, верните двойную абсолютную разницу.
Синтаксис Python if-else :
если условие: indentedStatementBlockForTrueCondition еще: indentedStatementBlockForFalseCondition
Эти блоки операторов могут иметь любое количество операторов и могут включать в себя любые операторы.
Иллюстрированная презентация:
Пример решения : –
Код Python:
def difference(n):
if n <= 17:
return 17 - n
else:
return (n - 17) * 2
print(difference(22))
print(difference(14))
Пример вывода:
10 3
Блок – схема:
Визуализируйте выполнение кода Python:
Следующий инструмент визуализирует, что компьютер делает шаг за шагом при выполнении указанной программы:
Редактор кода Python:
Есть другой способ решить это решение? Внесите свой код (и комментарии) через Disqus.
Предыдущий : Напишите программу на Python, чтобы получить объем сферы с радиусом 6.
Далее : Напишите программу на Python, чтобы проверить, находится ли число в пределах 100 от 1000 или 2000.
Каков уровень сложности этого упражнения?
Новый контент: Composer: менеджер зависимостей для PHP , R программирования
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
Коллеги, прошу совета. Дан список из float
. Список может быть большой – миллионы элементов. Мы берем каждый элемент списка и проверяем каждый следующий элемент на разницу между ними. Как только абсолютное значение разницы равно или превышает заранее заданную величину мы заводим флаг в специально подготовленный список, который показывает – получили мы положительную или отрицательную разницу либо мы достигли конца списка, но условия не достигли.
Очевидное, но “тупое” решение данной задачи:
float_list = [1.0, 2.0, 3.0, 6.0, 3.0, 1.0]
flag_list = []
lim = 2 # значение 0 невозможно
for i in range(len(float_list)-1):
for j in range(i+1, len(float_list)):
if abs(float_list[j]-float_list[i]) >= lim:
if float_list[j]-float_list[i] > 0:
flag_list.append(1)
else:
flag_list.append(-1)
break
else:
flag_list.append(0)
flag_list.append(0) # для последнего элемента условие никогда не выполнится
print(float_list)
print(flag_list)
Также я пытался применить map
, также пытался конвертировать в pandas.Series
и применять apply
. Все это – очень долго.
Отсюда вопрос – возможно, вы подскажете какое-то изящное решение, которое от меня ускользает, чтобы эта задача не превращалась в тупой перебор. Особенно, учитывая, что условие может не выполнится, а это значит, что мы вынуждены будем перелопачивать весь список до конца.
UPD.
Из комментариев стало понятно, что есть ряд неясных моментов.
Проясняю:
- Все входные данные положительные
- Входные данные хаотичны и могут повторяться
- Последовательность данных важна
- Конечной целью задачи является – присвоить каждому из элементов списка флаг с соответствующим знаком – нашли мы ПОСЛЕ текущего элемента, другой элемент, который отличается на lim в большую или меньшую сторону.
- Важно какая разница встретилась первой – положительная или отрицательная – в зависимости от знака первой разницы, соответствующей условию, мы выставляем положительный или отрицательный флаг.
Благодарю!