一.列表生成式
用来创建列表的表达式
示例:
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账号...