可以直接作用于for
循环的数据类型有以下几种:
一类是集合数据类型,如list
、tuple
、dict
、set
、str
等;
一类是generator
,包括生成器和带yield
的generator function。
这些可以直接作用于for
循环的对象统称为可迭代对象:Iterable
。
可以使用内置函数isinstance()
判断一个对象是否是Iterable
对象:(可迭代对象)
请注意区分:
可迭代对象
与迭代器
来让我们首先认识一下判断类型的isinstance()
,以及它与type
isinstance or type
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
isinstance() 与 type() 区别:
- type() 不会认为子类是一种父类类型,不考虑继承关系。
- isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
语法
以下是 isinstance() 方法的语法:
isinstance(object, classinfo) 参数# - object -- 实例对象。# - classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。
返回值
如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。示例如下:
s = "123"print(isinstance(s, str)) # Trueprint(isinstance(s, int)) # False
可迭代对象示例
# 一类是集合数据类型,如`list`、`tuple`、`dict`、`set`、`str`等;# 一类是`generator`,包括生成器和带`yield`的generator function。from collections.abc import Iterable# ListL1 = [] L2 = list(range(11)) print(isinstance(L1, Iterable)) # Trueprint(isinstance(L2, Iterable)) # True# TupleT1 = () T2 = (1,) T3 = tuple(range(11)) print(isinstance(T1, Iterable)) # Trueprint(isinstance(T2, Iterable)) # Trueprint(isinstance(T3, Iterable)) # True# 由以上得知,无论是None还是只包含一个元素,均为可迭代对象
迭代器示例
from collections.abc import Iterator print(isinstance((x for x in range(10)), Iterator)) # Trueprint(isinstance([], Iterator)) # Falseprint(isinstance({}, Iterator)) # Falseprint(isinstance('abc', Iterator)) # False
可迭代对象转迭代器
生成器都是Iterator
对象,但list
、dict
、str
虽然是Iterable
,却不是Iterator
。
使用iter()
函数将list、
dict、
str等
Iterable变成
Iterator`
print(isinstance(iter([]), Iterator))# Trueprint(isinstance(iter('abc'), Iterator))# True
迭代器的优势与特点
迭代器的优势,逐步推导。而不是一次返回所有。
创建一个嵌入您选择的数据结构的算法。迭代器的好处是,它们允许您分离数据和算法