您现在的位置是:首页 > 正文

python之生成器、迭代器

2024-04-01 02:23:36阅读 4

一、生成器

使用列表推导的前提是将所有数据都存入内存,若是数据特别大,则内存消耗会很大,使用生成器可以在循环遍历列表的时候动态生成下一个元素。

创建生成器的方法

  1. 将列表推导式中的中括号改为小括号,如下所示:
# -*- coding: UTF-8 -*-
tmp_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
data = [i for i in tmp_list if i % 2 == 0]
print("使用推导式获取偶数:", data)

data = (i for i in tmp_list if i % 2 == 0)
print("[]变为()得到生成器:", data)# 此处的data是一个生成器对象,可以使用next或_next_方法得到下一个元素,也可以使用for循环得到结果。

for i in data:
    print(i)
  1. 使用yeild关键字创建生成器,如下所示:
tmp_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def get_list():
    for i in tmp_list:
        if i % 2 == 0:
            print("当前元素是:", i)
            yield i # 每次执行到此处,都会退出get_list方法,然后执行print("当前获取到的值:", j),当本次循环结束时,又回到此处,接着完成自身的循环。(可以调试下,看执行顺序)
gen = get_list()# 得到一个生成器实例
for j in gen:
    print("当前获取到的值:", j)
    print()

上述执行结果为:
在这里插入图片描述
另外,生成器可以将方法内部的值传出来,也可以从外部将值传递给生成器。send与next都会触发生成器的执行,不同的是send是将参数送入生成器的内部,而next是从生成器中获取到值。如下所示:

def get_list():
    count = 0
    while True:
        print("------本次循环开始,count初始值为:", count)
        outer = yield count
        print("<---生成器从外部接收到的数据:", outer)
        count += 1
        print("------本次循环结束,count值为:", count)
        print()
gen = get_list()
val = next(gen)
print("--->外部调用next从生成器获取到的值:", val)
print()
val = gen.send(20)# 此处执行的时候,会返回到yeild退出的位置继续执行,即下一个执行语句是:get_list()内部的print("<---生成器从外部接收到的数据:", outer),然后继续执行到yeild位置,得出val的值。
print("--->外部从生成器获取到的值:", val)
gen.close()

其输出结果为:
在这里插入图片描述

二、迭代器

迭代器可以使对象像列表、字典那样迭代。列表使用索引计数遍历逐个元素,迭代器封装后的对象可以调用next方法来遍历,或者用for循环。能使用next函数获取到下一个值得对象都是迭代器,生成器也是迭代器的一种。使用iter函数可以将列表、字典转为迭代器,如下所示:

tmp_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
itor_list = iter(tmp_list)
print("使用next获取元素:", next(itor_list))
print("使用__next__获取元素:", itor_list.__next__())# 使用next或者_next_方法来获取下一个值的时候,如果数据已获取完,则会触发异常,最好的方法是使用for循环。
for i in itor_list:
    print("当前元素是:", i)
iter函数要求参数是可迭代对象,能使用for循环的都可以作为其参数。

参考:《python数据分析与大数据处理》

网站文章

  • php版canvas,HTML5 Canvas

    php版canvas,HTML5 Canvas

    canvas 元素用于在网页上绘制图形。什么是 Canvas?HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。 (推荐学习:html教程)画布是一个矩形区域,您可以控制...

    2024-04-01 02:23:28
  • 在Linux下交叉编译生成windows程序

    在Ubuntu环境下,利用mingw32,交叉编译windows程序,以便在windows下运行。

    2024-04-01 02:23:21
  • 【深度学习】ubuntu系统指定gcc版本并调整优先级

    【深度学习】ubuntu系统指定gcc版本并调整优先级

    sudo apt install build-essential gcc --version (查看gcc版本)可以看到我的gcc版本是4.8.5 安装最新版gcc9 sudo apt install...

    2024-04-01 02:23:14
  • java中什么是互斥,什么是Java中的互斥和信号量? 主要区别是什么?

    信号量可以被计数,而互斥量只能算到1。假设你有一个接受客户端连接的线程正在运行。 这个线程可以同时处理10个客户端。 然后每个新的客户端设置信号量,直到它达到10.当信号量有10个标志,那么你的线程将...

    2024-04-01 02:22:25
  • 华为p50鸿蒙os1020,鸿蒙OS+液态镜头+麒麟1020华为P50,华为P30即将悲惨让路价崩

    华为p50鸿蒙os1020,鸿蒙OS+液态镜头+麒麟1020华为P50,华为P30即将悲惨让路价崩

    原标题:鸿蒙OS+液态镜头+麒麟1020华为P50,华为P30即将悲惨让路价崩鸿蒙OS+液态镜头+麒麟1020华为P50,华为P30即将悲惨让路价崩据最新消息,华为P50系列有可能采用“液态镜头”,这...

    2024-04-01 02:22:17
  • 麒麟子Cocos Creator实用技巧一:如何正确地显示微信头像

    麒麟子Cocos Creator实用技巧一:如何正确地显示微信头像

    不管是游戏App,还是H5,又或者是微信小游戏。但凡接入了微信登录的应用,都可能需要显示微信头像。在Cocos Creator中,我们常见的显示方法像下面这样var headimg = 'http://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83erD6MOUwRKV9NyBAqnoFDTnltzAe2zWOkKxyDOFibVBb1ZV5CaATJw...

    2024-04-01 02:21:28
  • 分享各大OJ平台,干货满满

    以下是各大OJ平台,找到适合自己的才能达到事半功倍的效果,白嫖! 1.浙江大学 Online Judge(ZOJ) 链接:http://acm.zju.edu.cn 国内最早也是最有名气的OJ,有很多...

    2024-04-01 02:21:20
  • 08.音频系统:第004课_Android音频系统详解:第002节_以例子说明几个重要概念

    08.音频系统:第004课_Android音频系统详解:第002节_以例子说明几个重要概念

    该小节我们以几个例子,说明几个重要的概念:stream type, strategy, device, output, profile, module : policy,out flag 我们先画一个...

    2024-04-01 02:21:04
  • 病毒基础:文件加密(Windows文件与目录操作练习)

    病毒基础:文件加密(Windows文件与目录操作练习)

    我们知道有很多病毒都是对我们系统的文件做了一些手脚,我们上一篇文章学习了如何对Windows下的文件和目录操作,现在我们写一个小练习:遍历指定目录,循环加密文件内容:这边建议大家还是在虚拟机上做实验,万一一不小心就将系统文件给打乱了。

    2024-04-01 02:20:25
  • 使用git将代码上传码云并发布部署静态页面

    使用git将代码上传码云并发布部署静态页面

    git可以把我们本地的网站提交上传到远程仓库(码云)里面,类似咱们本地的ftp。6.把本地仓库的文件推送到远程仓库push。5.提交前先从远程仓库主分支中拉取请求。3.提交前先从远程仓库主分支中拉取请求。1.添加当前目录下的所有文件到暂存区。3.把本地文件放到本地仓库里面。2.把本地文件放到暂存区。4.把本地仓库代码提交。码云就是远程仓库,类似服务器。

    2024-04-01 02:20:17