Как в python выполнять input внутри функции
Перейти к содержимому

Как в python выполнять input внутри функции

  • автор:

Получение пользовательского ввода в Python с input()

Получение и обработка информации — один из важнейших элементов любого языка программирования, особенно если речь идет о получении информации от пользователей.

Python, будучи медленным относительно таких языков, как C или Java, предлагает продвинутые инструменты для получения, анализа и обработки данных от конечного пользователя.

В этом материале речь пойдет о том, какие функции Python можно использовать для этих целей.

Ввод в Python

Для получения информации с клавиатуры в Python есть функции input() или raw_input() (о разнице между ними чуть позже). У них есть опциональный параметр prompt , который является выводимой строкой при вызове функции.

Когда input() или raw_input() вызываются, поток программы останавливается до тех пор, пока пользователь не введет данные через командную строку. Для ввода нужно нажать Enter после завершения набора текста. Обычно Enter добавляет символ новой строки ( \n ), но не в этом случае. Введенная строка просто будет передана приложению.

Интересно, что кое-что поменялось в принципе работе функции между Python 2 и Python 3, что отразилось в разнице между input() и raw_input() . Об этом дальше.

Сравнение функций input и raw_input

Разница между этими функциями зависит от версии Python. Так, в Python 2 функция raw_input() используется для получения ввода от пользователя через командную строку, а input() оценивает ее и попробует запустить как код Python.

В Python 3 от raw_input() избавились, оставив только input() . Она используется для получения ввода пользователя с клавиатуры. Возможности input() из Python 2 в Python 3 работать не будут. Для той же операции нужно использовать инструкцию eval(input()) .

Взгляните на пример функции raw_input в Python 2.

# Python 2 txt = raw_input("Введите что-нибудь, чтобы проверить это: ") print "Это то, что вы только что ввели?", txt 

Вывод

Введите что-нибудь, чтобы проверить это: Привет, мир! Это то, что вы только что ввели? Привет, мир! 

А вот как она работает в Python 3

# Python 3 txt = input("Введите что-нибудь, чтобы проверить это: ") print("Это то, что вы только что ввели?", txt) 

Вывод

Введите что-нибудь, чтобы проверить это: Привет, мир 3! Это то, что вы только что ввели? Привет, мир 3! 

Дальше в материале будет использоваться метод input из Python 3, если не указано другое.

Строковый и числовой ввод

По умолчанию функция input() конвертирует всю получаемую информацию в строку. Прошлый пример продемонстрировал это.

С числами нужно работать отдельно, поскольку они тоже изначально являются строками. Следующий пример показывает, как можно получить информацию числового типа:

# Ввод запрашивается и сохраняется в переменной test_text = input ("Введите число: ") # Преобразуем строку в целое число. # функция float() используется вместо int(), # для преобразования пользовательского ввода в десятичный формат, test_number = int(test_text) # Выводим в консоль переменную print ("Введенное число: ", test_number) 

Вывод

Введите число: 13 Введенное число: 13 

Того же можно добиться и таким образом:

test_number = int(input("Введите число: ")) 

Здесь сразу после сохранения ввода происходит преобразование и присваивание значения переменной.

Нужно лишь отметить, что если пользователь ввел не целое число, то код вернет исключение (даже если это число с плавающей точкой).

Обработка исключений ввода

Есть несколько способов, как можно удостовериться в том, что пользователь ввел корректные данные. Один из них — перехватывать все возможные ошибки, которые могут возникнуть.

Вот такой код считается небезопасным:

test2word = input("Сколько вам лет? ") test2num = int(test2word) print("Ваш возраст ", test2num) 

Запустим его и введем следующее:

Сколько вам лет? Пять 

При вызове функции int() со строкой Пять появится исключение ValueError , и программа остановит работу.

Вот как можно сделать код безопаснее и обработать ввод:

test3word = input("Введите свое счастливое число: ") try: test3num = int(test3word) print("Это правильный ввод! Ваше счастливое число: ", test3num) except ValueError: print("Это не правильный ввод. Это не число вообще! Это строка, попробуйте еще раз.") 

