浅谈Python中的in,可能有你不知道的

运算符 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)
      6
      7 c = C()

KeyError: 3
</ipython-input-27-98246d278563></module></ipython-input-27-98246d278563>

说在最后

  • 本文对in的做法稍作拓展,not in是反向操作不展开
  • 至于魔术方法iter和getitem,后面有机会再细讲

Original: https://www.cnblogs.com/wuxianfeng023/p/16619195.html
Author: 松勤吴老师
Title: 浅谈Python中的in,可能有你不知道的

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/603005/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 自动化测试——selenium(完结篇)

    自动化测试——selenium(完结篇) 文章目录 自动化测试——selenium(完结篇) * 一、元素操作方法 二、浏览器操作方法 三、获取元素信息操作 四、鼠标操作 (需要实…

    Python 2023年11月8日
    051
  • ASP.NET Core GRPC 和 Dubbo 互通

    一.前言 Dubbo 是比较流行的服务治理框架,国内不少大厂都在使用。以前的 Dubbo 使用的是私有协议,采集用的 hessian 序列化,对于多语言生态来说是极度的不友好。现在…

    Python 2023年10月20日
    035
  • pandas基本用法(一)之Series和Dataframe区别、切片和索引、字符串使用方法

    1、pandas常用数据类型(Series和Dataframe) Series一维,带标签数组,左边是index,右边是values DataFrame二维,Series容器 * …

    Python 2023年8月6日
    041
  • WSGI与Flask

    在学习Flask Web开发时遇到了WSGI,那么WSGI是什么呢?WSGI和Flask有什么关系呢? 一、WSGI为什么会出现? 在学习一个东西之前,我们肯定想知道:它为什么会出…

    Python 2023年8月13日
    052
  • 7┃音视频直播系统之 WebRTC 中的连接的创建、STUN/TURN 以及 NAT 穿越

    一、Candidate 即 ICE Candidate(ICE 候选者)。表示 WebRTC 与远端通信时使用的协议、IP 地址和端口 一般组成包括: 本地 IP 地址、本地端口号…

    Python 2023年6月10日
    084
  • 【python】Flask之模板引擎

    一、模板介绍 1.1 视图函数 视图函数的主要作用是生成请求的响应,实际上视图函数有两个作用: 处理业务逻辑 返回响应内容 在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的…

    Python 2023年8月12日
    054
  • Python制造雪景图,看不到雪就自己做~

    前言 南方到了冬天就只有呼呼大风,要不就是大雨,去年还好长沙下了好几场雪,前年那真的是,我在长沙没看到积雪过 都开始学习Python了,是时候改动动手,自己制作个雪景图了,技术不好…

    Python 2023年9月25日
    046
  • 【射雕英雄传】文本分析初步(姓名,丹药,秘籍,招式)[scrapy, jieba, matplotlib]

    大三上学期选了学校高瓴开的大数据分析导论,最后的final分为两个部分,本文讲述第一部分的完成步骤。大致可以描述为:爬取文章,从本文本构造user_dict,利用jieba分词,分…

    Python 2023年9月2日
    050
  • 说说 Redis pipeline

    更多技术文章,请关注我的个人博客 www.immaxfang.com 和小公众号 Max&#x7684;&#x5B66;&#x4E60;&#x672…

    Python 2023年10月18日
    041
  • 解决pandas读取excel文件出错

    Traceback (most recent call last):File “c:/Users/Admin/Desktop/读取文件.py”, line …

    Python 2023年8月7日
    066
  • 《Buildozer打包实战指南》第四节 正式打包一个apk文件

    4.1 了解buildozer.spec配置文件中的常用参数 4.2 修改配置文件打包apk 在上一节内容中,我们配置好了打包环境,还顺带成功打包出了一个apk文件(读者可以把这个…

    Python 2023年11月6日
    042
  • 爬虫scrapy爬呀爬

    chrome相关知识 elements 区域1显示整个网页的HTML信息,单击选中某一行内容的时候,区域2的Styles标签会显示当前单击选中内容的CSS样式,并可对元素的CSS进…

    Python 2023年10月6日
    045
  • 小米手机通过USB连接MAC电脑

    1、手机端拿到”开发者权限”后,打开”USB调试”开关并将USB的用途设置为传输文件,各机型不同请自行百度。 2、如果你已经安装过h…

    Python 2023年6月10日
    0521
  • R-CNN史上最全讲解

    文章目录 一:初识R-CNN * – [网络结构] 二:训练步骤 * 1.RP的确定 2.模型pre-training 3.Fine-Tunning 4.提取并保存RP…

    Python 2023年9月15日
    056
  • 数据分析之pandas基础

    例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 &#x63D0;&#x793A;&…

    Python 2023年8月7日
    072
  • SpringBoot内置Tomcat配置参数

    SpringBoot项目使用内置的Tomcat部署时,可根据需要定义相关的参数: server: tomcat: accept-count: 80 #挂起的请求队列最大连接数,默认…

    Python 2023年11月7日
    066
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球