先来看一张概览图,关于容器(container)、可迭代对象(Iterable)、迭代器(iterator)、生成器(generator)。

一、容器(container)

  容器就是一个用来存储多个元素的数据结构,常见的容器包括【列表】、【元组】、【字典】、【集合】、【字符串】。

  容器有两个特点:1. 容器中的元素可通过迭代获取 2. 所有容器中的元素被存储在内存中。

二、可迭代对象(Iterable)

  可迭代对象,简单的说就是可以被迭代获取的对象,iterable定义了可返回迭代器的__iter__方法。

  通过使用iter()方法,我们能将可迭代对象返回成迭代器。例如列表:

 from collections import Iterable
# 定义一个列表,其本身是可迭代对象
list_a = ['a', 'b', 'c']
isinstance(list_a, Iterable) # True
new_a = iter(list_a) # 对迭代器调用next()方法
>>> next(new_a)
a
>>> next(new_a)
b
>>> next(new_a)
c
>>> next(new_a) # 抛出StopIteration异常

三、迭代器(Iterator)

  迭代器是一个带状态的对象,迭代器内部持有一个状态,该状态用于记录当前迭代所在位置,以便于下次迭代的时候获取正确

  的元素。迭代器可以通过next()方法来迭代获取下一个值。

  迭代器实现了__iter__() 和 __next__()方法。而且,迭代器不会一次性吧所有元素都加载到内存,而是需要的时候才返回结果。 

 from collections import Iterable
# 定义一个列表,其本身是可迭代对象
list_a = ['a', 'b', 'c']
isinstance(list_a, Iterable) # True
new_a = iter(list_a) # 对迭代器调用next()方法
>>> next(new_a)
a
>>> next(new_a)
b
>>> next(new_a)
c
>>> next(new_a) # 抛出StopIteration异常

  迭代器每次调用next()方法的时候做两件事:1. 为下一次调用next()方法修改状态  2. 生成当前调用的返回结果。

  当我们第一次调用next(new_a)之后,当前状态改为即指向a,且输出a,当我们第二次调用的时候,输出b,并且将

  当前状态改为指向b...

四、生成器

  生成器是一种特殊的迭代器。特殊在我们可以通过send()方法像生成器中传入数据,而迭代器只能将数据输出。

  其主要的特点有:

  1、生成器拥有迭代器的迭代传出数据的功能,但用关键字yield来替代迭代器中的__next__()方法来实现,而拥有yield关键字的函数

  就是生成器函数。

  2、生成器可以传入数据进行计算(不同于迭代器),并根据变量内容计算结果后返回。

  3、迭代器不会一次把所有的元素加载到内存,而是调用的时候才生成返回结果(这点相同于迭代器)

  4、可以通过for循环进行迭代(因为生成器是迭代器)

  总结:生成器是一种特殊的迭代器,其具有传入数据的功能。

  下面借助一个简短的程序来具体解释一下yield执行过程: 

 def generator_1():
y = 0
r = 'here'
while True:
x = yield r g_1 = generator_1()
g_1.send(None)
g_1.send(1)
g_1.send(2)

  首先我们写了一个很简单的生成器函数,然后我们定义了一个生成器对象g_1,当我们启动生成器的时候第一个send()只能传入None

  为什么只能是None呢,我们来看其具体执行过程,从函数的第一行开始执行,然后一直到 x = yield r,根据从右向左执行的原则,首先

  执行yield r 然后程序终止,并没有赋值语句,因此,第一个send()只能传入None。当第二次send()时,从上一次中断的地方开始执行,

  上一次是中断在了赋值,那么我们开始从赋值执行,即 x = 1...后边的类似。

  参考:https://blog.csdn.net/SL_World/article/details/86507872  作者:SL_World

