一.可迭代对象(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)相关推荐

  1. python有关迭代器和生成器的面试题_【面试题 | Python中迭代器和生成器的区别?】- 环球网校...

    [摘要]今天给大家解答一道Python常见的面试题,希望这个面试栏目,给那些准备面试的同学,提供一点点帮助!小编会从最基础的面试题开始,每天一题.如果参考答案不够好,或者有错误的话,麻烦大家可以在留言 ...

  2. Python的迭代器和生成器

    Python的迭代器和生成器 一.迭代器Iterators 迭代器仅是一容器对象,它实现了迭代器协议.它有两个基本方法: 1)next方法 返回容器的下一个元素 2)__iter__方法 返回迭代器自 ...

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

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

  4. python生成器单线程_【Python】迭代器、生成器、yield单线程异步并发实现详解

    转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...

  5. Python之迭代器和生成器

    生成器和迭代器 提到生成器,总不可避免地要把迭代器拉出来对比着讲,生成器就是一个在行为上和迭代器非常类似的对象,如果把迭代器比作Android系统, 那么生成器就是ios,二者功能上差不多,但是生成器 ...

  6. python之迭代器,生成器

    一,迭代器 1.1什么是可迭代对象? 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. 我们怎么来证明这一点呢? from collections import Iterabl ...

  7. python 生成式,迭代器,生成器

    DAY 6. 生成式,迭代器,生成器 6.1 生成式 6.1.1 列表生成式 list = [index for index in range(10)] 6.1.2 字典生成式 dict = {'zh ...

  8. 第十六篇 Python之迭代器与生成器

    一.迭代器 一. 递归和迭代 生活实例说明什么是递归和迭代 A想去腾达大厦,问B怎么走路,B 说我不知道,我给你问问C,C也不知道,C又去问D,D知道,把路告诉了C,C又告诉B,B最后告诉A, 这就是 ...

  9. python基础-------迭代器,生成器,协程函数

    1,迭代器协议: 1.1 迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 1.2. ...

最新文章

  1. 线程池ThreadPool知识碎片和使用经验速记
  2. c#调用excel报错 (异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT))问题的解决
  3. 718保时捷spyder_我要买保时捷718 Spyder的原因:新手也可以玩手动
  4. 获取当前目录所有文件名 并且保存为1个00000.txt的文件文件bat
  5. 【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)
  6. java8返回单个号码_如何在单个API中支持Java 6、8、9
  7. oracle java认证_如何通过Oracle的Java认证-开发人员实用指南
  8. http安全 Java_HTTP通信安全-身份验证 | 字痕随行
  9. ES6 import export
  10. 买下千万美元豪宅的库克 在周日获得了价值3600万美元股票
  11. 斯坦福DAWNBench最新训练排名!华为云ModelArts用时10分28秒获全球最快
  12. 二叉树插入算法的非递归版本
  13. PHP内置函数parse_str会自动进行urldecode(URL解码)
  14. LINUX中nagios客户端安装步骤及遇到问题
  15. HTML网站去色代码
  16. 使用python和Modbus协议控制YK-08继电器
  17. 【Leetcode刷题】:Python:347. 前 K 个高频元素
  18. 01Java方法重写与重载的区别
  19. 3.1 TMO MATLAB 框架(Advanced High Dynamic Range Imaging )
  20. 【通讯术语】VoLTE

热门文章

  1. struct2(四)编写Struct2 的Action
  2. 在Win7下利用VirtualBox和Vagrant安装Docker
  3. [C#]从URL中获取路径的最简单方法-new Uri(url).AbsolutePath
  4. Early Z Culling
  5. ^_^ 真是Android Framework的BUG
  6. Python特殊语法:filter、map、reduce、lambda [转]
  7. 边看chromium的代码,边想骂人...
  8. (伪)datagridview里面id的自增长
  9. .Net中单元测试工具的比较(Moq, VS Fake, TypeMock)
  10. 中国如何成为一流国家