【问题标题】:What is the difference between input() and sys.stdin?input() 和 sys.stdin 有什么区别?
【发布时间】:2015-04-08 23:21:20
【问题描述】:

我是 python 新手,在线尝试了一些编码问题。我经常遇到 sys.sdnin 来接受输入。我想知道input()sys.stdin 的作用有何不同?

【问题讨论】:

  • 文档中有什么不清楚的地方?
  • sys.stdin 和 input() 的区别
  • 显然有很多不同之处,因为它们是两个完全不同的东西,您只需看一眼文档就可以看出这一点,而不是说任何关于实际阅读的内容。所以,不要重复你极其模糊的问题(是的,我们可以阅读),请更准确地解释你觉得困惑的地方。
  • 这个问题很有趣。它旨在了解 input()sys.stdin 之间的全部区别,它们之间的区别,以及为什么在不同的编程竞赛(例如 Codingame、HackerRank、Battle Dev)中,两者都用于完全相同的事情(读取数据) .这是文档中绝对没有提到的内容,我也希望得到澄清。

标签: python input sys


【解决方案1】:

通过代码示例进行说明

我一直在问自己同样的问题,所以我想出了这两个 sn-ps,它们通过模仿后者与前者来阐明 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')

这两个 sn-ps 与 input() 函数的不同之处在于它们不检测文件结尾(见下文)。

通过文档进行说明

官方文档是这样描述函数input()的:

输入([提示])

如果提示参数存在,则将其写入标准输出,不带尾随换行符。然后该函数从输入中读取一行,将其转换为字符串(去除尾随的换行符),然后返回。读取 EOF 时,会引发 EOFError。

下面是sys.stdin 的描述方式:

sys.标准输入

解释器用于标准输入的文件对象。
标准输入用于所有交互式输入(包括对 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')

【讨论】:

    【解决方案2】:

    以下是帮助您入门的内容:

    内置函数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)。在我看来,最好先打印提示字符串,然后调用不带参数的输入,如下所示:

    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)读取输入,而内置函数 em> print 将输出打印到标准输出流 (sys.stdout)。还有第三个,标准错误流 (sys.stderr),打印未处理的异常。

    通常,您不必担心太多。只是在构建 IDE 和框架等时。

    【讨论】:

    • "也将包含提示字符串" x = input('here');print(x) 之类的东西进行测试,我不知道除非我在提示符下输入,否则将“这里”输出到解释器。而我阅读你所写内容的方式实际上应该得到“这里”的输出以及我输入的任何内容......干杯
    • -1。这不是对您的答案的大量反对。只是这个答案是正确的。提示永远不会包含在函数 input() 返回的内容中。
    • 如果我用 x = input('here');print(x) 之类的东西测试它,除非我在提示符下输入,否则我不会得到解释器的 'here' 输出。而我阅读你所写内容的方式实际上应该得到“这里”的输出以及我输入的任何内容......干杯
    猜你喜欢
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2016-03-20
    • 2020-11-30
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多