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. iNeuOS工业互联平台,WEB组态(iNeuView)集成实时预警和报警柱状图

    目       录 1.      概述... 2 2.      平台演示... 2 3.      应用过程... 2 4.      实时数据展示效果... 3  1.      概述 对于我们 ...

  2. rbac表 ( 5张 )

    /* Navicat Premium Data Transfer Source Server : 本地连接 Source Server Type : MySQL Source Server Versi ...

  3. Qt 怎样生成带图标的exe

    一.问题描述 当我们在 Windows 下用 VS 生成 exe 程序时,如果窗口程序指定了图标,那么生成的 exe 程序便是指定的图标模样. 但是,当使用 Qt Creator 编译程序却不同.即使 ...

  4. 把Autofac玩的和javaSpring一样6

    大家好,今天来介绍我开源的一个autofac.Annotation项目 源码:https://github.com/yuzd/Autofac.Annotation 本项目是autofa的一个扩展组件, ...

  5. 拿捏了!ConcurrentHashMap!

    概述 本文将对JDK8中 ConcurrentHashMap 源码进行一定程度的解读.解读主要分为六个部分:主要属性与相关内部类介绍.构造函数.put过程.扩容过程.size过程.get过程.与JDK ...

  6. Micro-CMS v1 (Hacker101 CTF)

    这道题一共有四个flag,初步观察可以创建或者修改发布的内容. Flag1: 首先随便创建了一个页面,创建完成后页面会直接跳转到我们所创建的页面. 初步判断网页应该是根据地址栏后的数字来查询并且显示页 ...

  7. org.xml.sax.SAXParseException: The processing instruction target matching "[xX][mM][lL]" is not allowed(转)

    xml文件不能被正确解析/The processing instruction target matching "[xX][mM][lL]" is not allowed. The ...

  8. nginx server_name 多个

    nginx server_name 多个 nginx server_name 多个的话,空格隔开就行 server_name baidu.com baidu.me; 如果很多的话可以用正则,我的需求, ...

  9. windows下TOMCAT对内存使用的设置

    1.打开TOMCAT目录 E:\备份\apache-tomcat-8.5.50-windows-x64\apache-tomcat-8.5.50\bin catalina.bat----------- ...

  10. 剑指 Offer 47. 礼物的最大价值

    题目描述 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘及 ...