#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 学习网站:www.liaoxuefeng.com
#****************************************************
# Python3 高级特性-迭代器 *
#****************************************************
print ("--------------------分割线------------------")
#============
# 迭代器
#============
'''
可迭代对象(Iterable):可以直接作用于for循环的对象
一类是集合数据类型,如list, tuple, dict, set, str等
一类是generator,包括生成器和带yield的generator function
可以使用isinstance()判断一个对象是否是Iterable对象
'''
from collections import Iterable
print( isinstance([], Iterable) ) # True
print( isinstance({}, Iterable) ) # True
print( isinstance((), Iterable) ) # True
print( isinstance((x for x in range(10)), Iterable) ) # True
print( isinstance(100, Iterable) ) # False
print ("--------------------分割线------------------")
'''
迭代器(Iterator):可以被next()函数调用并不断返回下一个值的对象
可以使用isinstance()判断一个对象是否是Iterator对象
'''
from collections import Iterator
print( isinstance([], Iterator) ) # False
print( isinstance((), Iterator) ) # False
print( isinstance({}, Iterator) ) # False
print( isinstance('str', Iterator) ) # False
print( isinstance(100, Iterator) ) # False
# 列表生成式
print( isinstance([x for x in range(5)], Iterator) ) # False
# 生成器
print( isinstance((x for x in range(5)), Iterator) ) # True
print ("--------------------分割线------------------")
'''
生成器都是Iterator对象,但list,dict,str虽然是Iterable,却不是Iterator
可使用iter()函数把list,dict,str等Iterable变成Iterator
'''
print( isinstance( iter([]), Iterator ) ) # True
print( isinstance( iter(()), Iterator ) ) # True
print( isinstance( iter({}), Iterator ) ) # True
print( isinstance( iter('str'), Iterator ) )# True
'''
为什么list,dict,str等数据类型不是Iterator???
因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()
函数调用并不断返回下一个数据,知道没有数据时抛出StopIteration错误。
可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度
只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是
惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是
永远不可能存储全体自然数的。
'''
Python3 学习笔记18_高级特性(迭代器)_20180308
最新推荐文章于 2024-02-29 14:20:20 发布