Python之迭代器和生成器(Day17)
一.可迭代对象(iterable)
刚才说过,很多容器都是可迭代对象,此外还有更多的对象同样也是可迭代对象,比如处于打开状态的files,sockets等等。但凡是可以返回一个迭代器的对象都可称之为可迭代对象
可迭代对应的标志:_iter_
print('_iter_' in dir(str))
print('_iter_' in dir([1,2,3]))————判断一个变量是不是可迭代的
二.迭代器(iterator)
那么什么迭代器呢?它是一个带状态的对象,他能在你调用next()
方法的时候返回容器中的下一个值,任何实现了__iter__
和__next__()
(python2中实现next()
)方法的对象都是迭代器,__iter__
返回迭代器自身,__next__
返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常,至于它们到底是如何实现的这并不重要。
So,迭代器就是实现了工厂模式的对象,它在你每次你询问要下一个值的时候给你返回
字符串、列表、元组、字典、集合都可以被for循环,说明他们都是可迭代的
迭代器的特点:
可以用for循环
可以节省内存
你只能用一次 l = [1,2,3,4]
from collections import Iterablel = [1,2,3,4] t = (1,2,3,4) d = {1:2,3:4} s = {1,2,3,4} print(isinstance(l,Iterable)) print(isinstance(t,Iterable)) print(isinstance(d,Iterable)) print(isinstance(s,Iterable))
可迭代协议
可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法
总结一下:可以被for循环的都是可迭代的,要想可迭代,内部必须有一个__iter__方法。
接着分析,__iter__方法做了什么事情呢?
print([1,2].__iter__())结果 <list_iterator object at 0x1024784a8>
执行了list([1,2])的__iter__方法,我们好像得到了一个list_iterator。————iterator(迭代器)
1.凡是可迭代的内部都有一个_iter_方法
2.迭代器大部分都是在Python的内部使用,可直接拿来用
3.迭代器协议:内部实现了_iter_和_next_方法,,,,都可用for循环(相同点)
三.生成器Generator:
本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)
特点:惰性运算,开发者自定义
Python中提供的生成器
1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
生成器函数
一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。
import time def genrator_fun1():a = 1print('现在定义了a变量')yield ab = 2print('现在又定义了b变量')yield bg1 = genrator_fun1() print('g1 : ',g1) #打印g1可以发现g1就是一个生成器 print('-'*20) #我是华丽的分割线 print(next(g1)) time.sleep(1) #sleep一秒看清执行过程 print(next(g1))
View Code
列表推导式和生成器表达式
#列表解析 sum([i for i in range(100000000)])#内存占用大,机器容易卡死#生成器表达式 sum(i for i in range(100000000))#几乎不占内存
转载于:https://www.cnblogs.com/shaojiafeng/p/7274708.html
Python之迭代器和生成器(Day17)相关推荐
- python有关迭代器和生成器的面试题_【面试题 | Python中迭代器和生成器的区别?】- 环球网校...
[摘要]今天给大家解答一道Python常见的面试题,希望这个面试栏目,给那些准备面试的同学,提供一点点帮助!小编会从最基础的面试题开始,每天一题.如果参考答案不够好,或者有错误的话,麻烦大家可以在留言 ...
- Python的迭代器和生成器
Python的迭代器和生成器 一.迭代器Iterators 迭代器仅是一容器对象,它实现了迭代器协议.它有两个基本方法: 1)next方法 返回容器的下一个元素 2)__iter__方法 返回迭代器自 ...
- pythonfor循环遍历list_为什么for循环可以遍历list:Python中迭代器与生成器
1 引言 只要你学了Python语言,就不会不知道for循环,也肯定用for循环来遍历一个列表(list),那为什么for循环可以遍历list,而不能遍历int类型对象呢?怎么让一个自定义的对象可遍历 ...
- python生成器单线程_【Python】迭代器、生成器、yield单线程异步并发实现详解
转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...
- Python之迭代器和生成器
生成器和迭代器 提到生成器,总不可避免地要把迭代器拉出来对比着讲,生成器就是一个在行为上和迭代器非常类似的对象,如果把迭代器比作Android系统, 那么生成器就是ios,二者功能上差不多,但是生成器 ...
- python之迭代器,生成器
一,迭代器 1.1什么是可迭代对象? 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. 我们怎么来证明这一点呢? from collections import Iterabl ...
- python 生成式,迭代器,生成器
DAY 6. 生成式,迭代器,生成器 6.1 生成式 6.1.1 列表生成式 list = [index for index in range(10)] 6.1.2 字典生成式 dict = {'zh ...
- 第十六篇 Python之迭代器与生成器
一.迭代器 一. 递归和迭代 生活实例说明什么是递归和迭代 A想去腾达大厦,问B怎么走路,B 说我不知道,我给你问问C,C也不知道,C又去问D,D知道,把路告诉了C,C又告诉B,B最后告诉A, 这就是 ...
- python基础-------迭代器,生成器,协程函数
1,迭代器协议: 1.1 迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 1.2. ...
最新文章
- 线程池ThreadPool知识碎片和使用经验速记
- c#调用excel报错 (异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT))问题的解决
- 718保时捷spyder_我要买保时捷718 Spyder的原因:新手也可以玩手动
- 获取当前目录所有文件名 并且保存为1个00000.txt的文件文件bat
- 【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)
- java8返回单个号码_如何在单个API中支持Java 6、8、9
- oracle java认证_如何通过Oracle的Java认证-开发人员实用指南
- http安全 Java_HTTP通信安全-身份验证 | 字痕随行
- ES6 import export
- 买下千万美元豪宅的库克 在周日获得了价值3600万美元股票
- 斯坦福DAWNBench最新训练排名!华为云ModelArts用时10分28秒获全球最快
- 二叉树插入算法的非递归版本
- PHP内置函数parse_str会自动进行urldecode(URL解码)
- LINUX中nagios客户端安装步骤及遇到问题
- HTML网站去色代码
- 使用python和Modbus协议控制YK-08继电器
- 【Leetcode刷题】:Python:347. 前 K 个高频元素
- 01Java方法重写与重载的区别
- 3.1 TMO MATLAB 框架(Advanced High Dynamic Range Imaging )
- 【通讯术语】VoLTE
热门文章
- struct2(四)编写Struct2 的Action
- 在Win7下利用VirtualBox和Vagrant安装Docker
- [C#]从URL中获取路径的最简单方法-new Uri(url).AbsolutePath
- Early Z Culling
- ^_^ 真是Android Framework的BUG
- Python特殊语法:filter、map、reduce、lambda [转]
- 边看chromium的代码,边想骂人...
- (伪)datagridview里面id的自增长
- .Net中单元测试工具的比较(Moq, VS Fake, TypeMock)
- 中国如何成为一流国家