目录
in关键字
使用示例
判断是否包含子字符串
判断值是否在列表中存在
判断值是否在集合中存在
判断值是否在元组中存在
原理
时间复杂度
in关键字
in关键字用于判断对象A和对象B的从属关系,相较于大多数程序设计语言,in的存在使得Python代码在判断从属关系时简化了大量逻辑,使得程序结构更加清晰易懂。
使用示例
判断是否包含子字符串
if __name__ == '__main__':
demo = "I love Python"
print("Python" in demo)
# output: True
print("Python " in demo)
# output: False
判断值是否在列表中存在
if __name__ == '__main__':
demo = [1, 3, 5]
if 2 not in demo:
demo.append(2)
print(demo)
# output: [1, 3, 5, 2]
判断值是否在集合中存在
if __name__ == '__main__':
demo = {1, 3, 5}
if 2 not in demo:
demo.add(2)
print(demo)
# output: {1, 3, 5, 2}
判断值是否在元组中存在
if __name__ == '__main__':
demo = 1, 3, 5
print(2 in demo)
# output: False
原理
关键字in实际调用的是对象的__contains__方法。下面使用示例来详细说明。
我们定义一个Demo类,Demo类重写了__contains__方法,打印参数item,并返回True。在主程序中,我们实例化Demo类,生成demo对象,并打印 3 in demo的结果(附在代码注释):
class Demo(object):
def __contains__(self, item):
print("item: ", item)
return True
if __name__ == '__main__':
demo = Demo()
print(3 in demo)
# outputs:
# item: 3
# True
可以看出in关键是实际上是调用了右边对象(demo)的__contains__方法,而__contains__方法的参数item就是in关键字的左边对象(整型数字3)。这里仅仅是示例代码,因此上述的__contains__重写在实际应用中没有任何意义,甚至可能会带来一些问题:因为Demo的实例出现在in关键字右边时,总是返回True的结果。?
时间复杂度
通过前面几节内容的介绍,我们可以认为in关键字实际上是Python的一个语法糖,本质上是Python的一个方法。因此不能简单的认为in的时间复杂度为,而是要跟类中的具体实现有关。在Python中,list类的__contains__方法的时间复杂度为,set类的时间复杂度为。因为set底层是哈希表实现的,在查找效率上要优于list。在我们自己的class中,一定要保证__contains__方法的时间复杂度处于尽可能的最优解,以减少in关键字所产生的时间消耗。
|