我是python的新手并在线尝试一些编码问题。我接受sys.sdnin很多接受输入。我想知道input()
和sys.stdin
在行动上有何不同?
答案 0 :(得分:5)
哎哟..一连串的downvotes ..
这是让你入门的东西:
内置函数 input
从标准输入流中读取一行输入,可选择带有消息提示。但是,请注意提示,因为结果:
result = input('Do you want to do whatever? ') ## doesn't work how you'd expect
if result.lower() in ('y', 'ye', 'yes', 'yup', 'ya'):
do_whatever()
...
else:
do_something_else()
...
..也会包含提示字符串(因此永远不会等于'y'/'yes'/ etc)。在我看来,最好先打印提示字符串,然后调用没有args的输入,如下所示:
print('Do you want to do whatever?')
result = input() ## notice that there is no prompt string passed to input()
if result.lower() in ('y', 'ye', 'yes', 'yup', 'ya'):
do_whatever()
...
else:
do_something_else()
...
因此,回顾一下,内置函数 input
从标准输入流(sys.stdin
)读取输入,内置函数 print
将输出打印到标准输出流(sys.stdout
)。还有第三个,标准错误流(sys.stderr
),打印出未处理的异常。
通常,你不必太担心它。它只是在构建IDE和框架等时;但是,如果你有兴趣,我可以进入如何勾选它们。尽管如此,我甚至不确定你是否还在检查你的SO,所有事情都要考虑。 (不确定我会责备你,考虑到downvote讨厌大笑)
无论如何,希望我帮忙! :)
答案 1 :(得分:0)
我一直在问自己一个相同的问题,所以我想出了这两个摘要,它们通过将前者模拟为sys.stdin
和input()
来阐明它们之间的区别:
import sys
def my_input(prompt=''):
print(prompt, end='') # prompt with no newline
for line in sys.stdin:
if '\n' in line: # We want to read only the first line and stop there
break
return line.rstrip('\n')
这是一个更简洁的版本:
import sys
def my_input(prompt=''):
print(prompt, end='')
return sys.stdin.readline().rstrip('\n')
这两个摘要与input()
函数的不同之处在于它们不检测文件结尾(请参见下文)。
这是官方文档描述功能input()的方式:
输入([提示])
如果存在提示参数,则将其写入标准输出而无需尾随换行符。然后,该函数从输入中读取一行,将其转换为字符串(带末尾的换行符),然后将其返回。读取EOF时,将引发EOFError。
这是sys.stdin的描述方式:
sys。 stdin
解释器用于标准输入的文件对象。
stdin用于所有交互式输入(包括对input()的调用);
这些流(sys.stdin,sys.stdout和sys.stderr)是常规文本文件,如open()函数返回的文本文件。 [...]
因此,input()
是一个函数,sys.stdin
是一个对象(文件对象)。
因此,它具有许多属性,您可以在解释器中使用以下属性进行探索:
> dir(sys.stdin)
['_CHUNK_SIZE',
'__class__',
'__del__',
'__delattr__',
'__dict__',
'__dir__',
...
'truncate',
'writable',
'write',
'write_through',
'writelines']
,并且可以单独显示,例如:
> sys.stdin.mode
r
它还具有诸如readline()
之类的方法,该方法“ 从文件中读取一行;在字符串的末尾保留换行符(\ n),并且仅在如果文件未以换行符结尾,则返回文件的最后一行,这使返回值明确;如果f.readline()返回空字符串,则说明文件的末尾已到达,而空行表示由'\ n'组成,一个仅包含单个换行符的字符串。“(1)
最后一个方法使我们可以完全模拟input()函数,包括其EOF异常错误:
def my_input(prompt=''):
print(prompt, end='')
line = sys.stdin.readline()
if line == '': # readline() returns an empty string only if EOF has been reached
raise EOFError('EOF when reading a line')
else:
return line.rstrip('\n')