谈谈Python中的in

本文详细介绍了Python中in和notin运算符在进行成员检测时的应用,涵盖了内置序列、集合、字典、字符串的操作,以及用户自定义类的contains、iter和getitem魔术方法的使用。
摘要由CSDN通过智能技术生成

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,后面有机会再细讲
Python CW(Continuous Wave,连续波)通信是利用 Python 编程语言实现的一种通信方式,它主要用于发送和接收 CW 信号,即莫尔斯码(Morse code)。CW 通信是一种基于短脉冲和长脉冲的编码方式,通过发送不同长度的脉冲来表示不同的字母、数字和符号。 在 Python ,可以使用外部硬件设备(如电键、电报机等)或者通过软件模拟器来实现 CW 通信。下面是一个简单的示例代码,展示了如何使用 Python CW 模块来发送 CW 信号: ```python import cwtone # 发送 CW 信号 def send_cw(message): cw = cwtone.CwTone() cw.set_speed(20) # 设置 CW 速度为 20 字符/分钟 for char in message: cw.send(char) # 发送每个字符 cw.delay_char() # 延迟字符时间 cw.end() # 结束 CW 信号发送 # 主程序 if __name__ == '__main__': message = "HELLO WORLD" send_cw(message) ``` 在上述代码,`cwtone` 模块提供了 CW 通信的功能。我们创建了一个 `CwTone` 对象,并设置 CW 的速度为 20 字符/分钟(可以根据需要进行调整)。然后,使用 `send()` 方法逐个字符发送 CW 信号,并使用 `delay_char()` 方法延迟字符时间。最后,使用 `end()` 方法结束 CW 信号发送。 需要注意的是,上述示例代码仅展示了如何发送 CW 信号。如果你希望接收 CW 信号,需要使用适当的硬件设备或软件来接收和解码 CW 信号。 希望这个简单的示例能帮助你了解 Python CW 通信的基本原理和用法!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wuxianfeng023

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

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

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

打赏作者

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

抵扣说明:

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

余额充值