9.1 python的迭代协议

list内部实现了__iter__()协议(魔法函数),是可迭代对象,但还不是迭代器(迭代器需要实现__next__协议)

生成器实现了__iter__(),__next__()协议,因此是迭代器。但迭代器不一定是生成器(不具有生成器的方法协议)

#什么是迭代协议
#迭代器是什么? 迭代器是访问集合内元素的一种方式, 一般用来遍历数据
#迭代器和以下标的访问方式不一样, 迭代器是不能返回的, 迭代器提供了一种惰性方式数据的方式
#[] list , __iter__from collections.abc import Iterable, Iterator
a = [1,2]
iter_rator = iter(a)
print (isinstance(a, Iterable))
print (isinstance(a, Iterator))
print (isinstance(iter_rator, Iterator))---
True
False
True

9.2 什么是迭代器和可迭代对象

from collections.abc import Iterator
class Company(object):def __init__(self, employee_list):self.employee = employee_listdef __iter__(self):                    # 可迭代对象,实现了__iter__return MyIterator(self.employee)   # iter(可迭代对象) 方法 会调用反回迭代器# def __getitem__(self, item):        # 当没有定义__iter__协议for循环就会将定义的getitem变成迭代器#     return self.employee[item]      # 退化为迭代器# 可迭代对象不要去实现__next__class MyIterator(Iterator):             # 迭代器 实现了__next__def __init__(self, employee_list):self.iter_list = employee_listself.index = 0def __next__(self):#真正返回迭代值的逻辑               #实现原理try:word = self.iter_list[self.index]except IndexError:raise StopIterationself.index += 1return wordif __name__ == "__main__":company = Company(["tom", "bob", "jane"])my_itor = iter(company)for item in company:print (item)# ---
tom
bob
jane

9.3 生成器函数使用

#生成器函数,函数里只要有yield关键字
def gen_func():yield 1yield 2yield 3def func():return 1if __name__ == "__main__":#生成器对象, python编译字节码的时候就产生了,gen = gen_func()  # <generator object gen_func at 0x000001CD083334F8>print(gen)for value in gen:print (value)# ---
<generator object gen_func at 0x000001CD08333570>
1
2
3
# ---

 
 
# 斐波拉契 0 1 1 2 3 5 8
# 惰性求值, 延迟求值提供了可能def fib(index):     # 第几个数if index <= 2:return 1else:return fib(index-1) + fib(index-2)def fib2(index):    # 打印前几个数re_list = []n,a,b = 0,0,1while n<index:re_list.append(b)a,b = b, a+bn += 1return re_list
print(fib(10))
print(fib2(10))
# ---
55
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
# ---def gen_fib(index):n,a,b = 0,0,1while n<index:yield ba,b = b, a+bn += 1for data in gen_fib(10):print (data)# ---
1
1
2
3
5
8
13
21
34
55

9.4 生成器的原理

#1.python中函数的工作原理def foo():bar()
def bar():pass#python.exe会用一个叫做 PyEval_EvalFramEx(c函数)去执行foo函数, 首先会创建一个栈帧(stack frame)
"""
python一切皆对象,栈帧对象, 字节码对象
当foo调用子函数 bar, 又会创建一个栈帧
所有的栈帧都是分配在堆内存上,这就决定了栈帧可以独立于调用者存在
"""
import dis
print(dis.dis(foo))
#---5           0 LOAD_GLOBAL              0 (bar)2 CALL_FUNCTION            04 POP_TOP6 LOAD_CONST               0 (None)8 RETURN_VALUE
None
#--- import inspect
frame = None
def foo():bar()
def bar():global frameframe = inspect.currentframe()foo()
print(frame.f_code.co_name)   #栈针
caller_frame = frame.f_back   # 调用他的栈针
print(caller_frame.f_code.co_name)# ---
bar
foo

def gen_func():yield 1name = "lewen"yield 2age = 30return "imooc"import dis
gen = gen_func()
print (dis.dis(gen))# ---2           0 LOAD_CONST               1 (1)2 YIELD_VALUE4 POP_TOP3           6 LOAD_CONST               2 ('lewen')8 STORE_FAST               0 (name)4          10 LOAD_CONST               3 (2)12 YIELD_VALUE14 POP_TOP5          16 LOAD_CONST               4 (30)18 STORE_FAST               1 (age)6          20 LOAD_CONST               5 ('imooc')22 RETURN_VALUE
None
# ---print(gen.gi_frame.f_lasti)
print(gen.gi_frame.f_locals)
next(gen)
print(gen.gi_frame.f_lasti)
print(gen.gi_frame.f_locals)
next(gen)
print(gen.gi_frame.f_lasti)
print(gen.gi_frame.f_locals)# ---
-1
{}
2
{}
12
{'name': 'lewen'}

9.5 通过UserList来看生成器的应用

