欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python 基础篇 13 迭代器与生成器

程序员文章站 2022-06-22 17:27:39
13. 前⽅⾼能-迭代器和⽣成器本节主要内容:1. 迭代器2. ⽣成器 ⼀. 迭代器我们之前⼀直在⽤可迭代对象进⾏迭代操作. 那么到底什么是可迭代对象. 本⼩节主要讨论可迭代对象. ⾸先我们先回顾⼀下⽬前我们所熟知的可迭代对象有哪些:str, list, tuple, dict, set. 那为什么 ......

13. 前⽅⾼能-迭代器和⽣成器
本节主要内容:
1. 迭代器
2. ⽣成器

. 迭代器
我们之前⼀直在⽤可迭代对象进⾏迭代操作. 那么到底什么是可迭代对象. 本⼩节主要讨
论可迭代对象. ⾸先我们先回顾⼀下⽬前我们所熟知的可迭代对象有哪些:
str, list, tuple, dict, set. 那为什么我们可以称他们为可迭代对象呢? 因为他们都遵循了可
迭代协议. 什么是可迭代协议. ⾸先我们先看⼀段错误代码:

python 基础篇 13 迭代器与生成器

 

 

注意看报错信息中有这样⼀句话. 'int' object is not iterable . 翻译过来就是整数类型对象
是不可迭代的. iterable表⽰可迭代的. 表⽰可迭代协议. 那么如何进⾏验证你的数据类型是否
符合可迭代协议. 我们可以通过dir函数来查看类中定义好的所有⽅法.

python 基础篇 13 迭代器与生成器

我们发现在字符串中可以找到__iter__. 继续看⼀下list, tuple, dict, set

 我们发现这⼏个可以进⾏for循环的东⻄都有__iter__函数, 包括range也有. 可以⾃⼰试⼀
.
综上. 我们可以确定. 如果对象中有__iter__函数. 那么我们认为这个对象遵守了可迭代协议.
就可以进⾏迭代. 这⾥的__iter__是帮助我们获取到对象的迭代器. 我们使⽤__next__()来获取
到⼀个迭代器中的元素. 那么我们之前讲的for的⼯作原理到底是什么? 继续看代码

 

 python 基础篇 13 迭代器与生成器

. ⽣成器
什么是⽣成器. ⽣成器实质就是迭代器.
python中有三种⽅式来获取⽣成器:
1. 通过⽣成器函数
2. 通过各种推导式来实现⽣成器
3. 通过数据的转换也可以获取⽣成器
今天, 我们主要使⽤⽣成器函数来完成⽣成器的创建和使⽤.
⾸先, 我们先看⼀个很简单的函数:

python 基础篇 13 迭代器与生成器

python 基础篇 13 迭代器与生成器

运⾏的结果和上⾯不⼀样. 为什么呢. 由于函数中存在了yield. 那么这个函数就是⼀个⽣成器
函数. 这个时候. 我们再执⾏这个函数的时候. 就不再是函数的执⾏了. ⽽是获取这个⽣成器.
如何使⽤呢? 想想迭代器. ⽣成器的本质是迭代器. 所以. 我们可以直接执⾏__next__()来执⾏
以下⽣成器.

python 基础篇 13 迭代器与生成器

 

 python 基础篇 13 迭代器与生成器

python 基础篇 13 迭代器与生成器

示例:

 当程序运⾏完最后⼀个yield. 那么后⾯继续进⾏__next__()程序会报错.
好了⽣成器说完了. ⽣成器有什么作⽤呢? 我们来看这样⼀个需求. 公司向JACK JONES
10000套学⽣服. JACK JONES就比较实在. 直接造出来10000套衣服.

python 基础篇 13 迭代器与生成器

但是公司现在没那么多人啊,你一下给我一万套我没地方存啊,很尴尬,   

最完美的就是我用一套 你给我一套  

 python 基础篇 13 迭代器与生成器

区别: 第⼀种是直接⼀次性全部拿出来. 会很占⽤内存. 第⼆种使⽤⽣成器. ⼀次就⼀个. ⽤多
少⽣成多少. ⽣成器是⼀个⼀个的指向下⼀个. 不会回去, __next__()到哪, 指针就指到哪⼉.
下⼀次继续获取指针指向的值.

---->>>> send和__next__区别<<<<<-----

python 基础篇 13 迭代器与生成器

第一次执行必须用__next__

 

 python 基础篇 13 迭代器与生成器

这个比较乱,可以自己运行一下看看结果    先打印 然后打印yield返回值  然后send传值进上一个yield  打印出来