Этот блок оценит ввод. Если он является целым числом, представленным в виде строки, то функция input() конвертирует его в целое число. Если нет, то программа выдаст исключение, но вместо ошибки оно будет перехвачено. В результате вызовется вторая инструкция print .

Вот так будет выглядеть вывод с исключением.

Введите свое счастливое число: Семь Это не правильный ввод. Это не число вообще! Это строка, попробуйте еще раз. 

Такой код можно объединить с другой конструкцией, например, циклом for, чтобы убедиться, что код будет выполняться постоянно, до тех пор, пока пользователь не введет те данные, которые требуются.

Полный пример

# Создадим функцию для демонстрации примера def example(): # Бесконечный цикл, который продолжает выполняться # до возникновения исключения while True: test4word = input("Как вас зовут? ") try: test4num = int(input("Сколько часов вы играете на своем мобильном телефоне?" )) # Если полученный ввод не число, будет вызвано исключение except ValueError: # Цикл будет повторяться до правильного ввода print("Error! Это не число, попробуйте снова.") # При успешном преобразовании в целое число, # цикл закончится. else: print("Впечатляет, ", test4word, "! Вы тратите", test4num*60, "минут или", test4num*60*60, "секунд на игры в своем телефоне!") break # Вызываем функцию example() 

Вывод:

Как вас зовут? Александр Сколько часов вы играете на своем мобильном телефоне? 3 Впечетляет, Александр! Вы тратите 180 минут или 10800 секунд на игры в своем телефоне! 

Выводы

В этой статье вы узнали, как встроенные инструменты Python используются для получения пользовательского ввода в разных форматах. Также научились обрабатывать исключения и ошибки, которые могут возникнуть в процессе.

Не работает input внутри цикла, когда делаю его параметром

Код выдает неправильный ответ, из-за того что input сделала переменной внутри цикла. Как можно его исправить? Обязательное условие, чтобы input был параметром, но так тоже не работает.

