为什么此代码仅在输入全部为大写字母时才起作用?

Jak*_*ann 5 python string python-3.x

经过一段时间的研究,我一直无法找到为什么这个代码在它们全部大写时会在句子中计算"0"大写字母,但是如果我要输入一个包含任何小写字母的句子,那么它将计算大写字母,例如作为:"Hello World".

message = input("Enter your sentence: ")

print("Capital Letters: ", sum(1 for c in message if message.isupper()))
Run Code Online (Sandbox Code Playgroud)

Jim*_*ard 9

因为你的if条款中的条件有缺陷; 如果给定字符串中的所有字符都是大写,则isupper返回该方法:True

>>> "UPPER".isupper()
True
>>> "UPPEr".isupper()
False
Run Code Online (Sandbox Code Playgroud)

请参阅以下文档str.isupper:

返回True 如果所有套管字符str都是大写的,并至少有一个在套管字符str,False否则.

(强调我的)

由于你正在检查message,message.isupper(()这将返回False所有时间导致总和0.

相反,与完整的邮件检查message.isupper(),使用if在每个字符的基础上与if c.isupper()每一个cmessage:

print("Capital Letters: ", sum(1 for c in message if c.isupper()))
Run Code Online (Sandbox Code Playgroud)

你也可以利用这一事实的优势True就像1False喜欢0稍微减少下来,如果你想:

print("Capital Letters: ", sum(c.isupper() for c in message))
Run Code Online (Sandbox Code Playgroud)

或者,如果您喜欢功能方法,map则输入的功能如下:

print("Capital Letters: ", sum(map(str.isupper, message)))
Run Code Online (Sandbox Code Playgroud)

即使这些主观上可能看起来更好; 它们通常比原始方法更神秘(效率也略低).