如果我定义:
def hasNoX_2(s):
if type(s)!=str:
return False
for c in s:
if c!='x' or c!='X':
return True
return False
然后输入
hasNoX_2('Xenon')
,返回True
,我不知道为什么。第一个 If 语句中没有返回任何内容,因为如果 False
不是字符串,它只返回 s
。那么,当 for 循环说“嘿,我没有看到 'x'
或 'X'
,所以我可以返回 True
?”时,它在“看”什么?”
让我们只关注 if 语句
if c!='x' or c!='X':
这是一个包含两项的布尔表达式
c != 'x'
和c != 'X'
当您使用
or
运算符时,如果任一术语的计算结果为 True,则整个表达式的计算结果为 True。如果表达式的计算结果为 True,则执行 if
语句的主体(在本例中为 return True
)。
这是
or
表达式(A 或 B)的标准真值表
A or B | A = False | A = True |
----------------------------------
| B = False | False | True |
| B = True | True | True |
如您所见,如果两项均为 False,则结果为
False
仅
让我们看看您的表达式如何针对每种类型的输入进行计算
c | c != 'x' | c != 'X' | or expression |
----------------------------------------------------------
'x' | False | True | True |
'X' | True | False | True |
any other character | True | True | True |
简而言之,你的表达式将始终评估为 True - 并且
if
分支将始终被采用。
因此,当函数检查提供的字符串中的第一个字符时,它会
return True
。
此函数返回 False 的唯一方法是
str
以外的其他内容for
循环。如果输入字符串中的所有字符不等于“x”或“X”,我假设您尝试实现 True。
如果是这样,您可以简单地使用以下代码:
def hasNoX_2(s):
if isinstance(s, str):
return 'x' not in s.lower()
return False
print(hasNoX_2('Xenon'))
print(hasNoX_2('eenon'))
您在 for 循环中迭代字符串中的每个字符。所以它会关注每个角色。几乎你的循环正在寻找那些 if 语句何时为真。
但是,使用 or 如果其中一个为真,则整个条件评估为 true,因此使用 and 来确保这两个语句都为 true
所以基本上你可以一次扫描一个字符串的字符,直到找到“x”或“X”,然后返回 false。如果您到达迭代字符串字符的循环末尾,那么这将是返回 True 的好机会,因为无论如何都没有找到“x”或“X”。
所以你的新代码看起来像这样:
def hasNoX_2(s): 如果类型!=str: 返回错误 对于 s 中的 c: 如果 c=='x' 或 c=='X': 返回错误 返回真