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

一.列表生成式

用來建立列表的表達式函數

示例:對象

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

相關文章
相關標籤/搜索