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中的in,可能有你不知道的的更多相关文章

  1. 浅谈python中得import xxx,from xxx import xxx, from xxx import *

    在python中import跟from import都是用来导入的,但是导入的机制不同 1.import xxx:导入模块,或者文件夹,对于调用模块或者文件夹中子模块的变量或者函数,需要使用" ...

  2. 浅谈python中的“ ==” 与“ is”

    在python中,== 与 is 之间既有区别,又有联系,本文将通过实际代码的演示,力争能够帮助读到这篇文章的朋友以最短的时间理清二者的关系,并深刻理解它们在内存中的实现机制.扯淡的话不多说,下面马上 ...

  3. 浅谈python中文件和文件夹的相关操作

    文件操作 文件的打开与关闭 打开文件 使用open(文件名,访问方式)函数,可以打开一个已存在的文件,或者创建一个新的文件. 示例如下: f = open('test.txt') # 访问方式可以省略 ...

  4. 浅谈python中字典append 到list 后值的改变问题

    看一个例子 ? 1 2 3 4 d={'test':1} d_test=d d_test['test']=2 print d 如果你在命令行实践的话,会发现你改动的是d_test ,但是d 也跟着改变 ...

  5. 浅谈python中的闭包函数

    闭包函数初探 通常我们定义函数都是这样定义的 def foo(): pass 其实在函数式编程中,函数里面还可以嵌套函数,如下面这样 def foo(): print("hello worl ...

  6. 浅谈python中的“ ==” 与“ is”、还有cmp

    总之,比较内容相等使用 ‘==’ 1.is" 是用来比较 a 和 b 是不是指向同一个内存单元,而"=="是用来比较 a 和 b指向的内存单元中的值是不是相等 2.pyt ...

  7. 浅谈Python中函数式编程、面向对象编程以及古怪的PythonIC

    1.函数式编程作为结构化编程的一种,正在受到越来越多的重视.那么什么事函数式编程呢? 在维基百科中给出了详细的定义,函数式编程又称泛函数编程,是一种编程规范,它将函数运算视为数学上的函数计算.简单的来 ...

  8. 浅谈python中__str__和__repr__的区别

    很多时候我们在创建一个类的时候,在终端打印类或者查看的时候一般都不会得到一个太满意的结果 class T: def __init__(self): self.color="red" ...

  9. 浅谈Python 中 __getattr__与__getattribute__的区别

    __getattr__与__getattribute__均是一般实例属性截取函数(generic instance attribute interception method),其中,__getatt ...

  10. 浅谈python 中正则的一些函数

         主要的函数有  : match() search() findall() group() groups() split()  match (): 含义  开头匹配,匹配成功返回一个对象失败则 ...

随机推荐

  1. VMware ESXi 8.0 SLIC 2.6 & macOS Unlocker (Oct 2022 GA)

    ESXi 8.0.0 GA (General Availability) 请访问原文 VMware ESXi 8.0 SLIC 2.6 & macOS Unlocker (Oct 2022 G ...

  2. 嵌入式-C语言基础:字符串比较函数strcmp及其实现

    #include<stdio.h> #include <string.h> int mystrcmp(char * p1,char * p2) { int ret=0; if( ...

  3. 【ELK解决方案】ELK集群+RabbitMQ部署方案以及快速开发RabbitMQ生产者与消费者基础服务

    前言: 大概一年多前写过一个部署ELK系列的博客文章,前不久刚好在部署一个ELK的解决方案,我顺便就把一些基础的部分拎出来,再整合成一期文章.大概内容包括:搭建ELK集群,以及写一个简单的MQ服务. ...

  4. hashlib加密模块、加密补充说明、subprocess模块、logging日志模块

    目录 hashlib加密模块 加密补充说明 subprocess模块 logging日志模块 日志的组成 日志配置字典 hashlib加密模块 1.何为加密 将明文数据处理成密文数据 让人无法看懂 2 ...

  5. 说一下 ArrayList 和 LinkedList 的区别?

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 前言 大家好,我是小彭. 在上一篇文章里,我们聊到了基于动态数组 ArrayList 线性表,今天我们来讨论 ...

  6. float16与float32转换

    // based on https://gist.github.com/martin-kallman/5049614 // float32 // Martin Kallman // // Fast h ...

  7. 关于CSDN微信登录接口的研究

    代码 import requests import re from threading import Thread import time import requests from io import ...

  8. 【开发必备】单点登录,清除了cookie,页面还保持登录状态?

    背景 本地搭建了一台认证服务器.两台资源服务器,看看请求的过程 开始 没登录,直接请求资源服务器,结果跳转到的登录页面 登录后,请求了认证服务器的登录接口,然后顿重定向,最后回到了资源服务器的接口,页 ...

  9. aiohttp、asyncio使用协程增加爬虫效率

    import aiohttp import asyncio import time async def get_requests(url): async with aiohttp.ClientSess ...

  10. adb安装电视apk

    adb 是什么? 百度说明:adb工具即Android Debug Bridge(安卓调试桥) tools.它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互.在某些特殊的情况下进入不了系统 ...