如何判断一个类的返回对象是否是迭代器

1. 使用 isinstance() 和 collections.abc.Iterator

from collections.abc import Iterator

a = map(lambda x: x**3, [1, 2, 3])

print(isinstance(a, Iterator)) # 输出: True

2.检查迭代器协议的方法

a = map(lambda x: x**3, [1, 2, 3])

print(hasattr(a, '__iter__')) # 输出: True

print(hasattr(a, '__next__')) # 输出: True

# 迭代器的 __iter__ 方法返回自身
print(a.__iter__() is a)  # 输出: True

4. 与 Iterable(可迭代对象)的区别

from collections.abc import Iterable, Iterator

a = map(lambda x: x**3, [1, 2, 3])

lst = [1, 2, 3]

print(isinstance(a, Iterable)) # True

print(isinstance(a, Iterator)) # True <- map对象既是可迭代的又是迭代器

print(isinstance(lst, Iterable)) # True

print(isinstance(lst, Iterator)) # False <- 列表是可迭代的但不是迭代器

  • Iterable(可迭代对象):可以使用 for 循环遍历的对象,有 __iter__ 方法
  • Iterator(迭代器):除了 __iter__ 还有 __next__ 方法,可以逐个产生值

5. 查看文档或源代码

a = map(lambda x: x**3, [1, 2, 3])

print(a.__doc__) # 查看文档字符串

print(help(map)) # 查看map函数的帮助文档

6. 通过行为判断

a = map(lambda x: x**3, [1, 2, 3])

测试是否可以被for循环遍历

for item in a:print(item) # 成功,说明是可迭代的

测试是否可以多次迭代

a = map(lambda x: x**3, [1, 2, 3])list_a = list(a) # 第一次消费list_a2 = list(a) # 第二次消费,得到空列表 []print(list_a2 == []) # True,说明是迭代器(只能消费一次)

对比列表(非迭代器)

lst = [1, 2, 3]

list_lst1 = list(lst) # [1, 2, 3]

list_lst2 = list(lst) # [1, 2, 3]

可以多次迭代a = map(lambda x: x**3, [1, 2, 3])

# 测试是否可以被for循环遍历

for item in a:

print(item) # 成功,说明是可迭代的

# 测试是否可以多次迭代

a = map(lambda x: x**3, [1, 2, 3])

list_a = list(a) # 第一次消费

list_a2 = list(a) # 第二次消费,得到空列表 []

print(list_a2 == []) # True,说明是迭代器(只能消费一次)

# 对比列表(非迭代器)

lst = [1, 2, 3]

list_lst1 = list(lst) # [1, 2, 3]

list_lst2 = list(lst) # [1, 2, 3] 可以多次迭代

7.快速记忆规则 在 Python 3 中,以下内置函数都返回迭代器而不是列表:

map()

filter()

zip()

range() 实际上返回 range 对象,也是可迭代的但不是迭代器

enumerate()

8.使用 iter() 函数测试

python a = map(lambda x: x**3, [1, 2, 3]) print(iter(a) is a) # 输出: True

对于非迭代器的可迭代对象

lst = [1, 2, 3]print(iter(lst) is lst) # 输出: False

全部评论

相关推荐

03-11 23:33
已编辑
曲阜师范大学 后端工程师
牛客68808588...:果真开发过12306购票系统吗,这不是一眼就被看穿了
点赞 评论 收藏
分享
刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务