系列文章目录
第一章 Python基础入门之Hello World
第一章 Python基础入门之变量与数据类型
第一章 Python基础入门之ASCII(字符编码和二进制)
第一章 Python基础入门之单多行的注释和输出
第一章 Python基础入门之INPUT用户输入
第一章 Python基础入门之IF ELSE条件判断
第一章 Python基础入门之While循环与For循环
第一章 Python基础入门之什么是模块(库)
第一章 Python基础入门之什么是.pyc
第一章 Python基础入门之数据类型
第一章 Python基础入门之Python3数据类型中的bytes和str的区别
第一章 Python基础入门之文件读与写详解
第一章 Python基础入门之文件修改详解
第一章 Python基础入门之文件的with语句
第一章 Python基础入门之函数与函数式编程
第一章 Python基础入门之函数式编程参数详解
第一章 Python基础入门之局部变量与全局变量作用域
第一章 Python基础入门之递归和高阶函数
第一章 Python基础入门之装饰器详解以及案例解析
第一章 Python基础入门之列表生成式和生成器
前言
Python系列学习
相关内容
迭代器
通常上,直接作用于for循环的数据类型有以下几种:
- 一类是集合数据类型:list、tuple、dict、sct、str等
- 另一类是generator,包括生成器和带yield的generator function
这些可以直接作用于for循环的对象统称为可迭代对象Iterable。
1、使用isinstance()判断一个对象是否是Iterable对象(返回true/false):
# 1、迭代对象Iterable
# 使用isinstance()判断一个对象是否是Iterable可迭代对象
from collections.abc import Iterable
print( isinstance( [],Iterable ) )
print( isinstance( {},Iterable ) )
print( isinstance( 'abc',Iterable ) )
print( isinstance( (x for x in range(10)),Iterable ) )
print( isinstance( 88,Iterable ) )
生成器不仅可以作用于for循环,还被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值。
所以,可以被next()函数调用并不断返回下一个值的对象称为迭代器Iterator。
2、使用isinstance()判断一个对象是否是Iterator对象(返回true/false)
# 2、迭代器Iterator
# 使用isinstance()判断一个对象是否是Iterator迭代器
from collections.abc import Iterator
print( isinstance( (x for x in range(20)),Iterator ) )
print( isinstance( [],Iterator ) )
print( isinstance( {},Iterator ) )
print( isinstance( 'abc',Iterator ) )
为什么list、dict、str等数据类型不是迭代器Iterator ?
因为python的Iterator对象表示是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把数据流Iterator对象视为一个有序序列,但无法提前直到序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要反回下一个数据时才会计算。Iterator甚至可以表示为一个无限大的数据流,如全体自然数。而使用list是永远不可能存储全体自然数的。
list、dict、str等集合数据类型是可迭代对象Iterable,但不是Iterator,但可以通过iter()函数获得Iterator对象。
3、通过iter()函数把Iterable对象转化为Iterator对象(以列表为例)
# for循环本质是通过不断调用next()函数实现的,如:
for x in [1,2,3,4,5]:
pass
# 实际上完全等价于:
# 首先获得Iterator对象:
it = iter([1,2,3,4,5])
# 循环
while True:
try:
x = next(it) #获得下一个值
except.StopIteration:
break #遇到StopIteration就退出循环