0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python中的迭代器与生成器

马哥Linux运维 ? 来源:马哥Linux运维 ? 2025-02-20 10:43 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Python迭代器与生成器

列表生成式

列表生成式也叫做列表推导式,它本身还是列表,只不过它是根据我们定义的规则来生成一个真实的列表。

list2 = [x for x in range(10)]
print(list2)

下面是一个复杂的列子:

list1 = [x * y for x in range(1, 5) if x > 2 for y in range(1, 4) if y < 3]

# 上面的列表生成式等同于下面的代码
list4 = []
for x in range(1, 5):
    if x > 2:
        for y in range(1, 4):
            if y < 3:
                list4.append(x * y)

生成器

如果要创建一个100万个元素的列表,你使用上面的方式无疑非常占用内存,这时候就用到了生成器,它其实是保存一个你定义的规则,在需要用到元素的时候按照规则去生成一个,而不是保存好一大堆元素,这样就减少内存占用。不过生成器的元素只能顺序依次获取不能像真正列表那样可以按位置获取而且不能回退。

创建一个生成器,生成器保存的是一个算法,而不是具体的内容。可以看到和列表生成式的区别是就是把[]换成(),generator = (x for x in range(10))。

其实生成器就是一个迭代器,只不过它是一种特殊的迭代器:

print("generator是否是迭代器:", isinstance(generator, Iterator))  # 结果为 True
print("generator是否是可迭代对象:", isinstance(generator, Iterable))  # 结果为 True

如果要想获取生成器元素就只能通过next来获取下一个元素,必须顺序获取,当没有元素的时候抛出 StopIteration 异常。print(generator.__next__()) # 也可以这样来使用 next(generator)。

用生成器实现斐波那契数列:

def fib(length):
    """
    生成器定义一个斐波那契数列,生成器本身就是yield +  next实现。外部调用next来触发一次计算
    函数遇到yield返回,然后下一次next则继续从上一次yield的地方向下执行,直到遇到某个结束条件
    :param length:
    
    """
    n, a, b = 0, 0, 1
    while n < length:
        yield b
        """
        a, b = b, a + b 等于 t = (b, a + b) a=t[0]  b=t[1]  当计算b = a + b的时候,
        这里的a并不是之前 a = b 之后a值,而是之前的a值,所以它是先做 = 右边的计算,然后赋值给左边的
        """
        a, b = b, a + b
        n = n + 1
    return 'done'


for i in fib(10):
print(i)

迭代器

可以用next()函数调用来获取下一个元素的对象叫做迭代器。生成器就可以,但是普通集合类比如list、dict、str就不可以。集合类的对象比如list、dict、set、str;还有生成器都是可迭代对象,也就是可以遍历的。但是它们并不一定都是迭代器。list、dict、str等数据类型不是Iterator。

list1 = [1, 2, 3, 4, 5, 6]
print("list1是否是迭代器:", isinstance(list1, Iterator))  # 结果为 False
print("list1是否是可迭代对象:", isinstance(list1, Iterable))  # 结果为 True
print("list1的长度:", len(list1))  # 结果为具体长度

if hasattr(list1, "__next__"):
    print("list1是迭代器")

把list1变成迭代器:

interObj = iter(list1)
print("list1是否是迭代器:", isinstance(interObj, Iterator))  # 结果为 True
print("list1是否是可迭代对象:", isinstance(interObj, Iterable))  # 结果为 False
# print("interObj的长度:", len(interObj))  # 无法获取长度

if hasattr(interObj, "__next__"):
    print("interObj是迭代器")

可遍历的对象不一定是迭代器,但是肯定是可迭代对象。

迭代器同时一定也是可迭代对象。生成器是一种特殊的迭代器,所以也是可迭代对象。

可迭代对象和迭代器最大的区别就是前者可以通过len()获取长度而后者不能

且迭代器一定可以通过next()函数(说明该对象包含__next__内置方法)获取下一个元素,而可迭代对象不一定。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 生成器
    +关注

    关注

    7

    文章

    322

    浏览量

    21988
  • python
    +关注

    关注

    56

    文章

    4831

    浏览量

    87355
  • 迭代器
    +关注

    关注

    0

    文章

    45

    浏览量

    4478

原文标题:Python迭代器与生成器

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    python生成器

    python生成器1. 什么是生成器生成器(英文名 Generator ),是一个可以像迭代
    发表于 02-24 15:56

    pim卡资料生成器

    pim卡资料生成器
    发表于 11-22 23:23 ?6次下载

    自制酸奶生成器

    自制酸奶生成器
    发表于 04-23 11:48 ?986次阅读
    自制酸奶<b class='flag-5'>生成器</b>

    代码生成器的应用

    jeesite框架代码生成器,可以很方便的生成代码,挺不错的。
    发表于 01-14 15:19 ?0次下载

    STM32库函数代码自动生成器正式版

    STM32库函数代码自动生成器正式版 STM32库函数代码自动生成器正式版
    发表于 07-25 18:52 ?0次下载

    了解Python数据结构迭代对象、迭代生成器的概念

    在了解Python的数据结构时,容器(container)、可迭代对象(iterable)、迭代(iterator)、生成器(genera
    发表于 11-15 17:34 ?1040次阅读
    了解<b class='flag-5'>Python</b>数据结构<b class='flag-5'>迭代</b>对象、<b class='flag-5'>迭代</b><b class='flag-5'>器</b>、<b class='flag-5'>生成器</b>的概念

    带你一起学习彻底搞懂Python生成器

    在这说「迭代」的原因是「生成器」自动实现了「迭代协议」,所谓协议,就是一种约定。为了更好的理解生成器
    的头像 发表于 02-25 09:13 ?3056次阅读

    AN-113:精密坡道生成器

    AN-113:精密坡道生成器
    发表于 05-16 12:04 ?6次下载
    AN-113:精密坡道<b class='flag-5'>生成器</b>

    python生成器是什么

    python生成器 1. 什么是生成器生成器(英文名 Generator ),是一个可以像迭代
    的头像 发表于 02-24 15:53 ?3980次阅读

    Arduino赞美生成器

    电子发烧友网站提供《Arduino赞美生成器.zip》资料免费下载
    发表于 11-09 14:22 ?1次下载
    Arduino赞美<b class='flag-5'>生成器</b>

    通用RFID生成器

    通用RFID生成器资料分享
    发表于 02-10 15:35 ?1次下载

    python迭代调用内置函数计时比较(上)

    python迭代工具自动调用迭代对象next方法,对迭代对象进行遍历。 python的for循环、列表解析、map方法、
    的头像 发表于 02-21 14:56 ?854次阅读

    python迭代调用内置函数计时比较(下)

    python迭代工具自动调用迭代对象next方法,对迭代对象进行遍历。 python的for循环、列表解析、map方法、
    的头像 发表于 02-21 14:56 ?775次阅读

    Python生成器是什么?它们的效率和可用性如何?

    Python 是一种以灵活性和多功能性着称的语言,它提供了一种称为生成器的强大功能。
    发表于 07-19 14:33 ?684次阅读

    Python生成器的使用方法

    举一个例子,编写一个函数计算一串数字里所有偶数的个数,其实是很简单的问题,但是有些人是用生成器这么写的: In [ 66 ]: def f1 ( x ): ....: return sum ( c
    的头像 发表于 11-03 15:41 ?730次阅读