列表生成式/生成器/迭代器

列表生成式/生成器/迭代器

一.列表生成式

用来创建列表的表达式

示例:

import os
print([x for x in range(20) if x % 2 == 0])
print([d for d in os.listdir('.') if not d.startswith('.') and not d.startswith('__')])

# 字典
print([k + '=' + str(v) for k,v in {'a' : 1, 'b' : 2}.items()]) #items可以同时迭代key和value

 

{k:v for k,v in self.items() if not k.startswith('_')}

  

二.生成器

如果一个列表非常大,那么创建这个列表需要耗费较大的内存.生成器不会创建完整列表,只会在调用的时候计算出合适的值返回给调用方.

1.创建生成器有两种方式:

(1).将列表生成式的[]改为括号:

(x for x in range(20) if x % 2 == 0)

  

(2).一个函数定义中包含yield关键字:

def get():
    for x in range(10):
        yield x

  

2.使用生成器:

(1).通过调用next来获得值,但需要注意StopIteration异常(不常用)

a = get_generator()
print(next(a))

  

(2).通过迭代(常用):

for ge in get_generator():
    print(ge)

  

三.迭代器:

可以被next()函数调用并不断返回下一个值的对象称为迭代器

1.能被迭代的数据有两类

一类是集合数据类型,如list、tuple、dict、set、str等;
一类是generator,包括生成器和带yield的generator function。

2.能被迭代的对象称为:Iterable,可以用isinstance判断一个对象是否可以迭代

3.生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator,把list、dict、str等Iterable变成Iterator可以使用iter()函数

如:

from collections.abc import Iterator
str_a = 'hello world'
print(isinstance(str_a, Iterator))
print(isinstance(iter(str_a), Iterator))

  

输出:
False
True

4.总结:

凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,可以通过iter()函数获得一个Iterator对象。

 

转载于:https://www.cnblogs.com/itfenqing/p/10253439.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101182.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 【Unity3D】自学之路2.0

    【Unity3D】自学之路2.0一、前言原文主要讲的是如何从零基础入门,然后一步一步进阶的文章,包括很多学习资料,学习的网址,研究方向等,内容还是比较全面的。大家多多支持一些克森大神,关注一下他的公众号。这篇文章就将原文的内容进行总结合并,然后转载过来跟大家一起学习。二、原文原文地址:https://mp.weixin.qq.com/s/nAaGAzT7NIPH4v6YOzBCRg原文作者:克森原文出处:微…

    2022年6月1日
  • 西门子PLC_300F系列PLC_初始化MMC卡实验教程 S_L01[通俗易懂]

    西门子PLC_300F系列PLC_初始化MMC卡实验教程 S_L01[通俗易懂]西门子300F安全PLC忘记安全密码没有读卡器如何清空MMC卡西门子300FPLC安全密码操作前注意事项本次实验使用的硬件设备将新硬件进行组态和IP分配使用此硬件配合MMC进行操作西门子300FPLC安全密码300系列PLC在下载程序前必须设定一个安全密码,此密码会写在MMC卡里面,而且无法通过PLC拨码初始化,如果忘记密码可以通过使用西门子官方读卡器进行格式化,但是绝对不能插在普通读卡器或者带有读卡器的电脑上,这样操作会导致内存卡误格式化,损坏MMC卡。本实验将讲解如何在没有西门子官方读卡器的情

    2022年5月9日
  • 净推荐值(NPS):用户忠诚度测量的基本原理及方法

    净推荐值(NPS):用户忠诚度测量的基本原理及方法文章分享了一个衡量用户与产品或服务之间关系的指标:NPS,干货满满,希望对你有益。初识NPS作为互联网行业的用户体验从业者,我们都或多或少会接触一些衡量用户与产品或服务之间关系的指标,常见的指标如活跃度、留存率、用户满意度等。近几年,NPS(NetPromoterScore净推荐值)在国内流行起来,越来越多的行业及企业开始使用NPS指标作为衡量用户口碑的工具,如通信服务行业的中国移…

    2022年6月14日
  • 智能窗帘研究制作_智能窗帘的制作方法[通俗易懂]

    智能窗帘研究制作_智能窗帘的制作方法[通俗易懂]步骤1:所需组件:IntelGalileox1IntelGalileox1的电源线LDRx1220ohm电阻x18.2Kohm电阻器x1蓝牙模块(HC-05)x19V电池x19V电池适配器x1电动机驱动器x1迷你-面包板x1连接线(公对公))x40连接线(公对母)x40步骤2:将LDR和220ohm电阻与IntelGalileo接口LDRLDR扩展为光敏电阻。根据投射到LDR表面的光强度,它会改变…

    2022年6月23日
  • golang 2021激活码【2021.8最新】「建议收藏」

    (golang 2021激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月22日
  • springboot+dynamicDataSource动态添加切换数据源

    springboot+dynamicDataSource动态添加切换数据源

    2020年11月9日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号