【问题标题】:Loop does not function properly (python 3.4)循环无法正常运行(python 3.4)
【发布时间】:2015-05-16 14:53:22
【问题描述】:

我正在尝试制作一个程序来判断输入的车牌是否有效。 我希望程序在输入的输入中一一找到每个字符的索引。 我创建了三个函数,因为数字会弄乱索引,所以每个函数都打算达到一定的长度然后停止。

我还希望程序进入一个循环,直到满足某个条件。当您输入一个不满足条件的字符串时,程序确实进入循环。但是,即使您将某些输入字符写成小写,循环也会中断。

例如,如果我写 'nl03LUD' 程序告诉我再试一次,当我写 'NL03lud' 时它不会告诉我再试一次。

对不起,我的英语不好,我不知道如何解释,如果你不明白,python可视化器会让我的解释更清楚。

任何修改和反馈将不胜感激

这是我的程序:

import sys
def lengthchecker(licenseplate):
    length = len(licenseplate)
    if length == 7:
        return('Length of license plate is valid')
    while length is not 7:
        sys.exit('Length of license plate not valid')

licenseplate = str(input('Enter your license plate, do not include space in between, enter in uppercase. \n'))
print(lengthchecker(licenseplate))

def checkletter1(licenseplate):
    x = True
    a = 0
    while 0 <= a <= 1:
        letter = licenseplate[a]
        index = ord(letter)
        if 65 <= index <= 90:
            a = (a + 1)
        else:
            x = False
            return x
    return x

def checkletter2(licenseplate):
    y = True
    b = 2
    while 2 <= b <= 3:
        letter1 = licenseplate[b]
        index1 = ord(letter1)
        if 48 <= index1 <= 57:
            b = (b + 1)
        else:
            y = False
            return y
    return y

def checkletter3(licenseplate):
    z = True
    c = 4
    while 4 <= c <=6:
        letter2 = licenseplate[c]
        index2 = ord(letter2)
        if 65 <= index2 <= 90:
            c = (c + 1)
        else:
            z = False
            return z
    return z

x = checkletter1(licenseplate)
if x is True:
    print('The first two letters you have entered is valid')

while x is False:
    licenseplate = str(input('Enter your license plate again \n'))
    x = checkletter1(licenseplate)

y = checkletter2(licenseplate)
if y is True:
    print('The third to fifth letters you have entered is valid')

while y is False:
    licenseplate = str(input('Enter your license plate again \n'))
    y = checkletter2(licenseplate)

z = checkletter3(licenseplate)
if z is True:
    print('The last three letters you have entered is valid')

while z is False:
    licenseplate = str(input('Enter your license plate again \n'))
    z = checkletter3(licenseplate)

【问题讨论】:

    标签: python while-loop boolean python-3.4


    【解决方案1】:

    这是因为在大写字母上使用ord 将返回与在小写字母上不同的值。例如:

    >>> ord('A')
    >>> 65
    >>> ord('a')
    >>> 97
    

    【讨论】:

    • 您需要在输入时使用str.upper()。尝试将.upper() 添加到输入行的末尾。
    【解决方案2】:

    我已将您的程序修改为更 Python 的方式:

    import sys
    def length_check(licenseplatenumber):
        if len(licenseplatenumber) != 7:
            print 'The license plate length should be 7'
            return False
    
        return True
    
    def validate(licenseplatenumber):
        for index,char in enumerate(licenseplatenumber):
            if index == 0 or index == 1 :
                if 65 <= ord(char) <= 90:
                    continue
                else :
                    print 'Either of first two letters you have entered is NOT valid'
                    return False
    
            if index == 2 or index == 3:
                if 48 <= ord(char) <= 57:
                    continue
                else:
                    print 'Either of third or fourth letters you have entered is NOT valid'
                    return False
    
            if index == 4 or index == 5 or index == 6 :
                if 65 <= ord(char) <= 90:
                    continue
                else:
                    print 'Either of last three chars you have entered is NOT valid'
                    return False
    
        return True
    
    while True:
        licenseplatenumber = str(input('Enter your license plate, '
                                       'do not include space in between, enter in uppercase. \n'))
        if length_check(licenseplatenumber):
            if validate(licenseplatenumber):
                print '%s is a valid license plate' %(licenseplatenumber)
                break
    

    【讨论】:

    • 这不是解决方案。
    • 这个 while 循环一直运行直到它被 'break' 中断。在这里,它仅适用于有效车牌。如果您在遍历字符串时需要访问索引,请使用 enumerate(): >>> for i, c in enumerate('test'): ... print i, c ... 0 t 1 e 2 s 3吨
    猜你喜欢
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    相关资源
    最近更新 更多