浅谈Python中的in,可能有你不知道的
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
对于字符串和字节串类型来说,当且仅当 x 是 y 的子串时
x in y为True。 一个等价的检测是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 y为True。 如果在迭代期间引发了异常,则等同于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 y为True。 (如果引发了任何其他异常,则等同于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,可能有你不知道的的更多相关文章
- 浅谈python中得import xxx,from xxx import xxx, from xxx import *
在python中import跟from import都是用来导入的,但是导入的机制不同 1.import xxx:导入模块,或者文件夹,对于调用模块或者文件夹中子模块的变量或者函数,需要使用" ...
- 浅谈python中的“ ==” 与“ is”
在python中,== 与 is 之间既有区别,又有联系,本文将通过实际代码的演示,力争能够帮助读到这篇文章的朋友以最短的时间理清二者的关系,并深刻理解它们在内存中的实现机制.扯淡的话不多说,下面马上 ...
- 浅谈python中文件和文件夹的相关操作
文件操作 文件的打开与关闭 打开文件 使用open(文件名,访问方式)函数,可以打开一个已存在的文件,或者创建一个新的文件. 示例如下: f = open('test.txt') # 访问方式可以省略 ...
- 浅谈python中字典append 到list 后值的改变问题
看一个例子 ? 1 2 3 4 d={'test':1} d_test=d d_test['test']=2 print d 如果你在命令行实践的话,会发现你改动的是d_test ,但是d 也跟着改变 ...
- 浅谈python中的闭包函数
闭包函数初探 通常我们定义函数都是这样定义的 def foo(): pass 其实在函数式编程中,函数里面还可以嵌套函数,如下面这样 def foo(): print("hello worl ...
- 浅谈python中的“ ==” 与“ is”、还有cmp
总之,比较内容相等使用 ‘==’ 1.is" 是用来比较 a 和 b 是不是指向同一个内存单元,而"=="是用来比较 a 和 b指向的内存单元中的值是不是相等 2.pyt ...
- 浅谈Python中函数式编程、面向对象编程以及古怪的PythonIC
1.函数式编程作为结构化编程的一种,正在受到越来越多的重视.那么什么事函数式编程呢? 在维基百科中给出了详细的定义,函数式编程又称泛函数编程,是一种编程规范,它将函数运算视为数学上的函数计算.简单的来 ...
- 浅谈python中__str__和__repr__的区别
很多时候我们在创建一个类的时候,在终端打印类或者查看的时候一般都不会得到一个太满意的结果 class T: def __init__(self): self.color="red" ...
- 浅谈Python 中 __getattr__与__getattribute__的区别
__getattr__与__getattribute__均是一般实例属性截取函数(generic instance attribute interception method),其中,__getatt ...
- 浅谈python 中正则的一些函数
主要的函数有 : match() search() findall() group() groups() split() match (): 含义 开头匹配,匹配成功返回一个对象失败则 ...
随机推荐
- Linux---ls cd
ls 命令 ls命令是linux下最常用的命令,是 list 的缩写,可以用各种方式查看目录中的内容. 格式: ls [选项] [目录名] 常用参数 short long function -a -- ...
- Burpsuite系列1--自动扫描
第一章 简述 Burpsuite是基于Java的用于web安全的工具,能够进行爬虫.代理.编码.密码爆破等任务,并支持对XSS漏洞.文件包含等漏洞的主动扫描或被动扫描.burpsuite2.0 ...
- Go语言核心36讲20
在上两篇文章中,我主要为你讲解了与go语句.goroutine和Go语言调度器有关的知识和技法. 内容很多,你不用急于完全消化,可以在编程实践过程中逐步理解和感悟,争取夯实它们. 现在,让我们暂时走下 ...
- 14 STL-常用算法
重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦! 每一次学习都是为了追求智慧! 写在前面,本篇章主要介绍STL中常用算法. 算法主要由 ...
- Zabbix与乐维监控对比分析(一)——架构、性能篇
近年来,Zabbix凭借其近乎无所不能的监控及优越的性能一路高歌猛进,在开源监控领域独占鳌头:而作为后起的新锐IT监控平台--乐维监控,则不断吸收Zabbix,Prometheus等优秀开源平台的优点 ...
- 【Hadoop面试】基础概念、HDFS、MapReduce、Yarn、实战
一.Hadoop概念及架构 1.是否看过Hadoop源码 2.正常工作的hadoop集群中hadoop都分别需要启动哪些进程,他们的作用分别是什么 3.hadoop和spark中的文件缓存方式 4.h ...
- ABP AutoMapper与自定义Mapping
对象映射 在工作中,需要将相似的对象映射到另一个对象,这样我们来看一个最繁琐的映射方式 例: public class UserAppService : ApplicationService { pr ...
- 【JVM故障问题排查心得】「内存诊断系列」Docker容器经常被kill掉,k8s中该节点的pod也被驱赶,怎么分析?
背景介绍 最近的docker容器经常被kill掉,k8s中该节点的pod也被驱赶. 我有一个在主机中运行的Docker容器(也有在同一主机中运行的其他容器).该Docker容器中的应用程序将会计算数据 ...
- 搭建IIS网站后,点击浏览地址,报403错误
点击左侧的浏览地址,报右侧的错误,可将目录浏览进行启用 双击进去,进行启用即可
- 说透 Kubernetes 监控系列 - 概述
本文作者孔飞,来自快猫星云团队,Kubernetes专家,Categraf 采集器核心研发工程师 云原生包含了开源软件.云计算和应用架构的元素.云计算解决开源软件的运行门槛问题,同时降低了运维成本和基 ...