来简单的说下python中的生成器和可迭代对象以及迭代器的问题。只是简单地记录一下并不涉及太深入的内容。

首先来说一下什么是生成器,先看下面的代码:

 #_*_ coding:utf-8 _*_ 

 result = (x for x in range(10))

 '''
下面print的打印结果
<generator object <genexpr> at 0x0000026FA092B360>
'''
print(result)

 上面的这种代码其实就是生成器,而通过print也发现,我们无法打印出计算出来的结果。

而如果想要计算结果的话,只能通过两种方式,next()方法和for循环。看下面的代码:

 result = (x for x in range(10))

 print(next(result)) # 0
print(next(result)) #
.
.
.
print(next(result)) # 9 # 如果在已经将生成器中的值全部取出后,那么久会产生一个StopIteration错误
print(next(result)) # StopIteration print("===============================") # 最简单取出生成器值的方式就是使用for循环,同时可以避免异常
for x in result:
print(x)

下面在来说一下可迭代对象:

简单的说,可以直接作用于for循环的对象都可以称之为可迭代对象(Iterable)。

例如上面我们说的生成器,就是一个可迭代对象。

在很多常用的数据类型里面,例如:list,dict,tuple,set,str 还有generator 这些都是可迭代对象。

那么该如何判断某数据类型是不是可迭代对象呢?可以用isinstance() 来进行判断,下面是一段简单的示例代码:

 # coding:utf-8
from collections import * if isinstance([],Iterable):
print("Yes")
else:
print("No")

在使用上面的代码的时候不要忘了引入对应的模块。

再来说一下迭代器:

迭代器简单一点说就是 可以被next()方法不断调用,并且返回下一个值的对象就是迭代器,Iterator。

(例如最开始说到的生成器,就是一个迭代器,同时,生成器也是可迭代对象。这里需要注意的是,所有的生成器都是迭代器,而所有的迭代器未必都是生成器)

同样,我们可以通过isintance() 的方法来判断某个数据到底是不是迭代器。

这里判断的代码就不写了,跟上面的判断代码一样。

其实经过实践之后就会发现,很多的常用的数据类型都是可迭代对象(Iterable)但是并不是迭代器(Iterator),那么这个时候,如果开发需要,我们可以通过iter()这个方法将可迭代对象转换为迭代器。

 # coding:utf-8
from collections import *
# 创建一个列表
list_test = [1,2,3]
# 判断这个列表是不是一个迭代器
if isinstance(list_test,Iterator):
print("Yes")
else:
print("No") # 输出结果为No # 使用iter进行转换
result = iter(list_test)
# 转换完成后可以使用next()方法
print(next(result)) # 也可以使用for循环
for i in result:
print(i)

在这可以简单的进行一下总结:

主要有三个概念:生成器、可迭代对象、迭代器

生成器可以采用next方法获取值,也可以通过for循环获取值

可迭代对象,凡是可以作用于for循环的都是可迭代对象,生成器也是可迭代对象

迭代器,生成器除了是可迭代对象,也是迭代器。可以使用isinstance()方法来判断对象是不是迭代器或者是不是可迭代对象,基本上我们常用的很多数据类型都是可迭代对象,但是并不是迭代器,但是我们可以使用iter()方法来将对象转换为迭代器。

python的生成器与迭代器和可迭代对象的更多相关文章

  1. Python的容器、生成器、迭代器、可迭代对象的家谱

    前言 之前虽然写Python,但是对Python的这些概念也是模模糊糊,知道有一天,看到了一篇文章,讲的透彻,所以就写这篇作为对于这篇高文的读书笔记吧 致谢,该文作者,完全理解Python迭代对象.迭 ...

  2. Python生成器、迭代器、可迭代对象

    把一个列表[]改成()就创建了一个生成器:generator,generator保存的是算法. 可以用于for循环的数据类型:1.集合类型:list tuple dict set str2.gener ...

  3. 搞清楚 Python 的迭代器、可迭代对象、生成器

    很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...

  4. 2019-02-02 Python学习——生成器杨辉三角,迭代器与可迭代对象的区别

    练习 杨辉三角定义如下: 1 / \ 1 1 / \ / \ 1 2 1 / \ / \ / \ 1 3 3 1 / \ / \ / \ / \ 1 4 6 4 1 / \ / \ / \ / \ / ...

  5. Python中生成器和迭代器的区别(代码在Python3.5下测试):

    https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...

  6. python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解

    python中"生成器"."迭代器"."闭包"."装饰器"的深入理解 一.生成器 1.生成器定义:在python中,一边 ...

  7. python tips:迭代器与可迭代对象

    for循环 for i in s: print(i) 在上述for循环中,不断地将s中的值赋值给i,然后打印出来.这种只针对s中元素的循环称为对s的迭代,能够迭代的s称为可迭代的. python为了实 ...

  8. python语法生成器、迭代器、闭包、装饰器总结

    1.生成器 生成器的创建方法: (1)通过列表生成式创建 可以通过将列表生成式的[]改成() eg: # 列表生成式 L = [ x*2 for x in range(5)] # L = [0, 2, ...

  9. Python之生成器、迭代器

    生成器 生成器类似返回值为数组的一个函数,这个函数可以接受参数,可被调用,但只能产生一个值,所以大大节省内存. 生成器表达式的语法非常简单,只需要将列表推导式的中括号改成小括号就可以了 [x+x fo ...

随机推荐

  1. js手机短信验证

    贴代码之前,我们先讲一下这里我们用到的技术主要有1个.setInterval(),这个方法可以实现倒计时的效果. css: .weui_btn_disabled.weui_btn_default { ...

  2. Oracle Flashback 详解

    Oracle flashback 是一种方便快捷的数据库恢复技术,它不使用备份文件,通过闪回日志可以使数据库恢复到过去的某个状态,当用户发生逻辑错误时(误删表数据.表.表空间等)需要快速恢复数据库,可 ...

  3. [转帖]Vim 编辑器底端 [noeol], [dos] 的含义

    Vim 编辑器底端 [noeol], [dos] 的含义 2012年11月28日 23:13:04 strongwangjiawei 阅读数:15484 https://blog.csdn.net/s ...

  4. TextView不用ScrollViewe也可以滚动的方法

    转自:http://www.jb51.net/article/43377.htm android TextView不用ScrollViewe也可以滚动的方法. TextView textview = ...

  5. mysql 如何查看sql语句执行时间和效率

    查看执行时间 1 show profiles; 2 show variables;查看profiling 是否是on状态: 3 如果是off,则 set profiling = 1: 4 执行自己的s ...

  6. dom 事件主要内容

    一 . onclick(单击) 原图 单击btn1 在点击btn2 二 . onfocus 和 onblur onfocus(聚焦, 鼠标点击输入框) onblur(模糊, 鼠标点击输入框外的地方) ...

  7. Data Structures & js &ES 6 & ES next

    Data Structures & js &ES 6 & ES next Algorithm Singly-Linked List & Doubly-Linked Li ...

  8. 图像识别opencv学习自修第一天【opencv的安装】

    1. 安装步骤 (1)安装python (2)安装xcode (3)使用macports现成包安装opencv (4)安装scipy 2. 安装实战 (1)已经安装好了python,并安装好了virt ...

  9. ADO.NET工具类(一)

    using System; using System.Collections.Generic; using System.Text; using System.Data.SqlClient; usin ...

  10. 学习 Spring (二) Spring 注入

    Spring入门篇 学习笔记 常用的两种注入方式 设值注入 构造注入 示例准备工作 添加 InjectionDAO: public interface InjectionDAO { void save ...