python 基础篇 13 迭代器与生成器
13. 前⽅⾼能-迭代器和⽣成器
本节主要内容:
1. 迭代器
2. ⽣成器
⼀. 迭代器
我们之前⼀直在⽤可迭代对象进⾏迭代操作. 那么到底什么是可迭代对象. 本⼩节主要讨
论可迭代对象. ⾸先我们先回顾⼀下⽬前我们所熟知的可迭代对象有哪些:
str, list, tuple, dict, set. 那为什么我们可以称他们为可迭代对象呢? 因为他们都遵循了可
迭代协议. 什么是可迭代协议. ⾸先我们先看⼀段错误代码:
注意看报错信息中有这样⼀句话. 'int' object is not iterable . 翻译过来就是整数类型对象
是不可迭代的. iterable表⽰可迭代的. 表⽰可迭代协议. 那么如何进⾏验证你的数据类型是否
符合可迭代协议. 我们可以通过dir函数来查看类中定义好的所有⽅法.
我们发现在字符串中可以找到__iter__. 继续看⼀下list, tuple, dict, set
我们发现这⼏个可以进⾏for循环的东⻄都有__iter__函数, 包括range也有. 可以⾃⼰试⼀
下.
综上. 我们可以确定. 如果对象中有__iter__函数. 那么我们认为这个对象遵守了可迭代协议.
就可以进⾏迭代. 这⾥的__iter__是帮助我们获取到对象的迭代器. 我们使⽤__next__()来获取
到⼀个迭代器中的元素. 那么我们之前讲的for的⼯作原理到底是什么? 继续看代码
⼆. ⽣成器
什么是⽣成器. ⽣成器实质就是迭代器.
在python中有三种⽅式来获取⽣成器:
1. 通过⽣成器函数
2. 通过各种推导式来实现⽣成器
3. 通过数据的转换也可以获取⽣成器
今天, 我们主要使⽤⽣成器函数来完成⽣成器的创建和使⽤.
⾸先, 我们先看⼀个很简单的函数:
运⾏的结果和上⾯不⼀样. 为什么呢. 由于函数中存在了yield. 那么这个函数就是⼀个⽣成器
函数. 这个时候. 我们再执⾏这个函数的时候. 就不再是函数的执⾏了. ⽽是获取这个⽣成器.
如何使⽤呢? 想想迭代器. ⽣成器的本质是迭代器. 所以. 我们可以直接执⾏__next__()来执⾏
以下⽣成器.
示例:
当程序运⾏完最后⼀个yield. 那么后⾯继续进⾏__next__()程序会报错.
好了⽣成器说完了. ⽣成器有什么作⽤呢? 我们来看这样⼀个需求. 公司向JACK JONES订
购10000套学⽣服. JACK JONES就比较实在. 直接造出来10000套衣服.
但是公司现在没那么多人啊,你一下给我一万套我没地方存啊,很尴尬,
最完美的就是我用一套 你给我一套
区别: 第⼀种是直接⼀次性全部拿出来. 会很占⽤内存. 第⼆种使⽤⽣成器. ⼀次就⼀个. ⽤多
少⽣成多少. ⽣成器是⼀个⼀个的指向下⼀个. 不会回去, __next__()到哪, 指针就指到哪⼉.
下⼀次继续获取指针指向的值.
---->>>> send和__next__区别<<<<<-----
第一次执行必须用__next__
这个比较乱,可以自己运行一下看看结果 先打印 然后打印yield返回值 然后send传值进上一个yield 打印出来
python 基础篇 13 迭代器与生成器的更多相关文章
- python基础篇_005_迭代器和生成器
Python迭代器和生成器 1.迭代器 迭代:可以将某个数据集内的数据“一个挨着一个的取出来” for i in range(1, 10, 2): # in 后面的对象必须是一个可迭代的 print( ...
- 【笔记】Python基础四:迭代器和生成器
一,迭代器协议和for循环工作机制 (一),迭代器协议 1,迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stopiteration异常,以终止迭代(只能往 ...
- python基础知识7——迭代器,生成器,装饰器
迭代器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器 ...
- Python基础入门(迭代器和生成器)
1 Python迭代器 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退. 迭代器有两个基本的方法:iter() 和 ...
- python基础9 (迭代器、生成器)
1.可迭代对象 迭代:将某个数据集内的数据“一个挨着一个的取出来” 可迭代协议:可以被迭代要满足的要求,即内部含有__iter__()方法 可迭代的类型:字符串.列表.元组.字典.集合特点:惰性运算 ...
- python基础——9(迭代器、生成器)
一.迭代器 1.概念 器:包含了多个值的容器 迭代:循环反馈(一次从容器中取出一个值) 迭代器:从装有多个值的容器中一次取出一个值给外界 s = 'abcdef' ls = [1,2,3,4,5] 遍 ...
- python基础十一之迭代器和生成器
可迭代 内置方法中含有__iter__的数据类型都是可迭代的,只要是可迭代的就可以使用for循环,反之亦然. print(dir('')) # dir()函数可以获取当前数据类型的所有内置方法 返回值 ...
- Python基础——函数的迭代器和生成器
等待更新…………………… 后面再写
- 完全理解 Python 迭代对象、迭代器、生成器
完全理解 Python 迭代对象.迭代器.生成器 2017/05/29 · 基础知识 · 9 评论 · 可迭代对象, 生成器, 迭代器 分享到: 原文出处: liuzhijun 本文源自RQ作者 ...
随机推荐
- JavaEE权限管理系统的搭建(四)--------使用拦截器实现登录认证和apache shiro密码加密
RBAC 基于角色的权限访问控制(Role-Based Access Control)在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理.在一个 ...
- nineoldandroid 详细使用并且实现drawerlayout侧滑动画
nineoldandroid.view.ViewHelpe是一个为了兼容3.0以下的一个动画开源库 相关函数解读:(第一个参数都为动画对象,第二个为动画属性值的变化表达式) ViewHelper.se ...
- windows 安装pear & PHP_CodeSniffer
1. download https://pear.php.net/go-pear.phar 2. install pear(http://pear.php.net/manual/en/installa ...
- 学习Promise笔记
什么是Promise? MDN对Promise的定义:Promise对象用于异步操作,它表示一个尚未完成且预计在未来完成的异步操作. 在学习Promise之前得先了解同步与异步:JavaScript的 ...
- Angular将填入表单的数据渲染到表格
一.项目简介 我们将采用Angular框架来做一个demo,这个demo将要实现的功能如下: 在X坐标和Y坐标文本框输入信息,然后点击添加,就会在下面表格 中出现一项相应的数据,点击每一项旁边的删除按 ...
- SpringBoot非官方教程 | 第十五篇:Springboot整合RabbitMQ
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot15-rabbitmq/ 本文出自方志朋的博客 这 ...
- c# 常用数据库封装
我不为大家贴代码了,没有意思,有点多,我主要给大家介绍一下,源码会上传CSDN和GIT:我定义了一个ADO.NET操作接口,所有按照接口封装 1.sqlite数据库(需要SQLite.Interop. ...
- 2018 Wannafly summer camp Day3--Knight
Knight 题目描述: 有一张无限大的棋盘,你要将马从\((0,0)\)移到\((n,m)\). 每一步中,如果马在\((x,y)(x,y)\),你可以将它移动到 \((x+1,y+2)(x+1,y ...
- 2822: [AHOI2012]树屋阶梯
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1161 Solved: 694[Submit][Status][Discuss] Descriptio ...
- Linux系统文件和目录的属性及权限
1 文件属性概述 Linux系统中的文件或目录的属性主要包括:索引节点(inode).文件类型.权限属性.硬链接数.所归属的用户和用户组.最近修改时间等内容(文件名严格来说不属于文件的属性): 下面是 ...