- Input Python
- Ввод в Python
- Преобразование вводимых данных
- Input() в int
- Input() в float
- Input() в list (список)
- input() в dict (словарь)
- Ввод в несколько переменных
- Параметр prompt
- Обработка исключений ввода
- Эмуляция терминала с использованием функции input().
- Практическая работа
- Как осуществить ввод словаря пользователем?
- Решение
Input Python
Основы
Как говорилось в предыдущей статье, программа – это, чаще всего, обработчик данных, который требует как ввода, так и вывода этих самых данных. В этом уроке мы поговорим о самом простом способе получить данные от пользователя в Python: считать их из консоли функцией input().
Ввод в Python
В Питоне есть функция input(), предназначенная для считывания данных, введённых пользователем в консоль с клавиатуры.
Когда вызывается input(), поток выполнения программы останавливается до тех пор, пока пользователь не произведет ввод в терминал.
Для завершения ввода пользователь должен нажать «Enter».
После этого функция input() считывает введённые пользователем данные и автоматически преобразует к строковому типу, даже если это цифры:
переменная = input() print(‘переменная:’, переменная) print(type(переменная)) # Вывод: 2 переменная: 2
Преобразование вводимых данных
Если Вам необходимо использовать данные, введённые пользователем не как строковые, Вам придётся самостоятельно преобразовать тип данных. Мы уже рассказывали о преобразовании типов, но давайте освежим знания.
Input() в int
Если Вам нужно получить целое число, используйте функцию int():
переменная = input() print(‘переменная:’, переменная) print(type(переменная)) новая_переменная = int(переменная) print(‘новая_переменная:’, новая_переменная) print(type(новая_переменная)) # Вывод: 3 переменная: 3 новая_переменная: 3
print('переменная: <>'.format(переменная := int(input())), type(переменная), sep='\n') # Вывод: 10 переменная: 10Input() в float
Если нужно получить число с плавающей точкой (не целое), примените функцию float().
переменная = float(input()) print('переменная:', переменная) print(type(переменная)) # Вывод: 5 переменная: 5.0
Input() в list (список)
Используя некоторые хитрости, можно преобразовать данные, возвращаемые функцией input() в список или другую списко-подобную коллекцию. Для этого надо при помощи метода строки split() разбить её на элементы, используя какой-либо разделитель. Пример с пробелом, в качестве разделителя:
переменная = input().split() print(переменная) print(type(переменная)) # Вывод: 1 2 3 ['1', '2', '3'] переменная = input().split(',') print(переменная) print(type(переменная)) # Вывод: 1,2,3 ['1', '2', '3']
переменная = input().split(',') print(переменная) print(type(переменная)) print(list(map(type, переменная))) # Вывод: 1,2,3 ['1', '2', '3'] [, , ]Если же Вам нужно преобразовать и их, можно снова использовать функцию преобразования типов в связке с циклом:
переменная = list() for element in input().split(): переменная.append(complex(element)) print(переменная) print([type(num) for num in переменная]) # Вывод: 999 333 666 [(999+0j), (333+0j), (666+0j)] [, , ]переменная = [complex(element) for element in input().split()] print(переменная) print([type(num) for num in переменная]) # Вывод: 999 333 666 [(999+0j), (333+0j), (666+0j)] [, , ]Но, пожалуй самый «чистый» и производительный способ сделать это, расположен в самых недрах функционального программирования – функция высшего порядка:
переменная = list(map(complex, input().split())) print(переменная) print([type(num) for num in переменная]) # Вывод: 999 333 666 [(999+0j), (333+0j), (666+0j)] [, , ]input() в dict (словарь)
К сожалению, попытки простого преобразования данных input() в dict приводят лишь к извращениям:
переменная = dict() введённые_данные = input().split() for i, element in enumerate(введённые_данные): if i % 2 == 0 and len(введённые_данные) - i > 1: переменная[element] = complex(введённые_данные[i + 1]) print(переменная) print('Тип ключей:', [type(num) for num in переменная]) print('Тип значений:', [type(num) for num in переменная.values()]) # Вывод: первый_элемент 12 второй_элемент 54 Тип ключей: [, ] Тип значений: [, ]Ввод в несколько переменных
Если необходимо заполнить одним вводом с клавиатуры сразу несколько переменных, воспользуйтесь распаковкой:
переменная, ещё_одна_переменная, последняя_переменная = input().split() print('Переменная:', переменная) print('Ещё_одна_переменная:', ещё_одна_переменная) print('Последняя_переменная:', последняя_переменная) # Вывод: Не_верь Не_бойся Не_проси Переменная: Не_верь Ещё_одна_переменная: Не_бойся Последняя_переменная: Не_просиНе забывайте, что все переменные после распаковки будут строкового типа, а так же, что вводимых элементов должно быть столько же, сколько переменных:
- если введенных значений больше чем переменных, Вы получите ошибку – ValueError: too many values to unpack (expected 3);
- если введенных значений меньше чем переменных, Вы получите ошибку – ValueError: not enough values to unpack (expected 3, got 2);
Этого можно избежать, если использовать ещё одну хитрость: распаковку слева))
переменная, ещё_одна_переменная, *остальные_элементы = input().split() print('Переменная:', переменная) print('Ещё_одна_переменная:', ещё_одна_переменная) print('Остальные_элементы:', остальные_элементы) # Вывод: Не_верь Не_бойся Не_проси И_успокойся Переменная: Не_верь Ещё_одна_переменная: Не_бойся Остальные_элементы: ['Не_проси', 'И_успокойся']Параметр prompt
Если использовать функцию input() так, как мы это делали в примерах выше, пользователю будет не ясно, что от него требуется, ведь программа просто остановится. Хорошо было бы вывести пояснение:
print('Введите что-нибудь: ') input() # Вывод: Введите что-нибудь: что-нибудьК счастью, эту возможность обеспечивает сама функция input() – Вы можете передать сообщение для пользователя как позиционный аргумент функции (или по имени параметра promt, но так никто не делает) и сообщение будет отображено на экране:
input('Введите что-нибудь: ') # Вывод: Введите что-нибудь: что-нибудьОбработка исключений ввода
Древняя компьютерная мудрость гласит: «не доверяй пользователю». Дело в том, что пользовательский ввод – это место, через которое информация попадает внутрь программы. Здесь можно провести аналогию со ртом, через который пища попадает в организм. Вы ведь не всё подряд засовываете в рот? Очень надеемся, что так и есть!
Продолжая аналогию, можно сказать, что пища (пользовательский ввод) может быть опасной (вирусы, sql инъекции и прочие атаки) или просто не съедобной (ожидаем от пользователя электронный адрес, а он вводит домашний).
Есть целый ряд профессий, направленных на борьбу с этими угрозами: пинтестеры и различные инженеры по информационной безопасности.
В целом, всегда стоит придерживаться правила: пользовательский ввод должен быть проверен!
Давайте немного повоюем с воображаемым программистом. Вот код, который доверчиво ожидает от пользователя ввода числа от 1 до 100:
from math import sqrt переменная = input('Введите число от 1 до 100: ') переменная = int(переменная) print('Корень Вашего числа равен: ', sqrt(переменная)) # Вывод: Введите число от 1 до 100: шесть Traceback (most recent call last): File "C:\Users\ivand\AppData\Roaming\JetBrains\PyCharm2021.2\scratches\scratch.py", line 4, in переменная = int(переменная) ValueError: invalid literal for int() with base 10: 'шесть' Process finished with exit code 1from math import sqrt переменная = input('Введите число от 1 до 100: ') while True: for i in переменная: if i.isalpha(): print('Введите число (ЦИФРАМИ)!') переменная = input('Введите число от 1 до 100: ') break else: break переменная = int(переменная) print('Корень Вашего числа равен: ', sqrt(переменная)) # Вывод: Введите число от 1 до 100: шесть Введите число (ЦИФРАМИ)! Введите число от 1 до 100: ,, Traceback (most recent call last): File "C:\Users\ivand\AppData\Roaming\JetBrains\PyCharm2021.2\scratches\scratch.py", line 13, in переменная = int(переменная) ValueError: invalid literal for int() with base 10: ',,' Process finished with exit code 1from math import sqrt переменная = input('Введите число от 1 до 100: ') while True: for i in переменная: if not i.isnumeric(): print('Введите число (ЦИФРАМИ)!') переменная = input('Введите число от 1 до 100: ') break else: break переменная = int(переменная) print('Корень Вашего числа равен: ', sqrt(переменная)) # Вывод: Введите число от 1 до 100: 20.5 Введите число (ЦИФРАМИ)! Введите число от 1 до 100: Ⅻ Traceback (most recent call last): File "C:\Users\ivand\AppData\Roaming\JetBrains\PyCharm2021.2\scratches\scratch.py", line 13, in переменная = int(переменная) ValueError: invalid literal for int() with base 10: 'Ⅻ' Process finished with exit code 1from math import sqrt переменная = input('Введите число от 1 до 100: ') while True: for i in переменная: if not i.isdigit(): print('Введите ЧИСЛО (ТОЛЬКО ЦИФРЫ). ') переменная = input('Введите число от 1 до 100: ') break else: break переменная = int(переменная) print('Корень Вашего числа равен: ', sqrt(переменная)) # Вывод: Введите число от 1 до 100: Ⅻ Введите ЧИСЛО (ТОЛЬКО ЦИФРЫ). Введите число от 1 до 100: 1000000 Корень Вашего числа равен: 1000.0 Process finished with exit code 0Здесь, формально, всё прошло гладко, но введённое значение не входит в требуемый диапазон. Как видите, это не так просто. Ещё один способ – принимать любой пользовательский ввод и потом «ловить» ошибки внутри программы:
from math import sqrt while True: переменная = input('Введите число от 1 до 100: ') try: переменная = int(переменная) except: print('Введите ЧИСЛО (ТОЛЬКО ЦИФРЫ). ') else: break print('Корень Вашего числа равен: ', sqrt(переменная)) # Вывод: Введите число от 1 до 100: шесть Введите ЧИСЛО (ТОЛЬКО ЦИФРЫ). Введите число от 1 до 100: 6 Корень Вашего числа равен: 2.449489742783178 Process finished with exit code 0Но обработка исключений не такая простая тема, как может показаться (подробнее можете ознакомиться с исключениями в нашей статье).
К тому же, этот подход не защищает от направленных атак:
while True: переменная = input('Введите выражение: ') try: print('Результат выражения:', eval(переменная)) except: print('Введите выражение на языке Python!') else: break # Вывод: Введите выражение: Попытка атаки Введите выражение на языке Python! Введите выражение: 'Я' + ' загружаю' + ' страшный' + ' вирус!' Результат выражения: Я загружаю страшный вирус!Эмуляция терминала с использованием функции input().
Для того, чтоб продемонстрировать мощь этой функции, приведём отрывок кода из официальной документации:
def run_user_code(envdir): source = input(">>> ") try: # Выполнение введенного кода с клавиатуры exec(source, envdir) except Exception as e: print("Exception in user code:") print("-"*60) print(str(e)) print("-"*60) # словарь для хранения введенных переменных envdir = <> while True: run_user_code(envdir) # Вывод: >>> переменная = 2 >>> вторая_переменная = 3 >>> print('сумма переменных равна:', переменная + вторая_переменная) сумма переменных равна: 5 >>> 1 / 0 Exception in user code: ------------------------------------------------------------ division by zero ------------------------------------------------------------ >>>Практическая работа
- Напишите программу, которая запрашивала бы у пользователя его данные: его имя, отчество и фамилию. После этого выводила бы строку:
- Напишите программу, которая предлагала бы пользователю решить пример 666 * 333 // 54. Потом выводила бы на экран правильный ответ и ответ пользователя.
- Запросите у пользователя три числа и два арифметических знака. Выведите результат последовательного выполнения данных операций.
Как осуществить ввод словаря пользователем?
Как осуществить ввод словаря пользователем? То есть чтобы пользователь мог вводит столько, сколько ему надо ключей и значений, а потом использовать эти ключи и значение в коде? Я знаю как ввести ключ и значение один раз, но чтобы какое-то определенное кол-во раз даже не совсем представляю.
Как проверить ввод значения из словаря?
Вот код: import telebot import config from telebot import types bot =.Как проверить ввод данных из ключа словаря
Вот код: classes = < "1-А": , "1-Б": , "1-В": >en = input("Введи.Как осуществить бесконечный ввод
Написал программу которая узнает внутренний код элемента и наоборот. Смысл программы: вводишь.Как осуществить ввод выражений?
Делаю матричный калькулятор в консольном приложении. Класс матриц со всеми функциями и операторами.Как осуществить ввод числа с клавиатуры
Есть некоторое уравнение, в котором есть переменная х, могу задать ее с помощью x = 9, и все будет.Сообщение было отмечено DarkVoodoo как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14def getDict(): r={} while (True): print('Enter key (empty enter - exit)') k=input() if k=='': break print('Enter value') v=input() r[k]=v return r d=getDict() print(d)