高频面试题之Python迭代器和迭代对象的区别

简介: 首先有很多开发者是不太在意这个问题的, 因为无论是**迭代器(Iterator)**还是**迭代对象(Iterable)**都不影响我们循环遍历的使用, 再加上名字区别不大, 很多人将这两个东西认为是一个东西, 但是如果面试官单独提出这问题了, 那我们就必须细化区分这2个东西了

高频面试题之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也是迭代器

相关文章
|
2月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
166 4
|
3月前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
128 4
|
4月前
|
安全 JavaScript Java
Python中None与NoneType的真相:从单例对象到类型系统的深度解析
本文通过10个真实场景,深入解析Python中表示“空值”的None与NoneType。从单例模式、函数返回值,到类型注解、性能优化,全面揭示None在语言设计与实际编程中的核心作用,帮助开发者正确高效地处理“无值”状态,写出更健壮、清晰的Python代码。
416 3
|
4月前
|
Python
解决Python中AttributeError:'image'对象缺少属性'read_file'的问题策略。
通过上述策略综合考虑,您将能够定位问题并确定如何解决它。记住,Python社区很庞大,也很乐于帮助解决问题,因此不要害怕在求助时提供尽可能多的上下文和您已经尝试过的解决方案。
135 0
|
8月前
|
Python
[oeasy]python086方法_method_函数_function_区别
本文详细解析了Python中方法(method)与函数(function)的区别。通过回顾列表操作如`append`,以及随机模块的使用,介绍了方法作为类的成员需要通过实例调用的特点。对比内建函数如`print`和`input`,它们无需对象即可直接调用。总结指出方法需基于对象调用且包含`self`参数,而函数独立存在无需`self`。最后提供了学习资源链接,方便进一步探索。
205 17
|
8月前
|
Python
解决Python报错:DataFrame对象没有concat属性的多种方法(解决方案汇总)
总的来说,解决“DataFrame对象没有concat属性”的错误的关键是理解concat函数应该如何正确使用,以及Pandas库提供了哪些其他的数据连接方法。希望这些方法能帮助你解决问题。记住,编程就像是解谜游戏,每一个错误都是一个谜题,解决它们需要耐心和细心。
378 15
|
8月前
|
安全 测试技术 开发者
Python中的“空”:对象的判断与比较
在Python开发中,判断对象是否为“空”是常见操作,但其中暗藏诸多细节与误区。本文系统梳理了Python中“空”的判定逻辑,涵盖None类型、空容器、零值及自定义对象的“假值”状态,并对比不同判定方法的适用场景与性能。通过解析常见误区(如混用`==`和`is`、误判合法值等)及进阶技巧(类型安全检查、自定义对象逻辑、抽象基类兼容性等),帮助开发者准确区分各类“空”值,避免逻辑错误,同时优化代码性能与健壮性。掌握这些内容,能让开发者更深刻理解Python的对象模型与业务语义交集,从而选择最适合的判定策略。
266 5
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!

推荐镜像

更多