这是我目前的代码:
message = input("Enter a message: ")
etimes = 0
print("Your message is",len(message),"characters long")
print("The most common letter in the english language, 'e', is ", end="")
for letter in message:
if "e" or "E" in letter:
etimes += 1
if "e" or "E" in message:
print("in your message", etimes, "times")
else:
print("is not in your message")
为什么如果您输入的message
包含“e”,则输出声称它具有与消息一样多的“e”字符?我举个例子:
如果我输入消息“你好吗”它会回复:
“你的信息长达11个字符
英语中最常见的字母“e”在你的留言中11次“
为什么不响应: “你的信息长达11个字符 英语中最常见的字母“e”在你的留言中有1次“
因为没有
for letter in message:
if "e" or "E" in letter:
etimes += 1
一次遍历“你好吗”一个元素(字符):
letter = "h"
letter = "o"
letter = "w"
letter = " "
letter = "a"
letter = "r"
letter = "e"
letter = " "
letter = "y"
letter = "o"
letter = "u"
如果以上情况属实,则letter = "e"
应该是唯一的时间
if "e" or "E" in letter:
是true
,对吗?这意味着etimes
应该只等于一个?
答案 0 :(得分:3)
for letter in message:
if "e" or "E" in letter:
etimes += 1
将其更改为:
for letter in message:
if letter.lower() == 'e':
etimes += 1
您的代码失败,因为or
语句未按您认为的那样被读取。
if "e" or "E" in letter:
由解释器读取(伪代码):
if 'e' exists OR if 'E' in letter:
or more pseudo code
if True or if 'E' in letter:
由于or
的工作方式:
true or false = true # what your logic was producing
true or true = true
false or false = false
要正确使用or
,您必须每次都明确说明比较:
if "e" in letter or "E" in letter:
这就是为什么在比较字符串时如果大写不重要,'e'与'E'相同,就像在这种情况下一样,最好通过lower()
或{将案例改为全部相同{1}}所以你不必比较那么多东西。
答案 1 :(得分:0)
问题出在
行if "e" or "E" in letter:
条件实际上意味着("e") or ("E" in letter)
,这总是正确的,因为非空字符串在Python中被认为是真的,而<true> or <anything>
是真的。
正确的条件是
if "e" in letter or "E" in letter
以下是Python reference的相关部分:
在布尔运算的上下文中,以及表达式时 在控制流语句中使用时,将解释以下值 as false:
False
,None
,所有类型的数字零和空字符串 和容器(包括字符串,元组,列表,字典,集合 和frozensets)。所有其他值都被解释为真 ...
表达式x or y
首先评估 x ;如果 x 为真,则为其值 被退回;否则,将评估 y ,结果值为 返回。
or
的定义有另一个结果:"e" or "E" in letter
的结果实际上是"e"
,而不是True
。但是"e"
被解释为真,所以条件仍然满足。