Python-迭代协议-__iter__ __next__ iter next yield
iter
本质是for循环调用的实质,for循环通过调用这个函数返回可迭代对象生成器形式,开始迭代取值捕获StopIteration错误退出循环
for循环首先找__iter__方法,然后再找 __getitem__方法,如果都没找到则报错,对象不是可迭代对象
__iter__
如果是自定义类生成的对象则iter方法调用__iter__函数, 这个函数必须返回迭代器对象
next
启动生成器。并获取生成器第一个值
__next__
将对象变成生成器对象,也是 next方法调用对象中__next__方法
from random import randint class BeiMenChuiXue:
"""自己实现的迭代器"""
def __init__(self, iterable):
self.iterable = iterable def __next__(self):
for member in self.iterable:
yield member class DuGuJiuJiu:
"""可迭代对象"""
def __init__(self, numbers):
self.numbers = numbers def __iter__(self):
# 通过全局函数 iter实现
# return iter(self.numbers) # 交给自己实现的迭代器
return next(BeiMenChuiXue(self.numbers)) if __name__ == '__main__':
numbers = [randint(-10, 10) for _ in range(10)]
print(numbers)
du_gu_jiu_jiu = DuGuJiuJiu(numbers)
for member in du_gu_jiu_jiu:
print(member)
北门吹雪: https://www.cnblogs.com/2bjiujiu/
yield
yield可以跳出函数并传出一个值,也可以传递进去一个值被函数内部收到并接着执行函数,类似函数与函数之间形成通信并且可以暂停并启动函数的特性,是协程实现的最底层原理
def bei_men_chui_xue():
hai = yield "我是 bei_men_chui_xue 函数"
print(hai) if __name__ == '__main__':
bei = bei_men_chui_xue()
message = bei.send(None)
print(message)
try:
bei.send("我是 main 函数")
except StopIteration as e:
pass
经验:
1. for循环迭代的本质还是生成器对象,然后捕获StopIteration自动退出循环
2. 协程实现的底层原理是yield特性,既可以暂停函数并传出一个值也可以接收一个值重新启动函数的特性最具有Python语言风格
3. 迭代结束会自动触发StopIteration,这个异常是结束信号,需要捕获这个异常
bei_men_chui_xue: https://www.cnblogs.com/2bjiujiu/
通过yield读取大文件思路:
1. 打开文件获得句柄 open
2. 通过read方法读取指定偏移量数据
3. 定义一个读生成器,传递文件句柄和读取偏移量
4. 定义一个buf,循环判断分隔符是否在buf中,取出分隔符前面的字符(通过切片),yield出去,更新buf分隔符后面的字符
5. 如果没有找到分隔符,则read数据,判断是否读取完毕,读取完毕退出,有数据则拼接到buf中
def read_big_file(filename, read_size=20, sep='\n'):
"""读取大文件"""
f = open(filename, 'r', encoding='utf-8')
buf = ''
sep_len = len(sep)
while True:
# 第一层取数据
data = f.read(read_size)
# 判断文件是否读完
if data is None:
raise StopIteration
buf += data
while True:
# 第二层生成数据
if sep in buf:
index = buf.index(sep)
yield buf[:index]
buf = buf[index + sep_len:]
else:
break if __name__ == '__main__':
file_name = "python_this.txt"
read_generator = read_big_file(filename=file_name)
oneline = next(read_generator)
twoline = next(read_generator)
threeline = next(read_generator)
print(oneline, end='')
print(twoline, end='')
print(threeline, end='')
Python-迭代协议-__iter__ __next__ iter next yield的更多相关文章
- __slots__,__doc__,__del__,__call__,__iter__,__next__迭代器协议(三十六)
1.__slots__是什么:是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性) 2.引子:使用点来访问属性本质就是在访问类或者对象的__dic ...
- python中的__iter__ __reversed__ __next__
__reversed__ 返回集合的倒叙迭代器,如果没有实现这个方法,reversed()会去使用__getitem__和__len__来实现 介绍__next__和 __iter__方法需要了解下可 ...
- python - 迭代器(迭代协议/可迭代对象)
迭代器 # 迭代器协议 # 迭代协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就触发一个 StopIteration 异常,以终止迭代(只能往后走不能往前退) # 可迭代对 ...
- 可迭代对象(__iter__()和__next__())
如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()和__next__()方法,该方法返回一个迭代对象 然后,Python的for循环就会不断调 ...
- 对 Python 迭代的深入研究
在程序设计中,通常会有 loop.iterate.traversal 和 recursion 等概念,他们各自的含义如下: 循环(loop),指的是在满足条件的情况下,重复执行同一段代码.比如 Pyt ...
- Python 迭代器之列表解析与生成器
 [TOC] 1. 列表解析 1.1 列表解析基础 列表解析把任意一个表达式应用到一个迭代对象中的元素 Python内置ord函数会返回一个字符的ASCII整数编码(chr函数是它的逆过程, 它将A ...
- Python迭代和解析(2):迭代初探
解析.迭代和生成系列文章:https://www.cnblogs.com/f-ck-need-u/p/9832640.html 在Python中支持两种循环格式:while和for.这两种循环的类型不 ...
- python 迭代器协议和生成器
一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stoplteration异常,以终止迭代(只能往后走,不能往前退) 2.可迭代 ...
- 完全理解 Python 迭代对象、迭代器、生成器
完全理解 Python 迭代对象.迭代器.生成器 2017/05/29 · 基础知识 · 9 评论 · 可迭代对象, 生成器, 迭代器 分享到: 原文出处: liuzhijun 本文源自RQ作者 ...
随机推荐
- samba使用过程中遇到的问题
1 环境说明 Linux系统版本:Linux version 2.6.32-431.el6.x86_64 (mockbuild@x86-023.build.eng.bos.redhat.com) (g ...
- RabbitMQ高级之消息限流与延时队列
人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 本篇是消息队列RabbitMQ的第五弹. 上篇本来打算讲述RabbitMQ的一些高级用法: 如何保证消息的可靠性? 消息队列如何进行限流? ...
- iOS 64位静态链接库
https://www.jianshu.com/p/486e3b737707 https://stackoverflow.com/questions/44635297/setting-an-ios-s ...
- 写shader小细节——这个会不断更新
这个是因为自己被自己蠢哭了动笔的,里面大概记录自己所犯的错,和一些小知识. 1.有一个错误我经常犯:内部定义的字段没对应开放到编辑器的字段.这个是由于我有点依赖ide写代码的习惯导致,而shader的 ...
- uap设置gradle和jdk
- Medium
https://www.medium.com 破解阅读限制 https://medium-unlimited.ml/download/
- shell 设置进程数运行
问题描述 在服务器上提交任务时,需要限制运行的核的数目.程序本身是单线程的,但是不同的输入参数需要跑很多组,粗暴的方法是开多个终端,不断地去提交任务.但这比较麻烦,可以用 shell 实现. 基础 首 ...
- RocketMQ的发送模式和消费模式
前言 小伙伴们大家好啊,王子又来和大家一起闲谈MQ技术了. 通过之前文章的学习,我们已经对RocketMQ的基本架构有了初步的了解,那今天王子就和大家一起来点实际的,用代码和大家一起看看RocketM ...
- 通过调用标识符确定this
一. 纲 this的性质 作用:表示函数执行时的环境 值:一个对象 特点:动态性 确定this的难度 JS语言的动态性: 函数的this在执行时才能确定 函数为一级公民 可作实参.返回值.数据赋值进行 ...
- oracle之二实例与数据库
实例与数据库 1.Oracle 网络架构及应用环境 看PPT,Oracle结构的基本单元.术语 2.Oracle 体系结构 1)oracle server :database + instanc ...