Iterable & Iterator

import collections # import 后面直接写模块名 (导入标准库模块)
from collections(具体的模块名) import Iterable(属性)  # 从collections模块中导入Iterable这个属性,只是导单个方法,其它方法都没有导入进来
格式: from + 模块名 + import + 属性 (精确导入)
'''
可迭代对象:  可以作用于for循环的对象(容器),就是可迭代对象
         例如: list、tuple、set、dict、string、生成器对象(generator)# generator 可能来源 于生成器表达式,也可能来源于生成器函数

            如何高效的检测某种数据类型是否是可迭代对象?
            collections模块中的isinstance()方法  # isinstance(obj, Iterable)
'''
print(isinstance([],collections.Iterable ))# 在isinstance里面传参,第一个参数传一个空列表,第二个参数为:因为传入的是collections # 所以用collections去点Iterable   # 判断是否是一个Iterable  # Iterable意思是:可迭代对象
print(isinstance((),collections.Iterable ))
print(isinstance({},collections.Iterable ))
print(isinstance(set(),collections.Iterable ))
print(isinstance("",collections.Iterable ))
print(isinstance(123,collections.Iterable ))  # 不可迭代对象
'''
运行如下:
       True  可迭代对象
       True  可迭代对象
       True  可迭代对象
       True  可迭代对象
       True  克迭代对象
       False 不可迭代对象
'''
'''
如果是按照from collections import Iterable (精确导入)这种方法导入  下面的打印就不用collections去点Iterable了
'''
from collections import Iterable  # 精确导入这个Iterable 所以没有必要再加collections
print(isinstance((), Iterator))
print(isinstance({}, Iterator))
print(isinstance(set(), Iterator))
print(isinstance("", Iterator))
from collections import Iterator

print(isinstance((x for x in range(3)), Iterator))
'''
迭代器对象:
            1).可以作用于for循环的对象(容器)
            2).可以直接被next函数调用的对象

            还是使用isinstance() 方法 # isinstance(obj, Iterator)方法来判断是否为迭代器对象
'''
'''
可迭代对象和迭代器对象
Iterable 可迭代对象
Iterator 迭代器对象

'''

list = [10, 20, 30, 40, 50]
# 如何将list、tuple...等 可迭代对象 转换为 迭代器对象 呢?
# 使用内置的iter()方法实现
it = iter(list)  # 固定模式
print(isinstance(it, Iterator))
print(isinstance(it, Iterable))

# 不能把list转换为generator对象
# genn = generator(list) # 编译报错,方法不存在!

# 总结:
#      迭代器对象一定是可迭代对象
#      可迭代对象不一定是迭代器对象
#      生成器对象(generator)是迭代器的一种特例

# 补充:
#      next() 函数每次执行内部光标走一步,直到走到最后一个位置,如果还要强硬的去调用next()
#      会报错:StopIteration
阅读更多
上一篇生成器的引入讲解
下一篇TCP和UDP的区别
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