Обмен значений двух переменных
Данная программа принимает от пользователя два значения и записывает каждое из них в отдельную переменную. Затем она меняет местами значения этих переменных без ввода временной переменной.
Решение задачи
- Пользователь вводит два значения, которые записываются в две разные переменные.
- Значения двух переменных складываются и результат сложения записывается в первую переменную.
- Далее из первой переменной вычитается вторая переменная и результат записывается во вторую переменную.
- Затем из первой переменной вычитаем вторую (с уже обновленным значением) и записываем полученный результат в первую переменную.
- Выводим полученные значения.
- Конец.
Исходный код программы
Ниже приведен исходный код программы по замене значений двух переменных без использования третьей переменной. Далее также будет приведен результат работы этого кода.
a = int(input("Введите значение первой переменной: ")) b = int(input("Введите значение второй переменной: ")) a = a + b b = a - b a = a - b print("a это:", a, " b это:", b)
Объяснение работы программы
- Пользователь вводит значение двух переменных и они записываются в переменные а и b .
- В переменную а записывается сумма а и b .
- В переменную b записывается разность переменной а (в которой сейчас находится сумма первоначальных значений a и b ) и переменной b . Таким образом первоначально введенное значение переменой a перешло в переменную b .
- Теперь вычитаем из переменной a (где сейчас по-прежнему находится сумма первоначально введенных величин) текущее значение переменной b (которое первоначально было записано в переменную a ). Таким образом в переменной a остается только значение, которое в начале программы было записано в переменную b .
- И далее выводим полученные значения на экран.
Результаты работы программы
Case 1 Введите значение первой переменной: 3 Введите значение второй переменной: 5 a это: 5 b это: 3 Case 2 Введите значение первой переменной: 56 Введите значение второй переменной: 25 a это: 25 b это: 56
Примечание переводчика
Все что было описано выше (в пунктах 2, 3, 4), в языке Python можно сделать в одну строчку. И это одно из основных достоинств этого языка программирования.
a=int(input("Введите значение первой переменной: ")) b=int(input("Введите значение второй переменной: ")) a, b = b, a # собственно здесь и происходит обмен значениями print("a это:",a," b это:",b)
Обмен значениями переменных в Питоне
Забавно иногда открывать для себя лаконичные способы делать что-то в синтаксисе нового языка. Сегодня возникла нужда поменять значения двух переменных, и я подумал, что традиционный способ:
temp = x x = y y = temp
. слишком длинен. Не может быть, чтобы в Питоне не было чего-нибудь покороче.
В Питоне есть тип данных, который называется «tuple» (и который в руском языке должен называться «кортеж» — слово, возможно знакомое тем, кто изучал в институте высшую математику и что-то помнит из тех времен). По сути он представляет собой пачку любых значений в определенном порядке, с которой можно работать, как с единым целым, например в функцию передать:
x = (1, 'abc', 3) # tuple some_func(x)
С этими кортежами связана интересная особенность оператора присваивания. Он может автоматически распаковывать и запаковывать несколько значений в кортежи и обратно:
x, y, z = (1, 2, 3) # x = 1, y = 2, z = 3 t = 1, 2, 3 # t = (1, 2, 3)
Вот это мне и приглянулось для обмена значениями. Выглядит, по-моему, просто чудесно:
x, y = y, x
Комментарии: 20
Homo-Adminus
Насколько я помню, в перле всегда была такая возможность 🙂
($x, $y) = ($y, $x); Очень часто еще используют аналогичные схемы для заполнения набора переменных значениями из кусочков строки:
($x, $y, $x) = split /какой-нить разделитель/;
а как насчет массивов? 🙂
в перле очень похож обме на листы:
($x, $y) = ($y, $x);
Homo-Adminus
Осталось еще, чтобы ПХПшники прибежали и начали свои варианты предлагать 🙂
А потом можно будет организовать проект по поиску самых красивых/лаконичных/етс методов обмена значениями переменных.
Я буду за ПХПшника 🙂 list($a, $b) = array($b, $a);
Кстати, насчёт ПХПшников. Я показал своим коллегам эту возможность и они тут же ответили мне:
list($b, $a) = array($a, $b); Это просто ужасно! =) Кстати, вот приём на Python’e, до которого я сам дошёл. cursor.fetchall() возвращает словарь. В моём случае он выглядел так: нужно было получить список [«www.somesite.com», «www.ya.ru», «www.rambler.ru»]
вот строчка из программы: return [link[«ref_link»] for link in cur.fetchall()]
2MkDir
я вот как-то очень сильно не понимаю, как в питоне можно создать словарь c несколькими значениями под одним ключом.
>>> a = ; >>> a >>>
можно это как-то разъяснить?
кроме того for link in <. >будет перебирать ключи словаря. ключ словаря в данном случае — строка. потом с этой строкой сделать сделать link[«ref_link»] — никак нельзя, потому как «string indices must be integers».
Есть универсальный для всех языков метод через xor 🙂 a ^= b
b ^= a
a ^= b Описание:
http://wikisource.org/wiki/XOR_swap_algorithm
fetchall() всегда возвращает список (точнее кортеж). В зависимости от настройки это либо список словарей, либо список списков.
Т.е. не
а
(, < “ref_link”: “www.ya.ru”>, < “ref_link”: “www.rambler.ru”>)
Причем это поведение не по умолчанию, а по умолчанию fetchall() возвращает список списка:
(( “www.somesite.com”, ), ( “ref_link”: “www.ya.ru”, ), ( “ref_link”: “www.rambler.ru”, ))
наблюдатель
2Merle
А для строк? или вообще для нецелочисленных 😉
2наблюдатель
Не вижу проблемы. Строка — такая же последовательность 0 и 1, которую также можно несколько раз xor.
Осталось еще, чтобы ПХПшники прибежали и начали свои варианты предлагать 🙂
А можем и предложить. И покрасивее!
$a = $b + ($b=$a)*0;
Прошу заметить, что ничего не надо «автоматически распаковывать и запаковывать».
наблюдатель
2Merle
Это не меняет сути — метод универсален только для целочисленных типов. Возьмите float’ы, object’ы или язык/тип, где строка является последовательностью символов, а не байтов. Метод работать не будет (а ведь именно универсальность Вы подчеркивали).
2наблюдатель
Вы очень серьезно восприняли мою шутку об универсальности.
🙂 данный метод я привел скорее в качестве забавного и универсального на низком уровне примера.
понятно, что с его помощью можно реализовать и посимвольный обмен строк. Криво, но можно.
Но в общем-то использование этого метода в 99% задач неоправдано. В той же статье на Википедии на которую я давал ссылку написано что «However on modern (desktop) CPUs, the XOR technique is considerably slower than using a temporary variable to do swapping.»
А можем и предложить. И покрасивее! $a = $b + ($b=$a)*0;
Прошу заметить, что ничего не надо “автоматически распаковывать и запаковывать”.
Красиво, но не умеет строки 🙂
Предлагаю альтернативу: $a = @$b . (($b = a) && 0);
$a = @$b . (($b = a) ? » : »);
Обмен значений переменных

