2015-05-14 76 views
0

我试图设置下面的代码,要求用户输入两个整数(num_sides & num_rolls)。如果用户没有输入任何一个输入的整数,那么代码应该打印“输入一个整数”语句。Python:如果...和...不按预期工作

我发现这个代码只测试num_sides,但不测试如果num_rolls是一个整数。这里发生了什么?

在此先感谢您的帮助!

def rolldice(): 
    while True: 
     while True: 
      num_sides = input("Enter number of sides for die: ") 
      num_rolls = input("Enter number of rolls for die: ") 
      try: 
       if int(num_sides) != num_sides or int(num_rolls) != num_rolls: 
        break 
       break 
      except(ValueError): 
       print("Enter an integer") 
       True 
+4

多么奇怪的循环。对于初学者来说,'num_sides'被转换为'int',并与原始形式(一个字符串)进行比较,这将永远不会成为“真”。 – Makoto

+0

为什么你在'if'之内和之外都有'break'?你认为自己的“真”是为了你自己吗? – user2357112

+0

一些答案只是测试它们*是否可以被转换为int。你还试图检查数字是整数还是不重要?我的意思是,如果某人放入3.3,你是否希望它抛出一个异常(测试数字是一个*整数*)还是只投射到3(这是当前答案的作用)? – leekaiinthesky

回答

2

为什么你有一个嵌套循环? (二while True一个另一个内部)

下面的代码更简单,应该工作:

def rolldice(): 
    while True: 
     num_sides = input("Enter number of sides for die: ") 
     num_rolls = input("Enter number of rolls for die: ") 
     try: 
      int(num_sides) 
      int(num_rolls) 
      break 
     except ValueError: 
      print("Enter an integer") 

如果同时int评估并没有崩溃,则执行break,你可以退出循环。

由于这是一个函数,因此您可能希望在函数的末尾返回(num_sides, num_rolls),以便它们不会丢失。 (你也可以用return代替break,它同时也会有效地停止这个功能)

除非这只是你的代码的开始,否则不必介意我刚才所说的。 :)

+0

对,代码还有更多......但与我的问题无关。感谢您的帮助 – MK2009

0

您可以只投int,然后检查ValueError

def rolldice(): 
    while True: 
     try: 
      num_sides = int(input("Enter number of sides for die: ")) 
      num_rolls = int(input("Enter number of rolls for die: ")) 
      break 
     except ValueError: 
      print("Enter an integer") 

>>> rolldice() 
Enter number of sides for die: 5 
Enter number of rolls for die: foo 
Enter an integer 
Enter number of sides for die: foo 
Enter an integer 
Enter number of sides for die: bar 
Enter an integer 
Enter number of sides for die: 1 
Enter number of rolls for die: 2 
>>> 
+0

使用['''isinstance()'''](https://docs.python.org/3/library/functions.html#isinstance)来检查/确认一个对象的类型。 – wwii

+0

比我的版本更短。表现与我的版本有点不同,我坚持使用OP的格式,但这也非常好! – JeromeJ

+0

@wwii不是很pythonic我会说('is_instance'一般,主要是因为“鸭子打字”)。 – JeromeJ