python:迭代器对象,迭代器和迭代

学习目标:

一、了解迭代对象、迭代器和迭代的区别和联系。
二、迭代对象有哪些?
三、关于迭代器和生成器
1. 迭代器的定义;
2. 迭代器的创建;
3. 迭代器的判断。
四、迭代的使用


学习内容:

Python中任意的对象,只要它定义了可以返回⼀个迭代器的__iter__⽅法,或者定义了可以⽀持下标索引的__getitem__⽅法,那么它就是⼀个可迭代对象

任意对象,只要定义了next(Python2) 或者__next__⽅法,它就是⼀个迭代器

1. 迭代器的定义
迭代器指的是迭代取值的工具。
迭代是指一个重复的过程,每一次重复都是基于上一次结果而来,迭代提供了一种通用的不依赖索引的迭代取值方式。

2. 可迭代对象与迭代器的异同

2.1.可迭代对象
但凡内置有__iter__方法的对象,都称为可迭代对象。
常见可迭代的对象:str,list,tuple,dict,set,文件对象。

2.2.迭代器对象
既内置有__iter__方法,又内置__next__方法的对象。执行该方法可以不依赖索引取值。
执行迭代器的__iter__方法得到的依然是迭代器。
文件对象本身就是一个迭代器对象.

迭代器一定是可迭代对象,可迭代对象不一定是迭代器对象。

迭代:⽤简单的话讲,它就是从某个地⽅(⽐如⼀个列表)取出⼀个元素的过程。比如,当我们使⽤⼀
个循环来遍历某个东西时,这个过程本⾝就叫迭代


生成器也是⼀种迭代器,但只能对其迭代⼀次。
因为生成器并没有把所有的值存在内存中,⽽是在运⾏时⽣成值。遍历使⽤时,要么⽤for循环,要么将它
们传递给任意可以进⾏迭代的函数和结构中。
⼤多数时候⽣成器是以函数来实现的,函数并不返回⼀个值,⽽是yield(“⽣出”)⼀个值。

def def_generator_name(*args, **kwargs):
    if kwargs["numbers"]:
        for i in range(kwargs["numbers"]):
            yield i

    else:
        return None
        
if __name__ == "__main__":
    gen = def_generator_name(numbers=12)

    print(type(gen), gen.__next__())
    print(gen.__next__())
    print(gen.__next__())
    print(gen.__next__())
    print(gen.__next__())

输出:<class 'generator'> 0 1 2 3 4
3. 迭代器的优缺点

迭代器优点:
1).提供了一种通用不依赖索引的迭代取值方式;
2).同一时刻在内存中只存在一个值,更节省内存;

迭代器缺点:
1).取值不如按照索引的方式灵活,不能取指定的某一个值,只能往后取,不能往前去;
2).无法预测迭代器的长度;


手动创建迭代器

# 手写一个迭代器对象
class MyRange:
    def __init__(self, n):
        self.i = 1
        self.n = n

    def __iter__(self):
        return self

    def __next__(self):
        if self.i <= self.n:
            i = self.i
            self.i += 1
            return i
        else:
            raise StopIteration

测试:

ran = MyRange(5)
print(hasattr(ran, "__next__"))
print([i for i in ran])

# 方法二iter()
range2 = iter([1, 2, 3, 4, 5, 6])
print(hasattr(range2, "__next__"))
print([i for i in range2])

输出:

True
[1, 2, 3, 4, 5]
True
[1, 2, 3, 4, 5, 6]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏常青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值