谈谈Python中的in

https://docs.python.org/zh-cn/3.9/reference/expressions.html#membership-test-operations 6.10.2 成员检测运算

运算符 in 和 not in

  • 这2个运算符用来做成员检测

  • 所有内置序列和集合类型以及字典都支持此运算,对于字典来说 in 检测其是否有给定的键.

  • 对于 list, tuple, set, frozenset, dict 或 collections.deque 这样的容器类型,表达式 x in y 等价于 any(x is e or x == e for e in y)

  • 示例1

    if 1 in [1,2] and 1 in (1,2) and 1 in {1,2} and 1 in frozenset([1,2]) and 1 in {1:2}:
        print('容器类型,注意字典是key')  # 会打印
    
    any(1 == e for e in [1,2,3])          # True
    any(None is  e for e in [1,None,3])   # True 
    
  • 对于字符串和字节串类型来说,当且仅当 xy 的子串时 x in yTrue。 一个等价的检测是 y.find(x) != -1空字符串总是被视为任何其他字符串的子串,因此 "" in "abc" 将返回 True

  • 示例2

    print('a' in 'ab')   # True
    
    'ab'.find('c')   # -1
    'ab'.find('a')    # 0 返回a在ab中的索引,第一个匹配的
    
    '' in 'abc'   # 总是成立的 True
    

contains 魔术方法

  • 定义了 __contains__() 方法的用户自定义类来说,如果 y.__contains__(x) 返回真值则 x in y 返回 True,否则返回 False

  • 示例3

    class A:
        name_list = ['nanjing','suzhou','wuxi']
        def __contains__(self,name):
            return True if name in self.name_list else False
        
    a = A()
    print(a.__contains__('wuxi'))   # True
    
    print('suzhou' in a)  # True
    

iter魔术方法

  • 对于未定义 __contains__() 但定义了 __iter__() 的用户自定义类来说,如果在对 y 进行迭代时产生了值 z 使得表达式 x is z or x == z 为真,则 x in yTrue。 如果在迭代期间引发了异常,则等同于 in 引发了该异常
class  B:
    def __iter__(self):
        yield 1
        yield 2
b = B()
for _ in b:
    print(_)   # 控制台输出 1 和 2  , 迭代器相关概念,此处不表
1 in b      # True

getitem 魔术方法

  • 最后将会尝试旧式的迭代协议:如果一个类定义了 __getitem__(),则当且仅当存在非负整数索引号 i 使得 x is y[i] or x == y[i] 并且没有更小的索引号引发 IndexError 异常时 x in yTrue。 (如果引发了任何其他异常,则等同于 in 引发了该异常)

  • 示例demo

    class C:
        def __init__(self):
            self.name_list = {0:'0',1:'1',2:'2'}
        def __getitem__(self,key):
            return self.name_list[key]
        
    c = C()
    print('0' in c)    # True
    
    print(0 in c)    # 触发以下异常
    
    
    KeyError                                  Traceback (most recent call last)
    <ipython-input-27-98246d278563> in <module>
          7 c = C()
          8 print('0' in c)
    ----> 9 print(0 in c)
         10 
    
    <ipython-input-27-98246d278563> in __getitem__(self, key)
          3         self.name_list = {0:'0',1:'1',2:'2'}
          4     def __getitem__(self,key):
    ----> 5         return self.name_list[key]
          6 
          7 c = C()
    
    KeyError: 3
    

说在最后

  • 本文对in的做法稍作拓展,not in是反向操作不展开
  • 至于魔术方法iter和getitem,后面有机会再细讲
  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuxianfeng023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值