Python中迭代器和生成器的區別與聯繫

1.迭代器

迭代器是一個能夠記住遍歷的位置的對象。
迭代器對象從集合的第一個元素開始訪問,直到全部的元素被訪問完結束。迭代器只能往前不會後退。
迭代器有兩個基本的方法:iter() 和 next()。
使用時首先判斷是不是能夠迭代,用isinstance()方法判斷或者能夠for循環的遍歷的對象是可迭代對象,能夠被next()函數調用,並不斷返回下一個值得對象。python

判斷是否能夠迭代算法

from collections import Iterable

str = 'abc'
if isinstance(str,Iterable):
    print('true')
arr = [1,2,3]
if isinstance(arr,Iterable):
    print('true')
tup = (1,'q',4)
if isinstance(tup,Iterable):
    print('true')
dict = {'a':'1'}
if isinstance(dict,Iterable):
    print('true')
a = 123
if isinstance(a,Iterable):
    print('true')
else:
    print('false')

輸出結果:bash

true
true
true
true
false
arr = [3,12,22,33]
if isinstance (arr,(str,tuple,list)):
    print('true')
else:
    print('error')
it = iter(arr)
for i in it:
    print(i,end=" ")

結果:app

true
3 12 22 33

字符串,列表或元組對象均可用於建立迭代器:函數

list = [3,12,22,33]
it = iter(list)   #建立一個迭代器對象
print(next(it))   #輸出迭代器的下一個對象
print(next(it))

輸出結果:ui

3
12

使用常規for語句進行遍歷:lua

list = [3,12,22,33]
it = iter(list)
for i in it:
    print(i,end=" ")

輸出結果:spa

3 12 22 33

2.生成器

生成器自動建立了_iter_()和_next_()內置方法僅僅保存了一套生成數值的算法,調用時,纔去計算而後返回一個值。生成器必定是迭代器,而迭代器不必定是生成器,一邊循環一邊計算的機制稱爲生成器,含有yield語句的函數,能夠減小內存空間。code

在 Python 中,使用了 yield 的函數被稱爲生成器(generator)。
跟普通函數不一樣的是,生成器是一個返回迭代器的函數,只能用於迭代操做,更簡單點理解生成器就是一個迭代器。
在調用生成器運行的過程當中,每次遇到 yield 時函數會暫停並保存當前全部的運行信息,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續運行。
調用一個生成器函數,返回的是一個迭代器對象。對象

#!/usr/bin/python3

import sys

def fibonacci(n): # 生成器函數 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一個迭代器,由生成器返回生成

while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()

輸出結果:

0 1 1 2 3 5 8 13 21 34 55
相關文章
相關標籤/搜索