Что делает функция input в Python?
Функция input() предназначена для получения данных от пользователя. Все что введет пользователь по запросу функции input() будет приведено к типу данных строка.
x = input() # Bob print('Hello, ' + x) # => 'Hello, Bob'
Также в качестве необязательного аргумента можно передать строку-подсказку, показывающую какую информацию следует ввести:
x = input('Enter your name: ') # => Enter your name: # Bob print('Hello, ' + x) # => 'Hello, Bob'
Ввод-вывод¶
Рано или поздно возникают ситуации, когда программа должна взаимодействовать с пользователем. Например, принять какие-нибудь данные от пользователя, а затем вывести результаты. Для этого применяются функции input() и print() соответственно.
Для вывода можно также использовать различные методы класса str (строка). К примеру, при помощи метода rjust можно получить строку, выравненную по правому краю к указанной ширине. См. help(str) для более подробного описания.
Ещё одним распространённым типом ввода/вывода является работа с файлами. Возможность создавать, читать и записывать в файлы является ключевой для многих программ, поэтому в настоящей главе и мы рассмотрим этот аспект.
Ввод от пользователя¶
Сохраните эту программу как user_input.py :
def reverse(text): return text[::-1] def is_palindrome(text): return text == reverse(text) something = input('Введите текст: ') if (is_palindrome(something)): print("Да, это палиндром") else: print("Нет, это не палиндром")
Вывод:
$ python3 user_input.py Введите текст: сэр Нет, это не палиндром $ python3 user_input.py Введите текст: мадам Да, это палиндром $ python3 user_input.py Введите текст: топот Да, это палиндром
Как это работает:
Мы применяем операцию вырезки для переворачивания текста. Мы уже видели, как создаются вырезки из последовательностей при помощи кода » seq[a:b] «, начиная с позиции a до позиции b . Но ведь мы также можем указать и третий аргумент, определяющий шаг, с которым производится вырезка. По умолчанию шаг равен 1 , поэтому и возвращается непрерывный фрагмент текста. Указание отрицательного шага, т.е. -1 приведёт к выводу текста в обратном порядке.
Функция input() принимает строку в качестве аргумента и показывает её пользователю. Затем она ждёт, чтобы пользователь набрал что-нибудь и нажал клавишу ввода. Как только пользователь это сделал, функция input() возвращает введённый пользователем текст.
Мы считываем этот текст и выстраиваем его в обратном порядке. Если перевёрнутый и исходный текст одинаковы, значит введённый текст является палиндромом.
Проверка, является ли текст палиндромом должна также игнорировать знаки пунктуации, пробелы и регистр букв. Например, «А роза упала на лапу Азора» также является палиндромом, но наша текущая программа так не считает. Попробуйте улучшить её так, чтобы она распознала этот палиндром.
Воспользуйтесь кортежем (список всех знаков пунктуации можно найти здесь, содержащим все запрещённые символы, и примените тест на принадлежность, чтобы обнаружить символы, подлежащие удалению, т. е. forbidden = (‘!’, ‘?’, ‘.’, . ).
Файлы¶
Открывать и использовать файлы для чтения или записи можно путём создания объекта класса file , а читать/записывать в файл — при помощи его методов read , readline или write соответственно. Возможность читать или записывать в файл зависит от режима, указанного при открытии файла. По окончании работы с файлом, нужно вызвать метод close 1 , чтобы указать Python, что файл больше не используется.
Пример: (сохраните как using_file.py )
poem = '''\ Программировать весело. Если работа скучна, Чтобы придать ей весёлый тон - используй Python! ''' f = open('poem.txt', 'w') # открываем для записи (writing) f.write(poem) # записываем текст в файл f.close() # закрываем файл f = open('poem.txt') # если не указан режим, по умолчанию подразумевается # режим чтения ('r'eading) while True: line = f.readline() if len(line) == 0: # Нулевая длина обозначает конец файла (EOF) break print(line, end='') f.close() # закрываем файл
Вывод:
$ python3 using_file.py Программировать весело. Если работа скучна, Чтобы придать ей весёлый тон - используй Python!
Как это работает:
Сперва мы открываем файл при помощи встроенной функции open с указанием имени файла и режима, в котором мы хотим его открыть. Режим может быть для чтения ( ‘r’ ), записи ( ‘w’ ) или добавления ( ‘a’ ) 2 . Можно также указать, в каком виде мы будем считывать, записывать или добавлять данные: в текстовом ( ‘t’ ) или бинарном ( ‘b’ ). На самом деле существует много других режимов, и help(open) даст вам их детальное описание. По умолчанию open() открывает файл как текст в режиме для чтения.
В нашем примере мы сначала открываем файл в режиме записи текста и используем метод write файлового объекта для записи в файл, после чего закрываем файл при помощи close .
Далее мы открываем тот же самый файл для чтения. В этом случае нет нужды указывать режим, так как режим «чтения текстового файла» применяется по умолчанию. Мы считываем файл построчно методом readline в цикле. Этот метод возвращает полную строку, включая символ перевода строки в конце. Когда же он возвращает пустую строку, это означает, что мы достигли конца файла, и мы прерываем цикл при помощи break .
По умолчанию функция print() выводит текст, автоматически добавляя символ перевода строки в конце. Мы подавляем этот символ, указывая end=» , поскольку строки, считанные из файла, и без того оканчиваются символом перевода строки. И, наконец, мы закрываем файл с помощью close .
Теперь проверяем содержимое файла poem.txt , чтобы убедиться, что программа действительно записала текст в него и считала из него.
Pickle¶
Python предоставляет стандартный модуль с именем pickle 3 , при помощи которого можно сохранять любой объект Python в файле, а затем извлекать его обратно. Это называется длительным хранением объекта.
Пример: (сохраните как pickling.py ):
import pickle # имя файла, в котором мы сохраним объект shoplistfile = 'shoplist.data' # список покупок shoplist = ['яблоки', 'манго', 'морковь'] # Запись в файл f = open(shoplistfile, 'wb') pickle.dump(shoplist, f) # помещаем объект в файл f.close() del shoplist # уничтожаем переменную shoplist # Считываем из хранилища f = open(shoplistfile, 'rb') storedlist = pickle.load(f) # загружаем объект из файла print(storedlist)
Вывод:
$ python3 pickling.py ['яблоки', 'манго', 'морковь']
Как это работает:
Чтобы сохранить объект в файле, нам нужно сперва открыть файл с помощью open в режиме бинарной записи ( ‘wb’ ), после чего вызвать функцию dump из модуля pickle . Этот процесс называется «консервацией» («pickling»).
После этого мы извлекаем объект при помощи функции load из модуля pickle , которая возвращает объект. Этот процесс называется «расконсервацией» («unpickling»).
Резюме¶
Мы обсудили разные типы ввода/вывода, а также работу с файлами и использование модуля pickle .
Далее мы познакомимся с концепцией исключений.
- close — англ. «закрывать» (прим.перев) ↩
- read, write и append соответственно (прим.перев.) ↩
- pickle — англ. «мариновать», «солить» (прим.перев.) ↩
Пользовательский ввод (input) в Python
Обычно программа работает по такой схеме: получает входные данные → обрабатывает их → выдает результат. Ввод может поступать как непосредственно от пользователя через клавиатуру, так и через внешний источник (файл, база данных).
В стандартной библиотеке Python 3 есть встроенная функция input() (в Python 2 это raw_input() ), которая отвечает за прием пользовательского ввода. Разберемся, как она работает.
Чтение ввода с клавиатуры
Функция input([prompt]) отвечает за ввод данных из потока ввода:
s = input() print(f»Привет, !») > мир # тут мы с клавиатуры ввели слово «мир» > Привет, мир!
- При вызове функции input() выполнение программы приостанавливается до тех пор, пока пользователь не введет текст на клавиатуре (приложение может ждать бесконечно долго).
- После нажатия на Enter , функция input() считывает данные и передает их приложению (символ завершения новой строки не учитывается).
- Полученные данные присваиваются переменной и используются дальше в программе.
input() всегда возвращает строку :
s = input() print(type(s)) > 2 >
Также у input есть необязательный параметр prompt – это подсказка пользователю перед вводом:
name = input(«Введите имя: «) print(f»Привет, !») > Введите имя: Вася > Привет, Вася!
Более подробное описание функции из документации:
def input([prompt]): «»» Read a string from standard input. The trailing newline is stripped. The prompt string, if given, is printed to standard output without a trailing newline before reading input. If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError. On *nix systems, readline is used if available. «»» pass
Преобразование вводимых данных
Данные, введенные пользователем, попадают в программу в виде строки, поэтому и работать с ними можно так же, как и со строкой. Если требуется организовать ввод цифр, то строку можно преобразовать в нужный формат с помощью функций явного преобразования типов.
☝️ Важно : если вы решили преобразовать строку в число, но при этом ввели строку (например: test), возникнет ошибка:
ValueError: invalid literal for int() with base 10: ‘test’
На практике такие ошибки нужно обрабатывать через try except . В примере ниже пользователь будет вводить данные до тех пор, пока они успешно не преобразуются в число.
def get_room_number(): while True: try: num = int(input(«Введите номер комнаты: «)) return num except ValueError: print(«Вы ввели не число. Повторите ввод») room_number = get_room_number() print(f»Комната успешно забронирована!») > Введите номер комнаты: test > Вы ввели не число. Повторите ввод > Введите номер комнаты: 13 > Комната 13 успешно забронирована!
Input() → int
Для преобразования в целое число используйте функцию int() . В качестве аргумента передаются данные которые нужно преобразовать, а на выходе получаем целое число:
age_str = input(«Введите ваш возраст: «) age = int(age_str) print(age) print(type(age)) > Введите ваш возраст: 21 > 21 >
То же самое можно сделать в одну строку: age = int(input(«Введите ваш возраст: «)) .
Input() → float
Если нужно получить число с плавающей точкой (не целое), то его можно получить с помощью функции float() .
weight = float(input(«Укажите вес (кг): «)) print(weight) print(type(weight)) > Укажите вес (кг): 10.33 > 10.33 >
Input() → list (список)
Если в программу вводится информация, которая разделяется пробелами, например, «1 word meow», то ее легко преобразовать в список с помощью метода split() . Он разбивает введенные строки по пробелам и создает список:
list = input().split() print(list) print(type(list)) > 1 word meow > [‘1’, ‘word’, ‘meow’] >
Обратите внимание, что каждый элемент списка является строкой. Для преобразования в число, можно использовать int() и цикл for. Например, так:
int_list = [] for element in input().split(): int_list.append(int(element)) print([type(num) for num in int_list]) > 1 2 3 > [, , ]
Ввод в несколько переменных
Если необходимо заполнить одним вводом с клавиатуры сразу несколько переменных, воспользуйтесь распаковкой:
В этом примере строка из input() разбивается по пробелу функцией split() . Далее применяется синтаксис распаковки – каждый элемент списка попадает в соответствующую переменную.
Все переменные после распаковки будут строкового типа. Преобразовать их (например в int) можно так:
a, b = [int(s) for s in input().split()] print(f»type a: , type b: «) > 13 100 > type a: , type b:
☝️ Важно : не забывайте обрабатывать ошибки:
- если введенных значений больше чем переменных, получите ошибку – ValueError: too many values to unpack (expected 3) ;
- если введенных значений меньше чем переменных, получите ошибку – ValueError: not enough values to unpack (expected 3, got 2) ;
- если преобразовываете в int, а вводите строку – ValueError: invalid literal for int() with base 10: ‘test’ .
В этом руководстве вы узнали, как принимать данные от пользователя, введенные с клавиатуры, научились преобразовывать данные из input и обрабатывать исключения.
Как работает input() в python?
Добрый день! Предыстория: Изучал java и наткнулся на интересный момент, что можно задать значение элемента массива при помощи следующей команды
array[i] = console.nextInt();
Решил проверить в Python и там тоже всё работает, но неожиданно выявилась интересная особенность: ввод нового элемента массива идёт перед вводом места этого самого массива.
Код выглядит так:
m = [1,2,3,4,5] m[int(input("place "))] = int(input("Value ")) print(m)
Вопрос: почему так происходит и как работает input() в Python?
