尝试让这个Python程序运行

2 投票
3 回答
534 浏览
提问于 2025-04-17 23:53

我想做的事情是这样的。我在电脑上创建了很多文件夹,放在一个特殊的目录里,用来隐藏一些东西。我有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

把这个放在你代码的开头应该就能正常工作。你的代码当然可以写得更简洁,但这不是我来纠正你的地方。

撰写回答