Реализация stdin и stdout
В задаче (кроме самого алгоритма решения) необходимо реализовать прием данных через stdin , а вывод через stdout . До этого обычно реализовывал прием через input , а вывод через print или просто возвращал значение без печати через return . Как принять данные с помощью stdin / stdout не улавливаю. Огромная просьба, дать ссылку или пример кода, чтобы разобраться.
@pavel: stdin/stdout не обязаны на консоль указывать (это легко может быть файл, pipe или даже (крайне редко) socket)
3 ответа 3
По умолчанию input() читает данные из stdin , print() печатает данные в stdout . Так что можете считать вашу задачу решённой.
В Питоне stdin , stdout представлены sys.stdin , sys.stdout объектами (текстовые потоки, как правило), которые в общем случае могут быть любого типа (если их интерфейс достаточно file-like) и могут быть переопределены кем-угодно (IDLE, bpython, ipython, IDE, win-unicode-console, etc). Иногда достаточно предоставить объект, который поддерживает единственный метод .write() , если нужно только print() функцию поддерживать. В других случаях, даже экземпляр io.TextIOWrapper (тип sys.stdin / sys.stdout по умолчанию) может быть недостаточным, если .fileno() не возвращает настоящий file descriptor (см. детали в Redirect stdout to a file in Python?).
При запуске Питона, sys.stdin / sys.stdout обычно указывают на стандартные потоки ввода/вывода, унаследованные от родительского процесса или полученные от консоли. Интерактивный ввод/вывод как правило связан с терминалом. Из оболочки легко перенаправить ввод/вывод из файла, канала (pipe)
Работа напрямую с sys.stdin , sys.stdout такая же как с другими текстовыми файлами. Например, чтобы прочитать текстовые строчки из стандартного ввода и записать введённые символы (Unicode codepoint) в каждой строке в обратном порядке в стандартный вывод:
#!/usr/bin/env python3 import sys for line in sys.stdin: print(line.rstrip('\n')[::-1])
Кодировка, используемая sys.stdin / sys.stdout , чтобы текст в байты превратить и обратно, может зависеть от окружения. Чтобы избежать кракозяб или UnicodeEncodeError исключения из-за работы с произвольными Unicode символами в Windows консоль и на других платформах следуйте по приведённым здесь ссылкам, которые показывают win-unicode-console (PEP 528 возможно упразднит этот пакет), LC_* (locale), PYTHONIOENCODING решения. PEP-538, PEP-540 реализованные в Python 3.7 заставляют Питон использовать utf-8 в большем числе случаев, делая проблемы с кодировками ввода/вывода гораздо менее вероятными по умолчанию.
print() это удобный wrapper вокруг sys.stdout.write() . input() часто можно рассматривать как wrapper вокруг sys.stdin.readline() , рассчитанный на интерактивный ввод (поддержка истории ввода, редактирования с помощью readline модуля, если доступен). Для продвинутой поддержки интерактивного ввода в терминале, посмотрите на prompt_toolkit :
#!/usr/bin/env python from prompt_toolkit import prompt # $ pip install prompt_toolkit if __name__ == '__main__': answer = prompt('Give me some input: ') print('You said: %s' % answer)