from collections import Counter def score_sum(value=2, const="."): press = input() return sum( key  

Входные данные:

Ввод: 3 1231 2..2 2..2 2..2 Вывод: 2 
Ввод: 4 1111 9999 1111 9911 Вывод: 1 

Отслеживать
13.5k 1 1 золотой знак 8 8 серебряных знаков 23 23 бронзовых знака
задан 25 июн 2021 в 22:07
11 1 1 бронзовый знак

Вы не сделали его "переменной внутри цикла", вы сделали его переменной, которая перед циклом получает значение единственный раз. И что значит "imput был параметром"?

25 июн 2021 в 23:40

пыталась сделать так def score_sum(, press=input,value=2, const="."): так как требуется чтобы функция была универсальной и получала все данные через параметр

26 июн 2021 в 5:59
Попробуйте просто в теле функции вместо int(press) написать int(input())
26 июн 2021 в 6:39
Ну так def score_sum(press, value=2, const="."): . А при вызове print(score_sum(input())) .
26 июн 2021 в 7:55

Немного не по теме но попробуйте написать код нормально, а не пихать все в одну строку. Станет гораздо легче работать и отлавливать ошибки. А то сейчас конечно имхо но пример как делать не надо.

26 июн 2021 в 10:13

0

Сортировка: Сброс на вариант по умолчанию

Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.

  • python
  • циклы
  • input

Функция input() в Python, ввод данных с клавиатуры

Функция input() позволяет обеспечить ввод пользовательских данных из консоли. Если передан необязательный аргумент подсказки prompt , то он записывается в стандартный вывод без завершающей строки. Затем функция читает строку из ввода и преобразует ее в СТРОКУ, убирая завершающий символ строки '\n' и возвращает ее в качестве значения.

Другими словами, все что вводится в консоль при использовании встроенной функции input() преобразуется в тип str . Это происходит в том числе и с числами. Следовательно, числовые данные, перед их использованием необходимо распознавать и преобразовывать к нужным типам.

Если был импортирован модуль readline , то функция input() будет использовать его для обеспечения сложных функций редактирования строк и истории.

  • В случае считывания EOF (признак конца файла), поднимается исключение EOFError .
  • Перед чтением ввода, функция input() вызывает событие аудита input с аргументом prompt .
  • После успешного чтения ввода, вызывает событие аудита input c результатом resultс .

Примеры получения/ввода данных из консоли/клавиатуры.

  • Общие примеры использования функции input() ;
  • Проверка и преобразование типов при вводе данных с клавиатура;
  • Эмуляция терминала с использованием функцией input() .

Общие примеры использования функции input() .

>>> x = input('Enter your name:') # Enter your name:Anton >>> print('Hello, ', x) # Hello, Anton # Можно и без строки подсказки >>> print('Введите число:') # Введите число: >>> x = input() # 10 # Не забываем что функция # возвращает строку >>> x # '10' 

Проверка и преобразование типов при вводе данных с клавиатура.

Пример представляет собой программу подсчета суммы или произведения введенных в консоль чисел. В примере будем распознавать числовые типы на примере типов int и float , читаемые функцией input() из консоли интерпретатора Python.

# test.py def str_to_num(line): """функция конвертирует строку в число""" line = line.strip() # если в строке только цифры if line.isdigit(): return int(line) # если строка содержит точку или запятую elif '.' in line or ',' in line: # если из строки убрать точку или запятую # и при этом в строке останутся только цифры if any(line.replace(x, '').isdigit() for x in ['.', ',']): return float(line.replace(',', '.')) else: # ошибка print('Это не число!\n') return None print('\nДля выхода из программы введите Ctrl+C') print('Для окончания ввода цифр нажмите Enter\n') nums = [] while True: inpt = input('Ожидается ввод числа или Enter:') if inpt == '': # Закончить ввод чисел break n = str_to_num(inpt) if n is not None: nums.append(n) if nums: if len(nums) == 1: print('Вы ввели одну цифру: ', nums[0]) else: print('\nВыберите действие:') print(' сложить цифры введите 1;') print(' умножить цифры введите 2.\n') rez = None while True: inpt = input('Введите 1 или 2:') inpt = inpt.strip() if inpt == '1': rez = sum(nums) print('Сумма введенных чисел:', rez) elif inpt == '2': rez = 1 for i in nums: rez *= i print('Произведение введенных чисел:', rez) else: print('Неправильное действие.\n') if rez is not None: break else: print('Вы ничего не ввели.') 
$ python3 test.py Для выхода из программы введите Ctrl+C Для окончания ввода цифр нажмите Enter Ожидается ввод числа или Enter:10 Ожидается ввод числа или Enter:13.9 Ожидается ввод числа или Enter:9,9 Ожидается ввод числа или Enter: Выберите действие: сложить цифры введите 1; умножить цифры введите 2. Введите 1 или 2:2 Произведение введенных чисел: 1376.1000000000001

Эмуляция терминала с использованием функцией input() .

Для воспроизведения вывода ошибок при выполнении команд в воображаемой "консоли" воспользуемся модулем traceback . Выполнять введенный код будем при помощи встроенной функции exec() .

# test.py import sys, traceback def run_user_code(envdir): source = input(">>> ") try: # Выполнение введенного кода с клавиатуры exec(source, envdir) except Exception: print("Exception in user code:") print("-"*60) traceback.print_exc(file=sys.stdout) print("-"*60) # словарь для хранения введенных переменных envdir = <> while True: run_user_code(envdir) 

Запускаем эмуляцию интерпретатора Python.

$ python3 test.py >>> a = 3 >>> b = '1' >>> a + b Exception in user code: ------------------------------------------------------------ Traceback (most recent call last): File "tt.py", line 6, in run_user_code exec(source, envdir) File "", line 1, in TypeError: unsupported operand type(s) for +: 'int' and 'str' ------------------------------------------------------------
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Функция abs(), абсолютное значение числа
  • Функция all(), все элементы True
  • Функция any(), хотя бы один элемент True
  • Функция ascii(), преобразует строку в ASCII
  • Функция bin(), число в двоичную строку
  • Класс bool(), логическое значение объекта
  • Функция breakpoint(), отладчик кода
  • Класс bytearray(), преобразует в массив байтов
  • Класс bytes(), преобразует в строку байтов
  • Функция callable(), проверяет можно ли вызвать объект
  • Функция chr(), число в символ Юникода
  • Класс classmethod, делает функцию методом класса
  • Функция compile() компилирует блок кода Python
  • Класс complex(), преобразует в комплексное число
  • Функция delattr(), удаляет атрибут объекта
  • Класс dict() создает словарь
  • Функция dir(), все атрибуты объекта
  • Функция divmod(), делит числа с остатком
  • Функция enumerate(), счетчик элементов последовательности
  • Функция eval(), выполняет строку-выражение с кодом
  • Функция exec(), выполняет блок кода
  • Функция filter(), фильтрует список по условию
  • Класс float(), преобразует в вещественное число
  • Функция format(), форматирует значение переменной
  • Класс frozenset(), преобразует в неизменяемое множество
  • Функция getattr(), значение атрибута по имени
  • Функция globals(), переменные глобальной области
  • Функция hasattr(), наличие атрибута объекта
  • Функция hash(), хэш-значение объекта
  • Функция help(), справка по любому объекту
  • Функция hex(), число в шестнадцатеричную строку
  • Функция id(), идентификатор объекта
  • Функция input(), ввод данных с клавиатуры
  • Класс int(), преобразует в тип int
  • Функция isinstance(), принадлежность экземпляра к классу
  • Функция issubclass(), проверяет наследование класса
  • Функция iter(), создает итератор
  • Функция len(), количество элементов объекта
  • Класс list(), преобразовывает в список
  • Функция locals(), переменные локальной области
  • Функция map(), обработка последовательности без цикла
  • Функция max(), максимальное значение элемента
  • Класс memoryview(), ссылка на буфер обмена
  • Функция min(), минимальное значение элемента
  • Функция next(), следующий элемент итератора
  • Класс object(), возвращает безликий объект
  • Функция oct(), число в восьмеричную строку
  • Функция open(), открывает файл на чтение/запись
  • Функция ord(), число символа Unicode
  • Функция pow(), возводит число в степень
  • Функция print(), печатает объект
  • Класс property(), метод класса как свойство
  • Класс range(), генерирует арифметические последовательности
  • Функция repr(), описание объекта
  • Функция reversed(), разворачивает последовательность
  • Функция round(), округляет число
  • Класс set(), создает или преобразовывает в множество
  • Функция setattr(), создает атрибут объекта
  • Класс slice(), шаблон среза
  • Функция sorted(), выполняет сортировку
  • Декоратор staticmethod(), метод класса в статический метод
  • Класс str(), преобразует объект в строку
  • Функция sum(), сумма последовательности
  • Функция super(), доступ к унаследованным методам
  • Класс tuple(), создает или преобразует в кортеж
  • Класс type(), возвращает тип объекта
  • Функция vars(), словарь переменных объекта
  • Функция zip(), объединить элементы в список кортежей
  • Функция __import__(), находит и импортирует модуль
  • Функция aiter(), создает асинхронный итератор
  • Функция anext(), следующий элемент асинхронного итератора

Функции print() и input(). Преобразование строк в числа int() и float()

О функции print() мы с вами уже немного говорили, и вы видели ее использование в самых простых ситуациях, например:

print(1)
print(3, 5, 7)

выведет указанные значения через пробел. Также можно выводить отдельные переменные:

a = -6.84 print(a)

результаты арифметических операций:

print(a * 2 + 3)

или функций:

print(abs(a * 2 + 3))
  • sep – разделитель между данными;
  • end – завершающий символ или строка.
a = -6.84 b = 7 c = 25.6 print(a, b, c)

Как видите, между ними автоматически добавляется пробел. Но этот символ можно поменять через параметр sep, например, так:

print(a, b, c, sep=" | ")

Соответственно, чтобы параметр sep «сработал», необходимо хотя бы два аргумента в функции print(). Если указать, например, один:

print(a, sep=" | ")

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

print(a, b, sep=" | ")

Второй параметр end задает окончание строки вывода и по умолчанию: end = '\n' переводу на следующую строку. Это такой спецсимвол, о которых мы также еще будем говорить. Так вот, благодаря такому параметру end два последовательных вызова функции print() напечатают текст с новой строки:

print("Hello") print("World!")

Но если в первой функции print() добавить этот параметр с пробелом:

print("Hello", end=' ') print("World!")

то увидим в одной строчке оба слова. Разумеется, здесь параметр end с пробелом применяется только к первому print(). У второго он уже берется по умолчанию с переносом строки. Последнее, что я хочу рассказать о функции print() – это способ вывода форматированной информации в консоль. Давайте предположим, что у нас имеются две переменные (координаты точки) x и y:

x = 5.76 y = -8

И мы хотим вывести их в формате: «Координаты точки: x = 5.76; y = -8» Сделать это можно несколькими способами. Первый, самый очевидный, записать все через запятую:

print("Координаты точки: x = ", x, "; y = ", y)

Но, начиная с версии Python 3.6, появилась возможность использовать специальные F-строки. О них мы также еще будем говорить, но здесь я приведу простой пример и вы уже сейчас сможете применять этот механизм в своих программах. Запишем функцию print(), следующим образом:

print(f"Координаты точки: x = ; y = ")

Смотрите, здесь перед строкой ставится специальный символ f, указывающий, что это будет F-строка. А, в самой строчке внутри фигурных скобок мы можем записывать любые конструкции языка Python. В данном случае, я просто указал переменные x и y. Видите, как это просто, наглядно и удобно. Сейчас практически всегда используются F-строки для форматированного вывода информации.

Функция input()

Вторая функция input() служит для ввода информации, как правило, с клавиатуры. В самом простом варианте ее можно вызвать так:

a = input()

При этом переменная a будет ссылаться на строку:

print(type(a))

И это важный момент: функция input() всегда возвращает строку. На что это может повлиять? Например, мы хотим вычислить модуль введенного числа:

a = input() b = abs(a)

При вызове функции abs() возникнет ошибка, так как в качестве ее аргумента должно быть число, а не строка. Как решить эту проблему? Очень просто. Если мы знаем, что пользователь должен ввести число, предположим, целое число, то можно воспользоваться функцией:

a = "54" b = int(a)

Теперь b будет ссылаться на число 54, а не строку. И наша программа примет вид:

a = input() a = int(a) b = abs(a) print(b)

Здесь первые две строчки можно объединить и записать их так:

a = int(input())

Но функция int() преобразовывает только целые числа. Если в строке будет хотя бы один не цифровой символ:

int("64.56")

возникнет ошибка. То есть, в нашей программе пользователь обязательно должен вводить целые числа. А как тогда преобразовывать вещественные значения? Для этого есть другая функция:

float("64.56")

Поэтому, когда на входе ожидаются вещественные данные, то следует использовать именно ее:

a = float(input()) b = abs(a) print(b)

Давайте напишем программу для вычисления периметра прямоугольника. Пользователь будет вводить два числа (стороны прямоугольника), а мы, затем, вычислим периметр:

a = float(input()) b = float(input()) print("Периметр:", 2 * (a + b))

Как видите, все достаточно просто. Мы вводим первое число, нажимаем Enter и вводим второе число. Вводить два числа через пробел здесь нельзя, иначе получится строка с двумя числами, разделенные пробелом и ее нельзя будет преобразовать функциями int() и float(). Также в этой программе пользователю совершенно непонятно, что нужно вводить. Давайте добавим подсказки. Для этого в функции input() первым аргументом передается строка:

a = float(input("Введите длину прямоугольника: ")) b = float(input("Введите ширину прямоугольника: ")) print("Периметр:", 2 * (a + b))

Теперь стало гораздо понятнее, что нужно вводить. Забегая вперед отмечу, что в Python можно выстроить конструкцию для ввода значений через пробел. Это делается так:

a, b = map(float, input("Введите две стороны прямоугольника: ").split())

Здесь к каждому введенному значению применяется функция float() для преобразования в вещественные числа. Пока просто запомните эту конструкцию, в дальнейшем она станет понятной, когда мы изучим строки и функцию map(). Или, для ввода целых чисел, она будет принимать вид:

a, b, c = map(int, input("Введите три целых числа: ").split()) print("Периметр треугольника:", a + b + c)

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

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