高频面试题之Python迭代器和迭代对象的区别
本章从以下三点入手:
- 1.什么是迭代对象?
- 2.什么是迭代器?
- 3.迭代器和迭代对象的区别
1. 迭代对象--Iterable
在python复合数据类型中: 列表(list), 元组(tuple),字典(dict), 集合(set), 字符串(string) 这些都是 迭代对象从定义上来讲: 凡是 类Class 内部实现了
**__iter__**
方法, 实例化的对象都称之为迭代对象
from collections.abc import Iterable
print("list1是不是迭代对象:", isinstance([1, 2, 3], Iterable))
print("tuple1是不是迭代对象:", isinstance((1, 2, 3), Iterable))
print("set1是不是迭代对象:", isinstance({1, 2, 3}, Iterable))
print("dict1是不是迭代对象:", isinstance({'type': '迭代对象'}, Iterable))
print("str1是不是迭代对象:", isinstance('diedaiduixiang', Iterable))
-- list1是不是迭代对象: True
-- tuple1是不是迭代对象: True
-- set1是不是迭代对象: True
-- dict1是不是迭代对象: True
-- str1是不是迭代对象: True
from collections.abc import Iterable, Iterator
class CustomClass(object):
def __init__(self):
self.name = '迭代对象'
def __iter__(self):
pass
obj = CustomClass()
print("判断对象是否是迭代对象:", isinstance(obj, Iterable))
print("判断对象是否是迭代器:", isinstance(obj, Iterator))
print("查看对象类型:", type(obj))
-- 判断对象是否是迭代对象: True
-- 判断对象是否是迭代器 : Flase
-- 查看对象类型: <class '__main__.CustomClass'>
2. 迭代器-Iterator
从定义上来讲: 凡是 类Class 内部实现了__iter__
和__next__
方法, 实例化的对象都称之为迭代器对象内置函数: iter(迭代对象)可以将 迭代对象转换成迭代器
内置函数: next(迭代器) 可以将 迭代器的数据逐层获取输出
from collections.abc import Iterable, Iterator
class CustomClass(object):
def __init__(self):
self.name = '迭代对象'
def __iter__(self):
pass
def __next__(self):
pass
obj = CustomClass()
print("判断对象是否是迭代对象:", isinstance(obj, Iterable))
print("判断对象是否是迭代器: ", isinstance(obj, Iterator))
print("查看对象类型:", type(obj))
-- 判断对象是否是迭代对象: True
-- 判断对象是否是迭代器: True
-- 查看对象类型: <class '__main__.CustomClass'>
from collections.abc import Iterator, Iterable
# 常用迭代对象 在这里只演示一个, 其他类型请自行测试
list1 = [1, 2, 3]
# 使用iter() 函数把 迭代对象 转换成 迭代器
iterator_list = iter(list1)
# 使用next() 函数 获取 迭代器中的数据
print('未转换前是不是迭代器:', isinstance(list1, Iterator))
print(' 转换后是不是迭代器:', isinstance(iterator_list, Iterator))
print(next(iterator_list))
print(next(iterator_list))
print(next(iterator_list))
-- 未转换前是不是迭代器: False
-- 转换后是不是迭代器: True
-- 1
-- 2
-- 3
3. 迭代器和迭代对象的区别
1.迭代对象和迭代器 都可以使用循环遍历2.迭代对象和迭代器都有
__iter__
函数实现3.迭代器包含了迭代对象, 换句话说迭代器一定是迭代对象
4.迭代对象不是迭代器, 因为没有
__next__
函数实现5.生成器generator也是迭代器