例如,我想确定列表A中是否有某个数字a。如果我使用return a in A
,这比编写像这样的迭代函数要快得多
for number in A:
if a == number:
return True
内幕是什么? Python是否使用其他方式来确定成员资格?我浏览了Python documentation,但找不到答案。
答案 0 :(得分:0)
6.10.2。成员资格测试操作
对于列表,元组,集合,frozenset,dict或collections.deque等容器类型,表达式x in y
等效于any(x is e or x == e for e in y)
。
对于字符串和字节类型,当且仅当x是y的子字符串时,x in y
才是True
。等效测试为y.find(x) != -1
。空字符串始终被认为是任何其他字符串的子字符串,因此"" in "abc"
将返回True
。
对于定义__contains__()
方法的用户定义类,如果x in y
返回真值,True
返回y.__contains__(x)
,否则返回False
。
对于没有定义__contains__()
但定义了__iter__()
的用户定义类,如果x in y
中包含某个值True
,z
为x == z
}是在y
上迭代时产生的。如果在迭代过程中引发了异常,就好像in
引发了该异常。
最后,尝试使用旧式的迭代协议:如果一个类定义了__getitem__()
,则且仅当存在非负整数索引{{1时,x in y
才是True
}},这样i
和所有较低的整数索引都不会引发IndexError异常。 (如果引发了任何其他异常,则好像引发了该异常一样。)
从Python官方页面上提取的信息:https://docs.python.org/3/reference/expressions.html