1. 程式人生 > 遊戲 >前Volition社群經理Mike Watson去世 曾帶病製作補丁

前Volition社群經理Mike Watson去世 曾帶病製作補丁

迭代器

  • 迭代是訪問集合元素的一種方式;
  • 迭代器是一個可以記住遍歷位置的物件;
  • 迭代器物件從集合的第一個元素開始訪問,直到所有元素被訪問完結束;
  • 迭代器只能往前而不會往後;
  • 可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器:Iterator。

所以生成器就是一個迭代器(Iterator),那麼列表、字典等是不是迭代器呢?不是,它們是可迭代物件。

可迭代物件:

  • 生成器;
  • 字串、元組、列表、集合、字典。

如何判斷一個物件是可迭代的:

from typing import Iterable
res = isinstance('bigllxx', Iterable)
print(res)

如何判斷一個物件是迭代器:

from typing import Iterator
res = isinstance('bigllxx', Iterator)
print(res)

如何將可迭代物件變為迭代器:

list_1 = [1, 2, 3, 4, 5]
list_1 = iter(list_1)  # iter()系統函式,將可迭代物件轉為迭代器

生成器

受到機器記憶體限制,一個列表的記憶體有限,假如一個列表有10億條資料,但是我們每次呼叫時用的都是前幾條,那麼其他的記憶體空間都被浪費了,這時我們引入一個生成器,生成器的列表資料是按照某種規律實時生成的。


得到生成器的方式:

# 我們想要得到一個[0,3,6,9,12,...,30000]的列表
# 方式1:列表推導式
g = (i*3 for i in range(10 ** 4))  # 通過列表推導式,[]換成(),就是一個生成器(generator)
next(g)  # 也可g.__next()__,向下讀取一個生成器元素

# 方式2:函式 yield關鍵字
def gen():
    n = 0
    while n < 30:
        n += 1
        yield n  # 只要函式中存在yield,該函式就是一個生成器,返回值就是yield後的元素
    return '沒有更多元素'  # 當生成器元素用盡時,會把return的東西報錯出來 
g = gen()
next(g)

斐波那契數列

def fib(length):
    a, b = 0, 1
    n = 0
    while n < length:
        yield a  # yield 返回a並暫停
        a, b = b, a + b
        n += 1
    return '沒有更多元素'
g = fib(10)
print(next(g))

生成器與迭代器的關係:迭代器包含生成器,所以生成器肯定是迭代器,但是可迭代物件通過iter()函式也可轉為迭代器,所以迭代器不一定是生成器。