from collections import UserList # 用Python实现的list

9.6 生成器实现大文件读取

# 500G, 特殊 全部在 一行,由特殊分割符分割
# 一次性读取太大,按分隔符读取
def myreadlines(f, newline):buf = ""  # 缓存while True:while newline in buf:pos = buf.index(newline)yield buf[:pos]                 # 将第一个分隔符之前的数据yield 出去buf = buf[pos + len(newline):]  # 丢弃掉yield的数据,如果buf中还有分隔符就继续处理,chunk = f.read(4096)                 # 没有就继续读新的4096个字节if not chunk:# 说明已经读到了文件结尾yield bufbreakbuf += chunkwith open("input.txt") as f:for line in myreadlines(f, "{|}"):print(line)

gj9 迭代器和生成器相关推荐

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

    本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文的中译版本,推荐阅读原文,谢谢网 ...

  2. Python学习笔记3 流程控制、迭代器、生成器

    第3章 流程控制.迭代器.生成器 3.1 选择语句 1.语法:(1)if -else (2)if-elif-else 2.注意:(1)每个条件后面要使用冒号:(2)使用缩进划分语句块(3)python ...

  3. pythonfor循环遍历list_为什么for循环可以遍历list:Python中迭代器与生成器

    1 引言 只要你学了Python语言,就不会不知道for循环,也肯定用for循环来遍历一个列表(list),那为什么for循环可以遍历list,而不能遍历int类型对象呢?怎么让一个自定义的对象可遍历 ...

  4. javascript迭代器_JavaScript符号,迭代器,生成器,异步/等待和异步迭代器-全部简单解释...

    javascript迭代器 by rajaraodv 通过rajaraodv JavaScript符号,迭代器,生成器,异步/等待和异步迭代器-全部简单解释 (JavaScript Symbols, ...

  5. 完全理解 Python 迭代对象、迭代器、生成器(转)

    完全理解 Python 迭代对象.迭代器.生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators » nvie.com,俺写的这篇文章是 ...

  6. 简单介绍python迭代器和生成器

    这篇文章主要介绍了Python中的迭代器和生成器,涉及到Python中很多重要的特性,需要的朋友可以参考下,希望能够给你带来帮助 python迭代器和生成器 1.迭代器 这里用字典示例 while T ...

  7. python迭代器和生成器_python中迭代器和生成器。

    前言:很多python教程中,对python的解释不容易理解,本文记录自己的理解和体会,是对迭代器和生成器的初步理解. 迭代器: 迭代器的实质是实现了next()方法的对象,常见的元组.列表.字典都是 ...

  8. python3可迭代对象、迭代器、生成器、协程yield入门

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-01-24 16:13:07 # @Author : cdl (1217096 ...

  9. python yield用法_Python中迭代器和生成器的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

最新文章

  1. type=file的未选择任何文件修改_PDF文件怎样输入到CAD图纸中?懂得这个功能可以快速实现...
  2. spring boot-The temporary upload location [ ] is not valid
  3. ubuntu中安装jdk
  4. CAN总线在嵌入式Linux下驱动程序的实现
  5. vantUI组件:van-card 自定义内容 - 踩坑篇
  6. FreeRTOS(一)——任务管理
  7. 视频专辑:Web Service视频教程
  8. book118免费下载文档方法
  9. 针对前端项目选择不同的前端框架
  10. go语言中如何使用select
  11. 实战案例:如何快速打造1000万+播放量的抖音网红?
  12. arduino传感器大全
  13. 安装Linux系统后必做的几件事
  14. 开源棋牌框架creator+skynet:牛牛+五子棋
  15. Android 系统电量统计
  16. 信息与通信工程考研参考(含第四轮学科评估结果与历年国家线)
  17. adb一打开就闪退_常用的adb命令
  18. GDAL/OGR/OSR 坐标系ERROR 4: Unable to open EPSG support file gcs.csv osr.SpatialReference()
  19. iOS百度人脸识别打包上传AppStore报错
  20. 如何将ucgui的汉字库存放到外部的flash memory(ucgui)(汉字库)(外部flash)

热门文章

  1. python实现数据库事务回滚_使用Python脚本实现MySQL误操作的快速回滚
  2. java 正则表达式语法_Java 正则表达式基础语法
  3. python django框架分析_Django框架模型简单介绍与使用分析
  4. php+mysql案例含源码_【专注】Zabbix源码安装教程—步骤详解(1)安装前准备
  5. sublime text3 添加到右键菜单
  6. 字节月薪6万招 kubernetes 开发,看到要求我傻眼了……
  7. 推荐给程序猿们好用的谷歌插件
  8. virtualbox配置apache_VirtualBox虚拟机网络设置(四种方式)
  9. python atm作业详解_python day4 作业 ATM
  10. 从零开始数据科学与机器学习算法-朴素贝叶斯-07