【问题标题】:Accepting only numbers as input in Python在 Python 中只接受数字作为输入
【发布时间】:2011-03-09 20:11:46
【问题描述】:

有没有办法在 Python 中只接受数字,比如使用raw_input()

我知道我总是可以获取输入并捕获 ValueError 异常,但我想知道是否有某种方法可以强制提示仅接受数字并冻结任何其他输入。

【问题讨论】:

  • 你为什么要这样做?
  • 我正在制作一个接受标记作为输入的小脚本。
  • 你可能会编写自己的类来做到这一点,我认为没有任何这样的内置功能。
  • @Alfred:我也做过同样的事情,写了一个评分脚本。只需在非数字输入上提出ValueError
  • @大卫:啊!我认为 Python 中必须有一种方法。

标签: python


【解决方案1】:

来自docs

如何一次获得一个按键?

对于 Unix 变体:有几个 解决方案。做起来很简单 这使用诅咒,但诅咒是 相当大的模块来学习。这是一个 没有诅咒的解决方案:

import termios, fcntl, sys, os
fd = sys.stdin.fileno()

oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)

oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)

try:
    while 1:
        try:
            c = sys.stdin.read(1)
            print "Got character", `c`
        except IOError: pass
finally:
    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)

您需要 termios 和 fcntl 任何一个工作的模块,和 我只在 Linux 上试过,虽然 应该在其他地方工作。在这段代码中, 字符被读取并打印一个 一次。

termios.tcsetattr() 关闭标准输入 回显并禁用规范模式。 fcntl.fnctl() 用于获取 stdin 的文件描述符标志和 将它们修改为非阻塞模式。 由于在 stdin 为空时读取 导致 IOError,这个错误是 抓住并忽略。

使用这个,你可以抓取字符,检查它是否是一个数字,然后显示它。不过我自己没试过。

【讨论】:

  • 显然我们的想法是一样的 ;-) 为代码 +1,不过。我刚刚试了一下,做了一些小的改动,它似乎完全符合我的要求。
【解决方案2】:

据我所知,没有。我从未听说过使用终端、Python 或任何其他语言可以实现这样的事情。

我能想到的最接近的伪造方法是将终端置于静默模式(这样输入字符不会被回显)和非缓冲模式(这样你就可以在输入时输入每个字符,而无需等待行尾),然后逐个读取每个输入字符;如果它是一个数字,打印它并将其附加到一个字符串,否则丢弃它。但我什至不确定终端是否允许你这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多