Python中的可迭代对象,迭代器与生成器的更多相关文章

  1. Python中的可迭代对象/迭代器/For循环工作机制/生成器

    本文分成6个部分: 1.iterable iterator区别 2.iterable的工作机制 3.iterator的工作机制 4.for循环的工作机制 5.generator的原理 6.总结 1.i ...

  2. python编程系列---可迭代对象,迭代器和生成器详解

    一.三者在代码上的特征 1.有__iter__方法的对象就是可迭代类(对象) 2.有__iter__方法,__next()方法的对象就是迭代器3.生成器 == 函数+yield 生成器属于迭代器, 迭 ...

  3. Python中的可迭代对象

      Python中的可迭代对象有:列表.元组.字典.字符串:常结合for循环使用: 判断一个对象是不是可迭代对象: from collections import Iterable isinstanc ...

  4. Python中的可迭代对象与迭代器对象

    刚刚学习Python,对“可迭代对象”和"迭代器对象"的个人理解,不知道对不对. 1.几个概念 (1)迭代工具:包括for循环.列表解析.in成员关系测试.....等等在内的,用于 ...

  5. 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...

  6. python当中的 可迭代对象 迭代器

    学习python有一段时间了,在学习过程中遇到很多难理解的东西,做一下总结,希望能对其他朋友有一些帮助. 完全是个人理解,难免有错,欢迎其他大神朋友们批评指正. 1 迭代 什么是迭代呢??我们可以这样 ...

  7. 【转】Python中自定义可迭代对象

    python 中内置的可迭代的对象有 list.tuple.set.dict 等,那么我们自己怎么定义一个可迭代的对象呢?先来段代码吧 import re import reprlib RE_WORD ...

  8. 可迭代对象&迭代器&生成器

    在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...

  9. 11.Python初窥门径(函数名,可迭代对象,迭代器)

    Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...

随机推荐

  1. 微信小程序tabBar显示问题

    在微信小程序的开发中,我遇到疑惑如下: 在app.json中定义了多个pages,一般微信小程序启动的时候,自动加载pages下的第一个页面, "pages": [        ...

  2. Error: Trying to open unclosed connection.

    错误:试图打开未关闭的连接.在我自己写model文件的时候,重复打开了连接数据库的操作,所以报这种错误. 错误实例: 两个model文件: userModel.js var mongoose = re ...

  3. JAVA基础之基本类型包装类、System类、Math类、Arrays类及大数据运算

    个人理解: 为了方便运算及调用一些方法,我们需要将基本类型的数值转换为对象:不过转换的时候需要特别注意好它们的类型到底是什么,需要调用方法的类名是哪个!特别注意是Byte常量池的相关问题(==):gc ...

  4. git上传布置代码 git优势

    ftp 软件 可直接上传至服务器但不便于管理 Git上传 GitHub/码云/codinghub 登录服务器 ssh 协议登录 ssh 账户@ip地址 密码 mkdir 创建文件 workspace ...

  5. JavaScript笔记6-数组新方法

    七.ECMAScript5关于数组的新方法 1.forEach():遍历数组,并为每个元素调用传入的函数;     举例:    var a = [1,2,3]; var sum = 0; //传一个 ...

  6. Vmware Player 比较

    .wiz-todo, .wiz-todo-img {width: 16px; height: 16px; cursor: default; padding: 0 10px 0 2px; vertica ...

  7. 中国区 Azure 服务和定价模式概述

    由世纪互联运营的 Microsoft Azure 是第一个在中国正式商用,符合中国政府相关法规要求的国际化公有云服务.本文剖析了由世纪互联运营的 Microsoft Azure 的运营模式.采购模式. ...

  8. JavaScript_11_验证

    表单验证: JavaScript可用来在数据被送往服务器前对HTML表单中的输入数据进行验证 1. 是否填写了必填项目 2. 邮件地址是否合法 ... <form action="su ...

  9. userBean设置属性2

    package com.java.model; public class Student { private String name;private int age; public String ge ...

  10. MovieReview—Despicable Me 3(神偷奶爸3)

    Minions&Unicorn         The film focuses on the story of Grew and the bastard Bled. A variety of ...