6

В задаче (кроме самого алгоритма решения) необходимо реализовать прием данных через stdin, а вывод через stdout. До этого обычно реализовывал прием через input, а вывод через print или просто возвращал значение без печати через return. Как принять данные с помощью stdin/stdout не улавливаю. Огромная просьба, дать ссылку или пример кода, чтобы разобраться.

tcma13
  • 508
  • 1
  • 5
  • 23

3 Answers3

12

По умолчанию 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)

jfs
  • 52,361
5

stdin и stdout это файлоподобные объекты, предоставляемые OS.

Для чтения и записи в них нужно импортнуть sys - import sys.

sys.stdin.read() использовать для чтения из stdin

для записи в stdout можно использовать print(он так и используется - самый распространенный метод записи в stdout). т.е. print пишет в sys.stdout.

Пример:

import sys
str = sys.stdin.read()
print str
sanix
  • 856
  • 1
    1- 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
0
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())))
  • Дайте пожалуйста пояснение к коду. Пока не видно, как он отвечает на вопрос в этом топике. – 0xdb Oct 10 '20 at 09:06