浅谈Python中的in,可能有你不知道的
2024-10-21 04:00:57
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学习--05函数
- 显示转换explicit和隐式转换implicit
- JAVA递归算法
- C++类的交叉引用
- kafka 0.8.x producer Example(scala)
- Atom 和 Sublime Text 相比哪个好?
- 一个DataTable赋值给另一个DataTable的常用方法
- JavaScript高级---桥模式设计
- 广度优先搜索BFS
- windows安装PHP5.4.13 +Apache2.4.4(转)
- 关于android的SQLiteDatabase和Cursor的一些疑问
- HDU 5806 - NanoApe Loves Sequence Ⅱ (BestCoder Round #86)
- C#之自定义特性
- 从集合的无序性看待关系型数据库中的";序";
- PLSQL(1)
- SQL :“传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确” 错误
- JVM五大知识点
- React Router教程
- Maven项目下update maven后Eclipse报错
- 操作Checkbox标签
热门文章
- Excel中的VLOOKUP函数
- webpack 配置echarts 按需加载
- Jmeter之聚合报告“造假”
- Node.js的学习(一)node.js 的介绍
- ubuntu上升级cmake到3.16版本
- UBOOT编译--- UBOOT的顶层config.mk(五)
- C温故补缺(七):函数指针与回调函数
- 165 pbi-utils 使用文档
- docker给已存在的容器添加或修改端口映射
- 【大数据工具选型】ETL&;同步&;调度工具比较-Kettle、Streamset,DataX、Sqoop、Canel,DolphinSchedule、Azkaban、Oozie、Airflow、Xxl Job