通过困难方式学习Python, EX35. 为什么大于10的数字返回true?

0 投票
4 回答
1328 浏览
提问于 2025-04-17 22:24

我刚刚完成了《Learn Python the Hard Way》的第35个练习,链接在这里:http://learnpythonthehardway.org/book/ex35.html

下面这个函数就是来自那个练习。我意识到它有问题,因为它只检查“next”是不是“0”或者“1”,而没有检查其他数字(比如用.isdigit()之类的方法)。这样一来,对于任何大于1但小于10的输入,就会出错。

不过,对于输入10或更大的数字,它似乎工作得很好。例如,如果我输入“13”,显然它既不是“0”也不是“1”,但是这个判断“if '0' in next or '1' in next:”却返回了真,这怎么可能呢?

def gold_room():
print "这个房间里满是黄金。你打算拿多少?"

next = raw_input("> ")
if "0" in next or "1" in next:
    how_much = int(next)
else:
    dead("Man, learn to type a number.")

if how_much < 50:
    print "Nice, you're not greedy, you win!"
    exit(0)
else:
    dead("You greedy bastard!")

4 个回答

1

我在gold_room这个函数的代码上遇到了语法错误。Zed让我们修改基础代码,但我尝试添加一些特定的结果时,程序就出错了。问题出现在“if how_much == 68:”这一行...

def gold_room():
    print "This room is full of gold.  How much do you take?"

    choice = raw_input("> ")
    if choice.isdigit():
        how_much = int(choice)
    else:
        dead("Man, learn to type a number. But you can't, because you're dead.")

    if how_much == 68:
        print "Awwwww yea, you crazy."
    elif how_much < 50:
        print "Nice, you're not greedy, you win!"
        exit(0)
    else:
        dead("You greedy bastard!")
1

next 是一个字符串,可以看作是字符的集合。比如说,字符串 "13" 的第一个字符是 "1";所以在 "13" 中,"1" 这个表达式是成立的。

5

raw_input() 会返回一个字符串。表达式 '0' in string or '1' in string 会进行两次子字符串查找。比如 '1' in '9999' 的结果是 False,所以大于等于 10 的数字也可能会通过这个测试失败。

这个练习想告诉你,你需要检查 raw_input() 返回的字符串是否是合法的数字格式,并用下面的方式将其转换为 int 值:

try:
    how_much = int(next)
except ValueError:
    dead("Man, learn to type a number.")

注意:记住哪些操作可能会引发哪些异常是学习 Python 时一个很重要的主题。大多数教程对此没有强调得够。初学者应该记住:

  • int('x') 会引发 ValueError
  • {}['KEY'] 会引发 KeyError
  • [][0] 会引发 IndexError

在编写任何将字符串转换为数字,或者使用列表或字典的 Python 代码时,这些都是需要注意的。

1

你正在进行字符串比较。字符“1”在“13”这个字符串里,所以这个比较结果是对的(TRUE)。你似乎在想的是如果把next转换成整数后和1比较,这样就是数字比较,结果应该和你说的一样。

撰写回答