in有相当多的用处,平常用到最多in的地方可能就是for循环中了,比如:

for i  in range(10):
print(i)
此处的in就是i在0到10(不包含10)这个范围内了。
稍微探究一下range这个函数,help(range)一下,看python说了些什么?
Return an object that produces a sequence of integers from start(inclusive) to stop(exclusive)
by step. range(i,j) produces i , i+1,i+2,.... , j-1. start defaults to 0,and stop is omitted! range(4) produces 0,1,2,3.
These are exactly the valid indices for a list of 4 elements. When step is given,it specifies the increment (or decrement).
以上,说的非常明白,其实range返还回来即是一个列表的索引,这就意味着in同样能对列表进行同样的操作,判断元素是否在列表中,
1 in range(10) 会返还 True 
1 in [0,1,2,3,4,5,6,7,8,9] 同样的道理也是返还 True 
那么in到底能操作什么类型的对象呐?
这是我看到对in的理解很棒的作者
作者:知乎用户
链接:https://www.zhihu.com/question/24868112/answer/83471042
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
in 关键字实现了一套python中的遍历协议.

  • 协议A: __iter__ + next

循环时, 程序先使用__iter__ (相当于iter(instance))获取具有next方法的对象, 然后通过其返回的对象, 不断调用其next方法, 直到StopIteration错误抛出.

class A:def __iter__(self):self.limit = 4self.times = 0self.init = 1return selfdef next(self):if self.times >= self.limit:raise StopIteration()else:x = self.initself.times += 1self.init += 1return xprint 'A>>>>>>'for x in A():print x

打印结果:

A>>>>>>
1
2
3
4

  • 协议B: __getitem__ + __len__

循环时, 程序先调用__len__ (相当于len(instance))方法获取长度, 然后循环使用 __getitem__(index) (相当于instance[index])获取元素, index in range(len(instance))

class B:def __init__(self):self._list = [5, 6, 7, 8]def __getitem__(self, slice):return self._list[slice]def __len__(self):return len(self._list)print 'B>>>>>>'for x in B():print x

打印结果:

B>>>>>>
5
6
7
8

  • 协议C: yield关键字
def C():for x in range(9, 13):yield xprint 'C>>>>>>'for x in C():print x

打印结果:

C>>>>>>
9
10
11
12
从上边可以看出, ABC三种方式都可以实现in的循环, 对于A和B, 如果一个类把这两个方案都实现了怎么办?

class D(A, B):passprint 'D>>>>>>'for x in D():print x

打印结果:

D>>>>>>
1
2
3
4

可见, in优先使用的是A计划.

确实学习到了!
那么我们探究一下到底是这么一回事吗?首先help(list)和help(range)我们都会看到都有内置的Magic Method __iter__和__len__
以上,我们就知道什么时候能够用in,以及如何在自己定义的对象中用到in

python中的in相关推荐

  1. 如何优雅的在python中暂停死循环?

    死循环 有时候在工作中可能会遇到要一直执行某个功能的程序,这时候死循环就派上用途了,python中死循环的具体形式大致如下 while True:run_your_code() 结束死循环 通常我们结 ...

  2. 关于python中的dict和defaultdict

    dict 在Python中如果访问字典中不存在的键,会引发KeyError异常,所以一般当我们比如统计一句话的词频时候,我们总是使用这样的处理方式: strings = ('puppy', 'kitt ...

  3. python中的新式类与旧式类的一些基于descriptor的概念(上)

    python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2.2.1 静态方法 2.2.2 类方法 2.3 新式类(n ...

  4. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  5. Python中正则表达式用法 重点格式以这个为准_首看_各种问题

    20210811 https://www.jb51.net/article/101258.htm 一.惰性模式的概念: 此模式和贪婪模式恰好相反,它尽可能少的匹配字符以满足正则表达式即可,例如: va ...

  6. 逗号分隔的字符串转换为Python中的列表 split

    将逗号分隔的字符串转换为Python中的列表 给定一个字符串: 它是由逗号分隔的几个值的序列: mStr = '192.168.1.1,192.168.1.2,192.168.1.3' 如何将字符串转 ...

  7. [翻译]Python中yield的解释

    问题: Python中yield关键字的作用是什么?它做了什么? 例如,我想理解以下代码 def node._get_child_candidates(self, distance, min_dist ...

  8. 全面理解Python中的类型提示(Type Hints)

    众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...

  9. python中break和continue的区别

    python中break和continue的区别 break 结束for 或者while 循环  后面还没循环到的 不再循环 continue 当满足某种条件时结束当前值的循环 后面没有循环的继续循环 ...

  10. 通过带Flask的REST API在Python中部署PyTorch

    通过带Flask的REST API在Python中部署PyTorch 在本文中,将使用Flask来部署PyTorch模型,并用讲解用于模型推断的 REST API.特别是,将部署一个预训练的Dense ...

最新文章

  1. 计算机二级日月潭操作步骤,计算机二级考试真题-PPT-文小雨-台湾日月潭介绍
  2. InfoPath发布要点
  3. 服务器无法执行该事务_分布式事务、MVCC、事务隔离级别
  4. android 彩蛋 miui,MIUI12最新更新,安卓11彩蛋终于出现,流畅度提升
  5. fluent瞬态_Java中的瞬态关键字及其使用
  6. 刚刚,任正非为姚安娜商标事件道歉
  7. 提出问题之后,对于回答问题内容的仔细确认!!!(一个字一个字确认!!)
  8. JS_模拟广告栏跟随效果
  9. POJ-2262 Goldbach's Conjecture
  10. 在 Mac 上的“访达”中排序和排列项目
  11. 侯捷畅谈技术人生与读书感悟
  12. 高光谱图像pca降维matlab_基于 SAE-LR 的高光谱分类
  13. Opencv速成笔记--图像处理1
  14. 指纹识别 python实现_Python实现指纹识别你见过没?
  15. MATLAB中有关矩阵特征值和特征向量的计算
  16. 用计算机代码模拟基因,一种通过计算机程序模拟产生简化DNA甲基化测序数据的方法与流程...
  17. Win10家庭版获得管理员权限的方法
  18. 考试,一种严格的水平鉴定方法。
  19. [VRFC 10-529] concurrent assignment to a non-net an is not permitted [C:/Users/chenxy/Desktop/digit
  20. 【算法】只有五行的Floyd最短路算法

热门文章

  1. wm8978G音频芯片怎么样
  2. 解决“Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)“MySQL登录报错问题
  3. CSS之弹性盒子模型(Flex布局)
  4. 每周一篇 文献阅读—paper13
  5. 通过电气化来减少排放量 - 白皮书
  6. 狼性团队也需柔性管理
  7. 11 系统建模语言SysML实例——蒸馏器
  8. Spring MVC 如何上传多个文件到指定位置
  9. python 证书-python+证书
  10. 项目经理需要掌握的硬技能和软技能