Python .lower()在显示0时返回True

Python .lower()在显示0时返回True,python,string,Python,String,我正在尝试完成一项任务,以确保字符串中的所有字符满足以下条件: 可被4整除的 字符串中包含“A1” 字符串只包含大写和数字 对于大多数字符串,该函数起作用;但是,当显示0时,我返回一个falsefalse 如输出所示,该问题局限于for循环(for character in string:) def valid_product_code(string): if len(string) % 4 == 0: print("String is divisible by 4") if

我正在尝试完成一项任务,以确保字符串中的所有字符满足以下条件:

  • 可被4整除的
  • 字符串中包含“A1”

  • 字符串只包含大写和数字
对于大多数字符串,该函数起作用;但是,当显示0时,我返回一个false
false

如输出所示,该问题局限于for循环(
for character in string:

def valid_product_code(string):
if len(string) % 4 == 0:
    print("String is divisible by 4")
    if "A1" in string:
        print("A1 is contained within string")
        for character in string:
            print(character)
            if character == character.lower():
                print("Character is a Lowercase")
                return False
            elif character == ("!"or "." or "," or ":"):
                print("Character is punct")
                return False
            else:
                return True
    else:
        return False
else:
    return False
打印(有效的产品代码(“0O3LG6EWN7AA1NI596LCVBRZ”))

代码的输出如下所示:

String is divisible by 4
A1 is contained within string
0
Character is a Lowercase
False

您需要使用
if character.islower():
而不是
if character==character.lower():
,因为
'0'.lower()='0'
,这样,如果字符串包含任何数字,if语句(
if character==character.lower():
)将始终返回
true
,如果字符串包含任何数字

简短的答案是
'0'.lower()='0'
。您不应该检查坏字符(例如小写字母或标点符号),而应该用Python描述好字符的含义

在这种情况下,成为一个好的角色仅仅意味着

'A' <= character <= 'Z' or '0' <= character <= '9'

'A'你所做的是不符合pythonic的。如果character==character.lower():
,请使用
.islower()
,而不是使用


.islower()
当字符串中没有大写字母且至少有一个小写字母时,返回
True
。这与所有字符都是字母不同。

“字符串只包含大写字母和数字”只检查大写字母,不检查数字。为什么假设代码接受数字?只要一个字符通过测试,循环就会返回
True
。“你确定那是对的吗?”Mistermiagi我确实检查了大写字母你是对的;但是,如果出现数字,则应由“else”处理以返回True。我的问题是,当显示一个数字时,为什么字符.lower()为True(因此返回False)。@Glenchamberlain如果您的问题是“why is
'0”。lower()='0'
?”,您应该回答这个问题来说明这一点。这个问题目前有很多解释,从“为什么它不工作?”到“应该如何编写它?”。如果character==(“!”或“.”或“.”或“:”):
,则测试这一行
字符的各种值;你会对结果感到惊讶。如果字符位于(“!”、“、”、“:”)中,则工作(!)替换行将是
无需使用
ord
范围。字符通过其Unicode/ASCII数字进行比较<代码>'A'。。。那么string.ascii_大写+string.digits
中的字符如何呢。这只是对方法的错误使用。