python学习之可迭代对象&迭代器对象

可迭代对象 Iterable

含义:可以通过for...in..。这类语句遍历读取数据的对象称之为可迭代对象

遍历(迭代):依次从对象中把一个个元素取出来的过程

数据类型: str、list、tuple、dict、set等

可迭代对象的条件

1.对象实现了__iter__()方法

2.iter()方法返回了迭代器对象

1.3 for循环工作原理

1.先通过__iter__()可迭代对象的迭代器

2.对获取到的迭代器对象不断调用__next__()方法来获取

下一个值并将其赋值给临时变量i

1.4 isinstance():判断一个对象是否是可迭代对象或者是一个已知的数据类型

导入模块

复制代码
from collections.abc import Iterable
# isinstance(o,t) o--对象,t--类型,可以是直接或间接类名、基本类型或者元组
print(isinstance(123,Iterable))  #False
print(isinstance('123',Iterable)) #True
print(isinstance(123,(int,float,str))) #是其中的一种就会返回True

2.迭代器 Iterator

含义:迭代器是一个可以记住遍历位置的对象,迭代器对象从集合的第一个元素开始访问,知道所有元素被访问完结束。迭代器只能往前不能退后

迭代器里面有两个函数

iter():获取可迭代对象的迭代器

next():一个个去取元素,取完元素后会引发一个异常

复制代码
li = [1,2,3]
# 第一种方式:
# 1.创建迭代器对象
li2 = iter(li)
print('li2',li2)
# 2.获取下一条数据
print(next(li2))
print(next(li2))
print(next(li2))
# 3.取完元素之后,再使用next()会引发StopIteration异常
print(next(li2))
# 第二种方式:
li2 = li.__iter__()
print('li2',li2)
print(li2.__next__())
print(dir(li))

步骤:

1.iter()调用对象的__iter__(),并把__iter__()方法的返回结果作为自己的返回值

2.next()调用对象的__next__(),一个个取元素

3.所有的元素都取完了,next()就会引发StopIteration异常

可迭代对象 Iterable 迭代器 Iterator

凡是可以作用于for循环的都属于可迭代对象

凡是可作用于next()的都是迭代器

复制代码
from collections.abc import Iterable,Iterator
name = 'milk'
print(isinstance(name,Iterable))   #True
print(isinstance(name,Iterator))  #False
# 可迭代对象并不一定是迭代器对象
name2 = iter(name)  #将name转换为迭代器
print(isinstance(name2,Iterable)) #True
print(isinstance(name2,Iterator)) #True
复制代码
迭代器对象一定是可迭代对象
总结:
可迭代对象可以通过iter()转化成迭代器对象
如果一个对象拥有__iter__(),是可迭代对象,如果一个对象拥有__next__()和__iter__()方法,是迭代器对象
dir(): 查看对象中的属性和方法

3.迭代器协议

对象必须提供一个方法,执行该方法,要么就返回迭代器中的下一项,要么就引发StopIteration异常,来终止迭代

4.自定义迭代器类

两个特性: iter()方法和__next__()方法

复制代码
class Test(object):
    def __init__(self):
        self.num = 1
    def func(self):
        print(self.num)
        self.num += 1
test = Test()
print(test)
# test.func()
# test.func()
# test.func()
for i in range(10):
    test.func()
复制代码
class MyIterator(object):
    def __init__(self,max_num):
        self.num = 0
        self.max = max_num
    def __iter__(self):
        return self  #返回的是当前迭代器类的实例对象
    def __next__(self):
        if self.num >= self.max:
            raise StopIteration("数据已经被取完了")
        self.num += 1
        return self.num
mi = MyIterator(100)
print(mi)
for i in mi:
    print(i)
相关推荐
曲幽1 小时前
数据库实战:FastAPI + SQLAlchemy 2.0 + Alembic 从零搭建,踩坑实录
python·fastapi·web·sqlalchemy·db·asyncio·alembic
用户8356290780516 小时前
Python 实现 PowerPoint 形状动画设置
后端·python
ponponon7 小时前
时代的眼泪,nameko 和 eventlet 停止维护后的项目自救,升级和替代之路
python
Flittly7 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(5)Skills (技能加载)
python·agent
敏编程7 小时前
一天一个Python库:pyarrow - 大规模数据处理的利器
python
Flittly9 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(4)Subagents (子智能体)
python·agent
明月_清风16 小时前
Python 装饰器前传:如果不懂“闭包”,你只是在复刻代码
后端·python
明月_清风16 小时前
打破“死亡环联”:深挖 Python 分代回收与垃圾回收(GC)机制
后端·python
ZhengEnCi1 天前
08c. 检索算法与策略-混合检索
后端·python·算法
明月_清风2 天前
Python 内存手术刀:sys.getrefcount 与引用计数的生死时速
后端·python