Перейти к содержимому

Как поменять местами переменные в питоне

  • автор:

Обмен значений двух переменных

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

Решение задачи

  1. Пользователь вводит два значения, которые записываются в две разные переменные.
  2. Значения двух переменных складываются и результат сложения записывается в первую переменную.
  3. Далее из первой переменной вычитается вторая переменная и результат записывается во вторую переменную.
  4. Затем из первой переменной вычитаем вторую (с уже обновленным значением) и записываем полученный результат в первую переменную.
  5. Выводим полученные значения.
  6. Конец.

Исходный код программы

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

a = int(input("Введите значение первой переменной: ")) b = int(input("Введите значение второй переменной: ")) a = a + b b = a - b a = a - b print("a это:", a, " b это:", b)

Объяснение работы программы

  1. Пользователь вводит значение двух переменных и они записываются в переменные а и b .
  2. В переменную а записывается сумма а и b .
  3. В переменную b записывается разность переменной а (в которой сейчас находится сумма первоначальных значений a и b ) и переменной b . Таким образом первоначально введенное значение переменой a перешло в переменную b .
  4. Теперь вычитаем из переменной a (где сейчас по-прежнему находится сумма первоначально введенных величин) текущее значение переменной b (которое первоначально было записано в переменную a ). Таким образом в переменной a остается только значение, которое в начале программы было записано в переменную b .
  5. И далее выводим полученные значения на экран.

Результаты работы программы

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-адрес пользовательской страницы ошибок.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *