打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
简谈list相关的生成器表达式


首先看看一个列表的类型,我们通过isinstance() 函数来判断一个列表的类型,通过实验1可以看出其只是一个可迭代的对象,而不是一个迭代器。可以通过iter() 函数返回一个其对应的迭代器。

“生成器表达式(简称生成式)”实际上可以理解为“迭代”和“列表解析”的组合,它使用小括号来表示。在实验2中,该生成式既是一个迭代器,又是一个可迭代对象。但是这个时候生成式是不能直接以列表形式输出打印的。

from typing import Iterable, Iterator

if __name__ == "__main__":

    print("====== 案例1 ==========")

    lst = [1, 4, 8]

    print(isinstance(lst, Iterable))   # 是否可迭代 True

    print(isinstance(lst, Iterator))   # 是否迭代器 False

    print(isinstance(iter(lst), Iterator))  # 转成迭代器 True

    print("====== 案例2 ==========")

    lst2 = (x * x for x in range(1, 4))

    print(isinstance(lst2, Iterable))  # 是否可迭代 True

    print(isinstance(lst2, Iterator))  # 是否迭代器 True

    print(lst2)

输出:

====== 案例1 ==========

True

False

True

====== 案例2 ==========

True

True

<generator object <genexpr> at 0x00000000029DFB88>

在列表中,我们可以通过 range() 函数自动生成一个整数列表,也可以在生成新列表的同时,对原列表元素再依次进行其它的处理。在没有for进行循环迭代的时候,我们需要通过list() 函数将其转换为一个可以输出的列表。

if __name__ == "__main__":

    lst = list(range(5))

    print(lst)

    lst = [x+1 for x in [5, 5, 5]]

    print(lst)

    lst = [x * x for x in list(range(1, 8)) if x % 2 == 0]

    print(lst)

    lst = [x * y for x in range(1, 3) for y in range(10, 15)]

    print(lst)

输出:    

[0, 1, 2, 3, 4]

[6, 6, 6]

[4, 16, 36]

[10, 11, 12, 13, 14, 20, 22, 24, 26, 28]

生成器是一个“机器”,用来生产零件,每调用一次 next() 函数的时候就生产一个零件,所以,调用生成器提前不知道有多少个零件,只能通过 next() 方法进行不停调用,直至抛出StopIteration异常为止。调用生成器的时候,碰到 yield 语句就停止本次生产。

from typing import Iterable, Iterator

if __name__ == "__main__":

    print("====== 案例1 ==========")

    # 用小括号表示的是生成器

    lst = (x * x for x in range(5))

    # 生成器返回的是一个对象,而不是列表

    print(type(lst))

    # 生成器生成的对象,需要使用迭代(for)的方法查看

    for x in lst:

        print(x)

    print("====== 案例2 ==========")

    # 调用时执行到 yield 即停止

    def add(x, y, num):

        for v in range(1, num):

            t = (x + y) * v

            # yield 有return 的作用

            yield t

    m = add(1, 1, 5)

    # 是否“可迭代对象”

    print(isinstance(m, Iterable))

    # 是否是一个“迭代器”

    print(isinstance(m, Iterator))

    # 执行到第一次 yield 即停止

    print(next(m))

    # 从第二次 yield 开始执行直到结束

    for x in m:

        print(x)

输出:

====== 案例1 ==========

<class 'generator'>

0

1

4

9

16

====== 案例2 ==========

True

True

2

4

6

8

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Iterator迭代器和生成器
Python第六章-函数05-迭代器&生成器
Python核心编程的四大神兽:迭代器、生成器 、闭包以及装饰器
Python迭代和生成操作小结
【Python之路】特别篇
Python|认识可迭代对象与迭代器
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服