Если попытаться сделать такой обмен, сначала присвоив первой переменной значение второй, а второй — значение первой, ничего не получится. Допустим, есть две переменные a и b . При этом a = 5 и b = 6 . Если выполнить выражение a = b , то переменная a будет хранить число 6, также как и b . Число 5 будет утеряно. После этого выражение b = a теряет смысл, так как b будет присвоено его же текущее значение. В данном случае 6.
Поэтому в программировании при обмене значений переменных обычно вводят третью, играющую роль буфера (буферная переменная). В ней сохраняют значение первой переменной, потом первой присваивают значение второй, a новое значение для второй берут из буфера.
Таким образом классический алгоритм обмена значений двух переменных выглядит так:
a = 5 b = 6 buf = a a = b b = buf
Полная версия программы, которая запрашивает ввод двух значений с клавиатуры:
a = input('a: ') b = input('b: ') buf = a a = b b = buf print('a =', a) print('b =', b)
Пример выполнения программы:
a: 91 b: 162 a = 162 b = 91
Есть другой способ, позволяющий не использовать третью переменную, — арифметический. Он подходит только для чисел.
a = 5 b = 7 a = a + b # 12 b = a - b # 12-7=5 a = a - b # 12-5=7
a = int(input('a: ')) b = int(input('b: ')) a = a + b b = a - b a = a - b print('a =', a) print('b =', b)
Третий вариант — использовать имеющееся в Python множественное присваивание. При этом обмен значений переменных выполняется одной строкой кода:
>>> a = 10 >>> b = 20 >>> a, b = b, a >>> a 20 >>> b 10
Почему такое возможно? В Питоне есть такая структура данных как кортеж.
При выполнении a, b = b, a интерпретатор Python сначала получает значения связанные с переменными b и a (правая часть) и помещает их в кортеж, в данном случае получится (10, 20) . После этого он связывает каждый элемент кортежа в определенной позиции с переменными в той же позиции, но расположенными слева.
Таким образом можно поменять значения не только двух переменных, также трех и более. Кроме того в Python можно обменивать значения переменных разных типов. Это связано с тем, что тип данных в Питоне привязан не к переменной, а к значению:
>>> a = 14 >>> b = 18 >>> c = 16 >>> a,b,c = c,a,b >>> a,b,c (16, 14, 18) >>> d = 4.56 >>> e = "hi" >>> d,e = e,d >>> d 'hi' >>> e 4.56
X Скрыть Наверх
Решение задач на Python
Ошибка сервера в приложении ‘/’.
Описание: На сервере возникла ошибка приложения. Текущая пользовательская настройка ошибок для этого приложения не позволяет удаленно просматривать сведения об ошибке данного приложения (из соображений безопасности). Однако, сведения можно просматривать в браузерах, запущенных на локальном сервере.
Сведения: Для разрешения просмотра сведений данного сообщения об ошибке на локальном сервере создайте тег в файле конфигурации «web.config», который находится в корневом каталоге текущего веб-приложения. В теге следует задать атрибут «mode» со значением «Off».
Примечания: Отображаемую в данный момент страницу ошибок можно заменить на пользовательскую страницу ошибок, изменив атрибут «defaultRedirect» тега конфигурации приложения таким образом, чтобы он содержал URL-адрес пользовательской страницы ошибок.