2010-11-22 85 views
-2

我有一个菜单要求用户选择其中一个选项。由于这个菜单是从1到10,我使用raw_input之外的输入。Python输入字符串错误(不想使用raw_input)

我的代码作为if语句,如果用户输入的数字是从1到10,它会执行该选项。如果用户输入除此之外的任何数字,则else语句对用户说1到10之间的数字。

问题是如果用户输入一个字符串,比如说qwert。它给我一个错误,因为它是一个字符串。我明白为什么,我不想使用raw_input。

我能做些什么,以文在用户键入它去我else语句和打印的字符串,例如“只有数字是有效的。从1至10选择一个数字”

我不希望使用任何先进的编程做这个

问候,

Favolas

编辑 感谢您的答案和响应迟到抱歉,但我不得不这样我的健康问题。

我不能使用尝试或除了因为我的老师不允许它。 最后,我用raw_input是因为它是最简单的选择,但很高兴看到有很多方法可以解决这个问题。

问候,

Favolas

+0

你有没有试过**试**,**除**声明? – crodjer 2010-11-22 13:07:51

+0

我敢说,尝试,除非不是高级编程,而且如果您不想测试所有可能的输入类型并单独处理它们,那么它是唯一合乎逻辑的选择。 – snarkyname77 2010-11-22 13:43:19

+9

-1当你说你不想使用'try ... except'模块时,这停止了一个有效的问题。这就像要求如何在不使用循环的情况下从一到十打印数字。异常处理的_point_使程序员能够处理exceptions_。你对他们有什么? – katrielalex 2010-11-22 14:08:02

回答

5

当您尝试将字符串转换为数字时,可能会引发异常。 例子:

try: 
    int(myres) 
except: 
    print "Only numbers are valid" 
3

你真正追求的是如何找出如果事情就可以通过为整数。下面将做的工作:

try: 
    i = int(string_from_input) 
ecxept ValueError: 
    # actions in case the input is anything other than int, like continuing the loop 
+0

感谢您的回答,但我不想尝试或除了 – Favolas 2010-11-22 13:33:09

+1

确定吗?这是最好的解决方案。另一种选择是对字符串对象使用'isdigit()'函数。如果字符串只包含数字,即。不','或'。'它会返回true。 – knutin 2010-11-22 13:58:18

4

林不知道你考虑先进的 - 一个简单的方法来做到这将是像这样的东西。

def getUserInput(): 
    while True: 
     a = raw_input("Enter a number between 1 and 10: ") 
     try: 
      number = int(a) 
      if (0 < number <= 10): 
       return number 
      else: 
       print "Between 1 and 10 please" 
     except: 
      print "Im sorry, please enter a number between 1 and 10" 

在这里,我使用了try/except语句,以确保输入的字符串可以转换为整数。直到输入的数字在1到10之间(0 <数字< = 10)循环(它将保持运行)

+0

感谢您的答案,但我不想使用尝试或除了 – Favolas 2010-11-22 13:35:21

4

应该使用raw_input(),即使你不想:)这将永远给你一个字符串。然后,您可以使用代码如

s = raw_input() 
try: 
    choice = int(s) 
except ValueError: 
    # choice is invalid... 

尝试转换为int。

+0

感谢您的答案,但我不想使用尝试或除 – Favolas 2010-11-22 13:33:48

+3

@Favolas:克服它。 – martineau 2010-11-22 15:28:34

0

我可以推荐在Python 3.1中使用这个函数吗?这两个参数是预期的数字范围。

def get_number(a, z): 
    if a > z: 
     a, z = z, a 
    while True: 
     try: 
      line = input('Please enter a number: ') 
     except EOFError: 
      raise SystemExit() 
     else: 
      if line: 
       try: 
        number = int(line) 
        assert a <= number <= z 
       except ValueError: 
        print('You must enter base 10 digits.') 
       except AssertionError: 
        print('Your number must be in this range:', a, '-', z) 
       else: 
        return number 
      else: 
       print('You must enter a number.') 
+0

谢谢你的回答,但我不想尝试或除了 – Favolas 2010-11-22 13:36:06

+2

@favolas:为什么这个随机的要求?尝试除了什么? – SilentGhost 2010-11-22 13:58:08

2

你显然有异常处理的东西。我不明白为什么 - 它是(不仅仅是Python)编程的一个基本部分,也是你应该适应的东西。它不比处理错误代码更“先进”,只是一种不同的心态。

这里是文档。这很简单:

有可能编写程序, 处理选定的例外。看 以下示例中,用于提示用户 输入直到 已经输入了有效的整数,但允许用户 中断程序(使用 控制-C或任何操作 系统支持);请注意, 用户生成的中断是 ,通过提高 KeyboardInterrupt异常来发送信号。

>>> while True: 
...  try: 
...   x = int(raw_input("Please enter a number: ")) 
...   break 
...  except ValueError: 
...   print "Oops! That was no valid number. Try again..." 
... 

try语句的工作原理如下。

首先,try语句( 语句(s)在try和 之间的关键字除外)被执行。如果没有发生 异常,则跳过除外子句 ,并结束执行try 语句。如果在执行try 子句期间发生异常 ,则跳过该子句的其余部分 。然后,如果其类型匹配除 关键字之外以 命名的异常,则except子句将执行 ,然后在try语句后继续执行 。如果发生 异常,该异常与 子句中名为 子句的异常不匹配,则将其传递给外部尝试 语句;如果未找到处理程序,则 是未处理的异常,并且 执行停止,并显示消息 ,如上所示。一个try语句可能有 多于一个除了从句,到 为不同的 例外指定处理程序。最多只有一个处理程序将执行 。处理程序仅处理发生在 相应try子句中的 异常,而不处理相同t​​ry语句的其他 处理程序。除了第一个 可以命名多个 异常作为一个括号中的元组, 例如:

... except (RuntimeError, TypeError, NameError): 
...  pass 

最后一个except子句可以省略 例外姓名(或名称),以作为 通配符。以极端 谨慎使用此操作,因为以这种方式很容易掩盖 真正的编程错误!它 也可以用来打印错误 消息,然后重新引发 异常(可以使调用者来处理 异常以及):

2

个人而言,我喜欢我的第一个回答更好。但是,这个应该用更多的代码来满足你的要求。

import sys 

def get_number(a, z): 
    if a > z: 
     a, z = z, a 
    while True: 
     line = get_line('Please enter a number: ') 
     if line is None: 
      sys.exit() 
     if line: 
      number = str_to_int(line) 
      if number is None: 
       print('You must enter base 10 digits.') 
      elif a <= number <= z: 
       return number 
      else: 
       print('Your number must be in this range:', a, '-', z) 
     else: 
      print('You must enter a number.') 

def get_line(prompt): 
    sys.stdout.write(prompt) 
    sys.stdout.flush() 
    line = sys.stdin.readline() 
    if line: 
     return line[:-1] 

def str_to_int(string): 
    zero = ord('0') 
    integer = 0 
    for character in string: 
     if '0' <= character <= '9': 
      integer *= 10 
      integer += ord(character) - zero 
     else: 
      return 
    return integer 
+3

您是否需要将此代码转换为一个函数或使其不使用任何函数? – 2010-11-23 01:21:13