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

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

一.列表生成式

用来创建列表的表达式

示例:

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • CloseableHttpClient发送http请求

    Stringresponse=null;//客户端接口请求路径Stringurl=EspConfig.getClientBaseUrl()+ClientUtil.CLIENT_METHODNAME;//创建请求CloseableHttpClienthttpclient=HttpClientBuilder.create().build();HttpPostpos…

  • 2分钟规则

    怕什么真理无穷,进一步有近一步的欢喜每日语录:当你纠结要不要做一件事的时候,那就去做~开头聊几句1、又是一段时间没有输出内容了,有时候有点时间,自己懒不想动2、工作和生活,工作为了生活,…

  • SBC编码

    SBC编码SBC是一种低复杂度的编解码技术,压缩比率适中,支持16kHz,32kHz,44.1kHz和48kHz的采样率,也因此成为蓝牙高清语音的当然之选。对于16kHz的宽带语音而言,SBC能以64kbps数据速率对其进行4:1的压缩。但是,当SBC编码帧通过蓝牙传输时,它可能与底层蓝牙数据包不相匹配。因此,mSBC编解码技术被开发用于匹配SBC和蓝牙数据包,并于2011年5月被定义为Bluetoot

  • wing是什么_nativepage原理

    wing是什么_nativepage原理给定 n 本书,编号为 1∼n。在初始状态下,书是任意排列的。在每一次操作中,可以抽取其中连续的一段,再把这段插入到其他某个位置。我们的目标状态是把书按照 1∼n 的顺序依次排列。求最少需要多少次操作。输入格式第一行包含整数 T,表示共有 T 组测试数据。每组数据包含两行,第一行为整数 n,表示书的数量。第二行为 n 个整数,表示 1∼n 的一种任意排列。同行数之间用空格隔开。输出格式每组数据输出一个最少操作次数。如果最少操作次数大于或等于 5 次,则输出 5 or more。每个

  • javah的使用[通俗易懂]

    javah的使用[通俗易懂]原文链接:http://blog.csdn.net/zgyulongfei/article/details/74371761.无包名的类例如D:\MyTest目录下有一个Test.class文件。那么要生成.h文件,则在控制台下切换到D:\MyTest目录下,然后输入javah-jni Test之后即可在D:\MyTest下找到Test.h头文件

  • C# 正则表达式大全「建议收藏」

    C# 正则表达式大全「建议收藏」前言在网上看到一个不错的简易版正则匹配和替换的工具,现在补充进来,感觉还不错,效果如下(输入验证中文汉字的正则表达式)在线下载密码:5tpt注:好像也是一位园友写的,但是找不到地址了,有看到的

发表回复

您的电子邮箱地址不会被公开。

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