通过困难方式学习Python, EX35. 为什么大于10的数字返回true?
我刚刚完成了《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 个回答
我在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!")
next
是一个字符串,可以看作是字符的集合。比如说,字符串 "13" 的第一个字符是 "1";所以在 "13" 中,"1" 这个表达式是成立的。
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”在“13”这个字符串里,所以这个比较结果是对的(TRUE)。你似乎在想的是如果把next转换成整数后和1比较,这样就是数字比较,结果应该和你说的一样。