尝试让这个Python程序运行
我想做的事情是这样的。我在电脑上创建了很多文件夹,放在一个特殊的目录里,用来隐藏一些东西。我有4层文件夹,每个文件夹里面又有编号为1到4的子文件夹。
举个例子:
1>1>1>1
1>1>1>2
...
1>2>1>1
...
4>1>1>1
...
4>4>4>4
我写了一个Python程序,它会询问一个密码,然后打开与这个密码对应的文件目录。[比如,密码4322会打开4>3>2>2这个路径]。我遇到的唯一问题是,我无法限制输入只能是1到4之间的数字,当我输入一个不在这个范围的数字时,居然会打开互联网浏览器(真是让人无奈!IE)。
这是我的代码……(Python 2.7.6)
pin=str(raw_input("What is your 4-digit pin number? "))
intpin=int(pin)
#==============##==============#
pin1=pin[0:1]
pin2=pin[1:2]
pin3=pin[2:3]
pin4=pin[3:4]
#==============##==============#
ipin1=int(pin1)
ipin2=int(pin2)
ipin3=int(pin3)
ipin4=int(pin4)
#==============##==============#
print("")
print pin1
print pin2
print("")
path=("D:/Documents/Personal/"+pin1+"/"+pin2+"/"+pin3+"/"+pin4)
import webbrowser as wb
wb.open(path)
#==============##==============#
print("Thank You!")
print("Your window has opened, now please close this one...")
3 个回答
1
首先,raw_input
无论你输入什么,都会把它当成字符串输出,就算你输入的是数字也一样。所以你不需要用 str(raw_input...
来转换。下面是证明:
>>> d = raw_input("What is your 4-digit number? ")
What is your 4-digit number? 5
>>> print type(d)
<type 'str'>
其次,之前的答案并没有防止输入超过4位数的情况。比如输入 12341234
也会被接受,因为它没有检查输入字符串的长度。
这里有一个解决办法,不是检查字符串本身,而是检查它转换成整数后的值。你想要的范围是 [1111, 4444]
。在这个情况下,可以使用 assert
来确保输入在这个范围内,如果输入低于或高于这个范围,就会抛出一个错误。不过,这样做的一个缺点是,像 1111.4
这样的输入也会被接受,因为它在范围检查时是有效的,但在转换时会因为值错误而失败。
考虑到以上这些,这里有一个你代码的替代方案。
def is_valid(strnum):
# Returns false when inputs like 1.2 are given.
try:
intnum = int(strnum)
except ValueError, e:
return False
# Check the integer equivalent if it's within the range.
if 1111 <= intnum <= 4444:
return True
else: return False
strnum = raw_input("What is your 4-digit PIN?\n>> ")
# print is_valid(strnum)
if is_valid:
# Your code here...
接下来是一些测试:
# On decimal/float-type inputs.
>>>
What is your 4-digit PIN?
>> 1.2
False
>>>
# On below or above the range wanted.
>>>
What is your 4-digit PIN?
>> 5555
False
>>>
What is your 4-digit PIN?
>> 1110
False
>>>
What is your 4-digit PIN?
>> 1234
True
>>>
希望这些对你有帮助。
1
你可以使用正则表达式。正则表达式总是个好帮手。
import re
if not re.match("^([1-4])([1-4])([1-4])([1-4])$", pin):
print "Well that's not your pin, is it?"
import sys
sys.exit()
1
你可以检查输入,确保所有的输入都是1到4之间的数字:
bol = False
while bol == False:
pin=str(raw_input("What is your 4-digit pin number? "))
for digit in pin:
if int(digit) in [1,2,3,4]:
bol = True
else:
print "invalid pin"
bol = False
break
把这个放在你代码的开头应该就能正常工作。你的代码当然可以写得更简洁,但这不是我来纠正你的地方。