Python - 检查用户输入确保是整数 - 无字母等
这段代码是即将到来的比赛在picoctf.com上的一个预览。我对原始代码进行了修改,使其可以接受用户输入,但我无法让测试#2正常工作。当输入一个包含至少一个字母的10个字符的字符串时,我希望它能打印出只能使用数字。目前,它试图将用户输入转换为整数值,以便与实际的序列号进行比较,但如果输入中有字母,测试就会失败,因为字母无法转换为整数值:
比如输入123456789a会出现“invalid literal for int() with base 10...”这样的错误。
我该如何修复这段代码,使其能够正确测试呢?
**
if int(serial) != serial:
print ("only numbers allowed")
print ('Failed Test 2')
**
#!/usr/bin/env python
# Your goal is to find the input that will verify your robot's serial number
#solution to keep it handy = 0933427186
serial = input ("Please enter a valid serial number from your RoboCorpIntergalactic purchase")
def check_serial(serial):
if len(serial) != 10:
print ('Failed Test 1')
return False
if int(serial) != serial:
print ("only numbers allowed")
print ('Failed Test 2')
return False
if int(serial[0])+int(serial[1]) != 9:
print ('Failed Test 3')
return False
if int(serial[2])*int(serial[3]) != 9:
print ('Failed Test 4')
return False
if int(serial[4])-int(serial[5]) != 2:
print ('Failed Test 5')
return False
if int(serial[5])%int(serial[4]) != 2:
print ('Failed Test 6')
return False
if int(serial[6])/int(serial[7]) != 7:
print ('Failed Test 7')
return False
if int(serial[8])-int(serial[9]) != 2:
print ('Failed Test 8')
return False
if int(serial[7])*int(serial[1]) != 9:
print ('Failed Test 9')
return False
if int(serial[2]) + int(serial[3]) != int(serial[9]):
print ('Failed Test 10')
return False
return True
if check_serial(serial):
print ("Thank you! Your product has been verified!")
else:
print ("I'm sorry that is incorrect. Please use a valid RoboCorpIntergalactic serial number")
3 个回答
1
try:
int(serial)
except ValueError:
print ("only numbers allowed")
print ('Failed Test 2')
try:
s_int = [int(d) for d in serial]
except ValueError:
s_int = None
print ("only numbers allowed")
print ('Failed Test 2')
或者按照Martijn的建议来做
1
如果字符串中的所有字符都是数字,并且至少有一个字符,就返回真;否则返回假。
你也可以使用正则表达式来实现这个功能:
import re;
if(re.match('\D', serial)):
print ('Failed Test 2')
5
可以使用 str.isdigit()
来检查一个字符串里的所有字符是否都是数字:
>>> 'a1'.isdigit()
False
>>> '11'.isdigit()
True
>>> '1a'.isdigit()
False
你可能想把你的 serial
字符串转换成一串整数,这样做所有的测试会更简单:
s_int = [int(d) for d in serial]
然后
if s_int[0] + s_int[1] != 9:
等等。
你可以很容易地创建一系列测试,包括索引、操作符和预期的结果:
import operator
tests = (
(0, 1, operator.add, 9),
(2, 3, operator.mul, 9),
(4, 5, operator.sub, 2),
(5, 4, operator.mod, 2),
(6, 7, operator.truediv, 7),
(8, 9, operator.sub, 2),
(7, 1, operator.mul, 9),
)
for i, (a, b, op, res) in enumerate(tests, 3):
if op(s_int[a], s_int[b]) != res:
print("Failed test {}".format(i))
return False