input()和sys.stdin有什么区别?

时间:2015-04-08 23:21:21

标签: python input sys

我是python的新手并在线尝试一些编码问题。我接受sys.sdnin很多接受输入。我想知道input()sys.stdin在行动上有何不同?

2 个答案:

答案 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.stdininput()来阐明它们之间的区别:

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')