首页 > 编程语言 >浅谈Python中的in,可能有你不知道的

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

时间:2022-08-24 11:25:51浏览次数:75  
标签:__ 浅谈 Python self list print True 知道 name

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,后面有机会再细讲

标签:__,浅谈,Python,self,list,print,True,知道,name
From: https://www.cnblogs.com/wuxianfeng023/p/16619195.html

相关文章

  • 如何应对软件可变性?这4种常用的方法肯定要知道
    摘要:在许多软件系统的开发运行阶段乃至整个生命周期中,软件可变性都是其设计开发者所要面对的基本问题。本文分享自华为云社区《如何应对软件可变性?这4种常用的方法肯定要......
  • 【python基础教程】-10.开箱即用(模块的工作原理,获悉模块的功能以及常用模块)
    资料来源(1)Python基础教程第三版1.模块的工作原理1.1简单的模块及使用1.1.1模块的本质(1)模块就是程序,任何python程序都可以作为模块导入;1.1.2简单的模块示......
  • python 二次封装logging,打印日志文件名正确,且正确写入/结合pytest执行,日志不输出的问
    基于之前日志问题,二次封装日志后,导致日志输出的文件名不对,取到的文件一直都是当前二次封装的log的文件名,基于这个问题,做了优化,详细看https://www.cnblogs.com/cuitang/p/1......
  • 浅谈嵌入式系统的持续集成
    持续集成(ContinuousIntegration(CI))和持续交付(ContinuousDelivery(CD))是现代软件开发中两个非常重要的概念。集成是完成交付和部署的前置条件,实现持续交付最大的难点是如......
  • 牌的组合数-python
    问:四个人玩牌,去掉大小王,一个人拿牌的组合有多少种可能方法一:DFS#牌的组合数.常识:13*4+2=54张牌。每一类大小可以拿的张数有:0,1,2,3,4。问:四个人玩牌,一个人拿牌的......
  • Python_13包
    一、包1、包用于将一组模块归并到一个目录中,将有联系的模块组织在一起,可以有效避免模块名称冲突问题,让应用组织更加清晰。2、Python语法要求每个包都必须有__init__.py文......
  • linux安装python3
    Linux安装python3.7.13以下例子服务器为:centos7官网下载安装包https://www.python.org/downloads/上传到服务器#我是把包放在了/usr/local下Python-3.7.13.tgz......
  • linux安装python虚拟环境并启动python程序
    安装python虚拟环境并启动python应用安装虚拟环境#安装virtualenv虚拟环境工具pip37为python命令安装python应用时创建的/usr/bin/pip37pip37installvirtuale......
  • python 3 条件判断
    条件判断:if语句ifelse语句     循环:   range(5)是生成小于5的0,1,2,3,4,如果加上一个list[range(5)]就是生成一个列表[0,1,2,3,4]如果计算0-100的整......
  • Python-Anaconda介绍、安装及使用教程
    〇、序一、什么是Anaconda?1.简介2.特点3.Anaconda、conda、pip、virtualenv的区别①Anaconda②conda③pip④virtualenv⑤pip与conda比较→依赖......