Как вы читаете со стандартного ввода?

Во-первых, ваше представление о том, что является ООП «фундаментальным», не является фундаментальным. Изобретатель термина «объектно-ориентированный», Алан Кей, классно сказал:

Я составил термин «объектно-ориентированный», и могу сказать, что у меня не было C ++ .

Конечно, идея о том, что лексически «все идет внутри класса», не является основополагающим принципом ООП. Мне даже не ясно, что идея «класса» является фундаментальной для объектно-ориентированного программирования; шаблон «наследование на основе классов» является всего лишь одним из способов внедрения в языковую поддержку таких понятий, как передача сообщений, абстракция данных и совместное использование реализации.

Во-вторых, подразумевается, что разработчики языка C # пытаются сделать язык, который соответствует «основам» ООП, ставит телегу перед лошадью. Скорее, мы хотим создать язык, который поддерживает большие, разнообразные команды, работающие вместе над версиями, независимыми, взаимодействующими программными компонентами на наших платформах. ООП просто оказывается отличным способом сделать это, поэтому мы это делаем.

Мы, конечно, не пытаемся сделать «чистый» язык ООП любым способом. Мы возьмем идеи из любой парадигмы, если они будут поддерживать реальные клиентоориентирующие сценарии. В C # есть идеи, взятые из ООП, от процедурного программирования, от функционального программирования, от динамических языков и т. Д.

В-третьих, ваш вопрос логически непоследователен. Вы спрашиваете, почему вы можете определить делегат вне класса. Но делегат - это класс. Делегат - это особый класс; он всегда запечатан, он всегда наследуется от System.MulticastDelegate, и он всегда имеет одни и те же элементы. Но это класс. Мы придаем ему особый синтаксис, чтобы назвать, что это особый класс. Имеет смысл определить класс делегата вне класса.

В-четвертых, конечная причина, по которой законно помещать делегата вне класса, заключается в том, что это очень удобно. Каков класс, который, по вашему мнению, должен войти в Func<T> или EventHandler? Будет ли этот класс «ООП»? Согласно обычной мудрости «ООП» класс должен представлять концепцию , связывая операции с данными ; какой концептуальный класс вещей предлагает ваш предложенный родительский класс Func<T>, и каковы операции и данные на нем?

Нет такого разумного внешнего класса, и нет никаких операций или данных, связанных с «внешний класс» Func<T>. Итак, зачем заставить пользователя определять бесполезный внешний класс, просто чтобы быть совместимым с чьей-то ошибочной мыслью о том, что означает «ООП»?

1326
задан martineau 25 December 2018 в 22:08
поделиться

4 ответа

Вы можете использовать модуль fileinput :

import fileinput

for line in fileinput.input():
    pass

fileinput будет перебирать все строки ввода, указанные как имена файлов, указанные в аргументах командной строки, или стандартный ввод, если аргументы не указаны.

Примечание: строка будет содержать завершающую новую строку; чтобы удалить его, используйте line.rstrip ()

914
ответ дан 19 December 2019 в 20:14
поделиться

Вот из Learning Python :

import sys
data = sys.stdin.readlines()
print "Counted", len(data), "lines."

В Unix вы можете протестировать это, выполнив что-то вроде:

% cat countlines.py | python countlines.py 
Counted 3 lines.

В Windows или DOS вы должны:

C:\> type countlines.py | python countlines.py 
Counted 3 lines.
190
ответ дан 19 December 2019 в 20:14
поделиться

Есть несколько способов сделать это.

  • sys.stdin - это объект в виде файла, для которого вы можете вызывать функции read или readlines , если вы хотите прочитать все или хотите прочитать все и автоматически разделить это по новой строке. (Для этого вам нужно import sys .)

  • Если вы хотите запрашивать пользователя для ввода, вы можете использовать raw_input в Python 2 .X и просто input в Python 3.

  • Если вы действительно хотите просто прочитать параметры командной строки, вы можете получить к ним доступ через список sys.argv .

693
ответ дан 19 December 2019 в 20:14
поделиться
import sys

for line in sys.stdin:
    print(line)

Обратите внимание, что это будет включать символ новой строки в конце. Чтобы удалить новую строку в конце, используйте line.rstrip(), как @brittohalloran сказали.

419
ответ дан 19 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: