说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
运算符 in 和 not in 用于成员检测操作,即判断一个元素是不是容器全集中的一员,如果是,返回 True,否则返回 False。容器类型均支持成员检测运算,在类型内部可以实现 __contains__()
特殊方法来支持成员检测。对于字符串来说,成员检测计算的是它是否为目标的子字符串。空字符串是所有字符串的子字符串。
成员检测也是 Python 比较运算 的一种。
以下是成员检测的一些示例:
'a' in 'abc'
# True
'ab' in 'abc'
# True
'ac' in 'abc'
# False
'' in 'abc'
# True
'' in ''
# True
2 in range(4)
# True
4 not in range(4)
# True
'abb' in ['abc', 'efg']
# False
'ac' in ['abc', 'efg']
# False
['abc', 'efg'][0] in ['abc', 'efg']
# True
('abc') in ('abc', 'efg', 'hij')
# True
('abc', 'hij') in ('abc', 'efg', 'hij')
# False
('abc', 'efg') in (('abc', 'efg'), 'hij')
# True
'a' in {'a': 'b', 'c': 'd'}
# True
'b' in {'a': 'b', 'c': 'd'}
# False
# 字典与字典不能进行成员检测
# {'a': 'b'} in {'a': 'b', 'c': 'd'}
# TypeError: unhashable type: 'dict'
'a' in {'a', 'b'}
# True
要注意的是字典检测的成员是键。
我们定义一个价格区间类型,然后让一个金额(数值类型)与它进行成员检测计算,来判断此金额是否在金额区间内。代码如下:
class PriceRange:
def __init__(self, low, high):
self.low = low
self.high = high
def __contains__(self, value):
return self.low <= value <= self.high
pr = PriceRange(10, 20)
15 in pr
# True
21 in pr
# False
9 not in pr
# True
通过 __contains__()
特殊方法就让对象支持了 in 运算符的运算。
在处理数据量大且需要频繁进行 in 操作时,最好使用集合和字典,这样将会大幅提升处理速度。
运算符 in 和 not in 用于成员检测。 如果 x 是 s 的成员则 x in s 求值为 True,否则为 False。 x not in s 返回 x in s 取反后的值。 所有内置序列和集合类型以及字典都支持此运算,对于字典来说 in 检测其是否有给定的键。 对于 list, tuple, set, 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__()
方法的用户自定义类来说,如果 y.__contains__(x)
返回真值则 x in y 返回 True,否则返回 False。
对于未定义 __contains__()
但定义了 __iter__()
的用户自定义类来说,如果在对 y 进行迭代时产生了值 z 使得表达式 x is z or x == z
为真,则 x in y
为 True。 如果在迭代期间引发了异常,则等同于 in 引发了该异常。
最后将会尝试旧式的迭代协议:如果一个类定义了 __getitem__()
,则当且仅当存在非负整数索引号 i 使得 x is y[i] or x == y[i]
并且没有更小的索引号引发 IndexError 异常时 x in y 为 True。 (如果引发了任何其他异常,则等同于 in 引发了该异常)。
运算符 not in 被定义为具有与 in 相反的逻辑值。
更新时间:Sept. 18, 2023, 6:44 p.m. 标签:python 成员检测