在迈克尔道森的书“绝对初学者的Python编程”中,有一章关于制作二十一点游戏。游戏分为3个不同的文件:
cards.py
模块与基本纸牌游戏课程(卡,手,甲板)games.py
模块,包含基本的Player类和2个函数 - ask_number()
,ask_yes_no()
blackjack.py
包含运行游戏的代码,还有一些类继承自cards.py
和games.py
我正在尝试在ask_number()
内的函数games.py
中实现异常处理。这个功能最初是:
def ask_number(question, low, high):
response = None
while response not in range(low, high):
response = int(input(question))
return response
此函数在blackjack.py
的{{1}}开头调用,如下所示:
main()
在模块中的函数中,我想检查是否输入了数字,如果输入无法转换为整数,则输入正确的值,直到我输入正确的值,因此函数返回一个整数。我做了什么:
import games
import cards
...
def main():
...
names = []
number = games.ask_number("How many players? (1 - 7): ", low=1, high=8)
for i in range(number):
name = input("Enter player name: ")
names.append(name)
当我在模块def ask_number(question, low, high):
response = None
while response not in range(low, high):
try:
response = int(input(question))
except ValueError:
print("Looks like it's not a number!")
else:
return response
中调用函数时,这很有用。但是当在games.py
函数中的blackjack.py
内调用时,如果我输入任何数字而不是数字,它仍然会引发ValueError,好像没有尝试/除了:
main()
我无法理解为什么。我错过了什么?
答案 0 :(得分:0)
嗯,当您使用for
进行range()
循环时,括号中的任何内容都必须是整数。没有浮点数(小数)或字符串(str
)。由于s
是一个字符串,因此会自动引发错误。例如,当x
具有整数时,以下内容将起作用:
x = 10
for i in range(x):
print i
但如果x
是一个字符串,那么它将不起作用:
x = 'This does not work at all!!!'
for i in range(x):
print i
因此,您需要确保代码中的number
在通过添加另一个for
和try
块进入except
循环之前是一个整数:< / p>
import games
import cards
...
def main():
...
names = []
number = games.ask_number("How many players? (1 - 7): ", low=1, high=8)
try:
test = int(number) #See if number is an integer
except ValueError:
print('That is not a number! Please type in a whole number.') #Tell user to type in an integer
else:
pass #Skip to next line, don't do anything else
for i in range(number):
name = input("Enter player name: ")
names.append(name)