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

Posted liujunhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()方法来将对象转换为迭代器。

 


以上是关于python的生成器与迭代器和可迭代对象的主要内容,如果未能解决你的问题,请参考以下文章

Python基础-16生成器-迭代器

python迭代器和可迭代对象

python迭代器和可迭代对象

python迭代器和可迭代对象

迭代器和生成器

迭代器和可迭代协议