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的更多相关文章

  1. __slots__,__doc__,__del__,__call__,__iter__,__next__迭代器协议(三十六)

    1.__slots__是什么:是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性) 2.引子:使用点来访问属性本质就是在访问类或者对象的__dic ...

  2. python中的__iter__ __reversed__ __next__

    __reversed__ 返回集合的倒叙迭代器,如果没有实现这个方法,reversed()会去使用__getitem__和__len__来实现 介绍__next__和 __iter__方法需要了解下可 ...

  3. python - 迭代器(迭代协议/可迭代对象)

    迭代器 # 迭代器协议 # 迭代协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就触发一个 StopIteration 异常,以终止迭代(只能往后走不能往前退) # 可迭代对 ...

  4. 可迭代对象(__iter__()和__next__())

    如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()和__next__()方法,该方法返回一个迭代对象 然后,Python的for循环就会不断调 ...

  5. 对 Python 迭代的深入研究

    在程序设计中,通常会有 loop.iterate.traversal 和 recursion 等概念,他们各自的含义如下: 循环(loop),指的是在满足条件的情况下,重复执行同一段代码.比如 Pyt ...

  6. Python 迭代器之列表解析与生成器

     [TOC] 1. 列表解析 1.1 列表解析基础 列表解析把任意一个表达式应用到一个迭代对象中的元素 Python内置ord函数会返回一个字符的ASCII整数编码(chr函数是它的逆过程, 它将A ...

  7. Python迭代和解析(2):迭代初探

    解析.迭代和生成系列文章:https://www.cnblogs.com/f-ck-need-u/p/9832640.html 在Python中支持两种循环格式:while和for.这两种循环的类型不 ...

  8. python 迭代器协议和生成器

    一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stoplteration异常,以终止迭代(只能往后走,不能往前退) 2.可迭代 ...

  9. 完全理解 Python 迭代对象、迭代器、生成器

    完全理解 Python 迭代对象.迭代器.生成器 2017/05/29 · 基础知识 · 9 评论 · 可迭代对象, 生成器, 迭代器 分享到: 原文出处: liuzhijun    本文源自RQ作者 ...

随机推荐

  1. qt exe文件添加图标

    Qt 怎样生成带图标的exe(转载) 一.问题描述 当我们在 Windows 下用 VS 生成 exe 程序时,如果窗口程序指定了图标,那么生成的 exe 程序便是指定的图标模样. 但是,当使用 Qt ...

  2. 模型层中QuerySet的学习

    创建对象 使用关键字参数实例化模型实例来创建一个对象,然后调用save()把它保存到数据库中 pub_obj = models.Publisher(title='奥利给出版社') pub_obj.sa ...

  3. C#封装定时执行任务类

    a.日常开发中经常会遇到定时去执行一些操作,比如定时更新数据.A类需要做我们写个Timer定时去取数据,这时候B类,C类也需要做这样的事情,是不是需要写三次重复代码? 这时候把timer封装成一个帮助 ...

  4. 3个必备cookie实用方法

    今天跟大家介绍一下三种cookie的使用方法,selenium提供了我们add_cookie()方法来跳过验证码直接登录的方法.我们现在以博客园登录为例,都知道现在博客园登录要拼图验证. 先在网页打开 ...

  5. React的几种组件

    一.函数组件 该函数在React中是一个有效的组件,可以接收唯一带有数据的props(代表属性)对象,并返回一个React元素.函数式组件要特别注意,组件名称首字母一定要大写.这种方式也成为无状态组件 ...

  6. APM姿态控制流程

    对初学者了解控制流程有一定帮助 在主循环执行过程中(比如Pixhawk的任务调度周期2.5ms,400Hz:APM2.x为10ms,100Hz),每一个周期,程序会按下述步骤执行:• 首先,高层次文件 ...

  7. Fitness - 05.22

    终于到了连续熬夜,感觉身心俱疲的年纪了. 今天休息一天,瑜伽暂停. 调整作息时间,12点睡觉,5点起床学习~

  8. Nginx 前端项目配置 包含二级目录和接口代理

    Nginx是目前用的比较多的一个前端服务器 其优点是配置简单修改一下server就能用 并发性能比较好,具体怎么好就看这个吧 开撸 1.找到nginx (liunx系统,已安装) whereis ng ...

  9. python图片转码为base64

    import base64 def image_base64(): with open(image_path, 'rb', )as f: base64_data = base64.b64encode( ...

  10. 第一课、python基础学习笔记

    自动化非自动化的区别 自动化测试就是让机器按照人的想法把功能全部跑一遍 自动化测试的过程,让我们写一段程序去测试另一段程序是否正常的过程 Java 编译型语言,   编码-->编译-->解 ...