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

一.列表生成式

用来建立列表的表达式函数

示例:对象

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('_')}

  

二.生成器

若是一个列表很是大,那么建立这个列表须要耗费较大的内存.生成器不会建立完整列表,只会在调用的时候计算出合适的值返回给调用方.blog

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。get

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

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

如:generator

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

  

输出:
False
Trueit


4.总结:

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

相关文章
相关标签/搜索