Python - 字符串比较函数
def name(x): return x==('Jenson'or'Amra'or'McCay'or'Spinner'or'Jones') print(name('Jenson')) print(name('McCay'))
这是一个问题:
“写一个函数,输入一个人的名字(比如说‘smith’、‘jones’等)。这个函数应该检查这个名字是否是五个特定名字之一。这五个名字是:‘Jenson’、‘Amra’、‘McCay’、‘Spinner’和‘Jones’。如果输入的名字是这五个名字中的一个,函数就应该返回布尔值True;如果不是,就返回False。(记得加上输入类型、描述和测试案例的注释)测试这个函数,确保它能正常工作。”
如果我输入‘Jenson’,它能正常工作,但如果我输入其他名字,就会返回False。
4 个回答
我想发生的情况是,('Jenson'or'Amra'or'McCay'or'Spinner'or'Jones')
这个部分会先被计算,结果是 'Jenson'
。这个计算是在 x
被考虑之前就完成了,因为它被放在了括号里。接着,程序会检查 x
是否等于 'Jenson'
。你需要使用更高级的写法,比如 x in...
,就像Adem的回答那样,或者使用 return x == 'Jenson' or x == 'Amra' or x == 'McCay'...
,这样每个比较就会一个接一个地进行。
试试这样做,
def name(x):
return x in ('Jenson', 'Amra' ,'McCay', 'Spinner','Jones')
那我们来看看“长一点”的方法:
def check_name(x):
names_to_check = ('Jenson','Amra','McCay','Spinner','Jones')
for i in names_to_check:
if i == x:
return True
return False
你的代码里发生了什么:
x = 'Jenson'
,因为这就是你传入的值。
这一行 x == ('Jenson' or 'Amra' or 'McCay' or 'Jones')
实际上是在进行一个布尔运算,而这个运算的结果总是 Jenson
。
布尔运算是用来检查“真值”的,在Python中,非空字符串总是被认为是 True
。所以实际上 ('Jenson' or 'Amra' or 'McCay' or 'Jones')
的意思是:
“无论是 Jenson
还是 Amra
、McCay
还是 Jones
,只要有一个是 True
,就把值设为那个。”
因为 Jenson
是第一个项,并且它是 True
(也就是说,它不是空字符串),所以整个表达式的结果就是 Jenson
(这就是为什么只有传入 Jenson
时它才有效)。
一个简单的例子:
>>> ('a' or 'b' or 'c')
'a'
>>> ('b' or 'a' or 'c')
'b'
>>> ('' or '' or 'a')
'a'
>>> (0 or 0 or 1)
1
>>> (False or False or True)
True
最后三个例子说明了同样的比较。我在检查两个空字符串和 'a'
。因为空字符串在Python中被认为是 False
,所以唯一“为真”的就是 'a'
,这就是返回的结果,就像我在比较 0
和 1
一样。