已发过的“坑”请参考Python函数默认值参数的2个坑,Python编程中一定要注意的那些“坑”(一),Python编程中一定要注意的那些“坑”(二),Python中一定要注意的那些“坑”(三)。
今天来说说关键字False的“坑”。先来看一段代码:
>>> def find(lst, e):
if e in lst:
return lst.index(e)
else:
return False
>>> def main(lst, e):
r = find(lst, e)
if r != False:
print(lst[r])
else:
print('not exist')
>>> main(list(range(5)), 5)
not exist
>>> main(list(range(5)), 0)
not exist
上面的函数find()用来测试列表lst中是否包含元素e,如果包含就返回其首次出现的下标,否则返回False表示不存在。函数main()调用函数find(),如果find()函数返回False则认为列表lst中不包含元素e,否则就认为包含并输出该位置上的元素。
思路看起来很自然,但很明显最后一个结果是错的。原因在于,Python内部把False和0认为是等价的,而把True和1认为是等价的,但作为条件表达式时把非0的数字(哪怕是负数)认为和True是等价的。例如:
>>> not 0
True
>>> not False
True
>>> not (-3)
False
>>> not 5
False
>>> lst = list(range(5))
>>> lst[0]
0
>>> lst[False]
0
>>> False + 3
3
>>> True + 3
4
>>> 0 == False
True
>>> 1 == True
True
>>> 3 == True
False
让我们回到本文最初的问题,既然这里有个坑,那正确的代码应该怎么写呢?那就要学学Python字符串对象的find()和rfind()方法了,如果包含就返回其首次出现位置,如果不包含就返回-1,而不是False。
>>> 'abcd'.find('a')
0
>>> 'abcd'.find('e')
-1
最后留个小思考题:下面表达式的值是什么,原理是啥?
eval('*'.join(map(str, range(1, 7))))