В задаче (кроме самого алгоритма решения) необходимо реализовать прием данных через stdin, а вывод через stdout. До этого обычно реализовывал прием через input, а вывод через print или просто возвращал значение без печати через return.
Как принять данные с помощью stdin/stdout не улавливаю.
Огромная просьба, дать ссылку или пример кода, чтобы разобраться.
-
Это значит чтение и вывод в консоль а не в файл. Например print метод. – pavel Oct 02 '16 at 08:07
-
@pavel: stdin/stdout не обязаны на консоль указывать (это легко может быть файл, pipe или даже (крайне редко) socket) – jfs Oct 02 '16 at 20:39
-
Если вам дан исчерпывающий ответ, отметьте его как верный (галка напротив выбранного ответа). – Nicolas Chabanovsky Oct 03 '16 at 05:59
3 Answers
По умолчанию 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)
$ python ваша-программа.py <входной-файл
# `sys.__stdin__` это входной-файл
$ echo abc | python ваша-программа.py
# `sys.__stdin__` это pipe (`echo` пишет с одного конца, мы читаем с другого)
Работа напрямую с 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)
- 52,361
stdin и stdout это файлоподобные объекты, предоставляемые OS.
Для чтения и записи в них нужно импортнуть sys - import sys.
sys.stdin.read() использовать для чтения из stdin
для записи в stdout можно использовать print(он так и используется - самый распространенный метод записи в stdout). т.е. print пишет в sys.stdout.
Пример:
import sys
str = sys.stdin.read()
print str
- 856
-
11-
sys.stdin/stdoutне обязаны OS задаваться, например,win-unicode-consoleпакет может заменить их, чтобы работать с Unicode в Виндовой консоле. 2-input()сам по себе может из стандартного ввода читать, без явного использованияsys.stdin. 3- я предполагаю, что автор использует Питон 3 (из-за использованияinput(), вместоraw_input()), поэтомуprint()должен быть функцией в примере. – jfs Oct 02 '16 at 20:08
def countdistinctfivisors(n, start=2):
if n == 1:
return 1
else:
result = 0
for i in range(start, n+1):
if n % i == 0:
result += countdistinctfivisors(n // i, i + 1)
return result
print(countdistinctfivisors(int(input())))
- 1,907
-
Дайте пожалуйста пояснение к коду. Пока не видно, как он отвечает на вопрос в этом топике. – 0xdb Oct 10 '20 at 09:06