python的生成器与迭代器和可迭代对象

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

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

1 #_*_ coding:utf-8 _*_
2
3 result = (x for x in range(10))
4
5 ‘‘‘
6 下面print的打印结果
7 <generator object <genexpr> at 0x0000026FA092B360>
8 ‘‘‘
9 print(result)  

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

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

 1 result = (x for x in range(10))
 2
 3 print(next(result)) # 0
 4 print(next(result)) # 1
 5 .
 6 .
 7 .
 8 print(next(result)) # 9
 9
10 # 如果在已经将生成器中的值全部取出后,那么久会产生一个StopIteration错误
11 print(next(result)) # StopIteration
12
13
14 print("===============================")
15
16 # 最简单取出生成器值的方式就是使用for循环,同时可以避免异常
17 for x in result:
18      print(x)

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

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

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

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

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

1 # coding:utf-8
2 from collections import *
3
4 if isinstance([],Iterable):
5     print("Yes")
6 else:
7     print("No")

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

再来说一下迭代器:

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

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

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

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

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

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

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

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

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

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

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

原文地址:https://www.cnblogs.com/liujunhang/p/9027885.html

时间: 2024-10-13 00:19:16

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

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

把一个列表[]改成()就创建了一个生成器:generator,generator保存的是算法. 可以用于for循环的数据类型:1.集合类型:list tuple dict set str2.generator 可以直接作用于for循环的对象统称为:可迭代对象(Iterable) from collections import Iterable print(isinstance([],Iterable)) print(isinstance({},Iterable)) print(isinstanc

学习7: 列表生成式,生成器,迭代器,可迭代对象

1) 列表生成式,即创建列表的方式 列表生成式,这里是中括号[] >>> [x*x for x in range(0,10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> [x * x for x in range(1, 11) if x % 2 == 0] [4, 16, 36, 64, 100] >>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ

迭代器_可迭代对象_生成器

[可迭代对象]保存的是已经生成好的数据,占用大量的空间有__iter__方法 就是可迭代对象(Iterable) [迭代器]保存的是生成数据的方法,占用极小的空间,需要时才返回数据既有__iter__,也有__next__ 就是迭代器(Iterator) [生成器]是一个[特殊]的迭代器,保存生成数据的方法(标志就是def中的[yiled],有了yield的def就不是函数(function) 生成器的send(参数) 可以在唤醒时返回参数(需要变量接收), 可迭代对象(iterable):能用

理解迭代器和可迭代对象

前言: 之前在迭代器.可迭代对象这一部分一直有些混淆,结合一些资料,表达我对这些概念的理解,未必都对,但是适合刚开始入手的朋友们从零开始理解 开门见山首先介绍可迭代对象和迭代器的通俗理解 迭代器就是能被next()调用得到下一次迭代值的对象,迭代器不直接保存迭代的序列值,而保存得到下一次迭代值的算法 可迭代对象就是能被iter()方法调用得到迭代对象的对象,只有可迭代对象才可用于for循环 for循环的底层实现原理: 以下是一个for循环的格式 for i in 可迭代对象: 循环体 实质是调用

Python全栈开发之---迭代器、可迭代对象、生成器

1.什么叫迭代 现在,我们已经获得了一个新线索,有一个叫做"可迭代的"概念. 首先,我们从报错来分析,好像之所以1234不可以for循环,是因为它不可迭代.那么如果"可迭代",就应该可以被for循环了. 这个我们知道呀,字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. 我们怎么来证明这一点呢? 1 from collections import Iterable 2 3 l = [1,2,3,4] 4 t = (1,2,3,4) 5 d =

Python菜鸟之路:Python基础-生成器和迭代器

一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退. 1. 迭代器优点 对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式.本质:迭代器就是生成一个有next()方法的对象,而不是通过索引来计数. 不要求事先准备好整个迭代过程中所有的元素.迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁.这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的

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

一.生成器 1.什么是生成器? 在python中,一边循环一边计算的机制,称为生成器:generator. 2.生成器有什么优点? 1.节约内存.python在使用生成器时对延迟操作提供了支持.所谓延迟,是指在需要的时候才产生结果,而不是立即产生结果.这样在需要的时候才去调用结果,而不是将结果提前存储起来要节约内存.比如用列表的形式存放较大数据将会占用不少内存.这是生成器的主要好处.比如大数据中,使用生成器来调取数据结果而不是列表来处理数据,因为这样可以节约内存. 2.迭代到下一次的调用时,所使

迭代器、可迭代对象、迭代器对象、生成器、生成器表达式和相关的面试题

迭代器: 迭代的工具.迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的.如计算机中的迭代开发,就是基于软件的上一个版本更新.以下代码就不是迭代,它只是单纯的重复 可迭代对象 python中一切皆对象,对于这一切的对象中,但凡有__iter__方法的对象,都是可迭代对象. 可迭代的对象:Python内置str.list.tuple.dict.set.file都是可迭代对象. 迭代器对象 只有字符串和列表都是依赖索引取值的,而其他的可迭代

Python中生成器和迭代器的功能介绍

生成器和迭代器的功能介绍 1. 生成器(generator) 1. 赋值生成器 1. 创建 方法:x = (variable for variable in iterable) 例如:x = (i for i in range(10)) print(x) >>> <generator object <genexpr> at 0x00000000006B85C8> 返回值:generator #使用元祖推导式的时候回变成一个生成器. 2. 调用 方法:x.__nex