欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中的迭代器和生成器詳解

 更新時間:2023年07月26日 10:06:22   作者:Looooking  
這篇文章主要介紹了Python中的迭代器和生成器詳解,生成器表達式是用來生成函數調用時序列參數的一種迭代器寫法,生成器對象可以遍歷或轉化為列表或元組等數據結構,但不能切片,需要的朋友可以參考下

可迭代對象(Iterable)

任何實現了 __iter__ 方法的對象都可以稱為可迭代對象。

class Fib:
    def __init__(self, n):
        self.prev = 0
        self.cur = 1
        self.n = n
    def __iter__(self):
        return self
fib = Fib(5)
import collections
print('fib is Iterable? ', isinstance(fib, collections.Iterable))
print('fib is Iterator? ', isinstance(fib, collections.Iterator))
print(next(fib))
fib is Iterable?  True
fib is Iterator?  False
Traceback (most recent call last):
  File "D:/MyProject/Python/insight-tools-rest/test.py", line 27, in <module>
    print(next(fib))
TypeError: 'Fib' object is not an iterator

迭代器(Iterator)

迭代器是用于進行迭代操作的對象,它可以像列表一樣使用 for 迭代獲取其中的每一個元素。當然,列表、字典屬于可迭代對象,但并不是迭代器。

要將列表、字典等常見的可迭代對象變成迭代器,需要使用 iter 或者 __iter__() 進行作用:

l = [1, 2, 3]
d = {'a': 1, 'b': 2, 'c': 3}
print(type(l))
print(type(d))
l = l.__iter__()
d = iter(d)
print(type(l))
print(type(d))
<class 'list'>
<class 'dict'>
<class 'list_iterator'>
<class 'dict_keyiterator'>

迭代器與列表的區(qū)別在于,列表是一次性把所有的元素加載到內存,迭代器則是使用延遲計算的方式返回元素,只有在調用 next 方法的時候才去計算并返回該元素,也即 call by need 的方式,for 循環(huán)本質上也是不斷調用迭代器的 next 方法來進行遍歷。

如果要將一個可迭代對象變成迭代器的話,還需要實現一個 __next__ 方法:

class Fib:
    def __init__(self, n):
        self.prev = 0
        self.cur = 1
        self.n = n
    def __iter__(self):
        return self
    def __next__(self):
        if self.n > 0:
            value = self.cur
            self.cur += self.prev
            self.prev = value
            self.n -= 1
            return value
        else:
            raise StopIteration()
fib = Fib(5)
import collections
print('fib is Iterable? ', isinstance(fib, collections.Iterable))
print('fib is Iterator? ', isinstance(fib, collections.Iterator))
print([i for i in fib])

fib is Iterable?  True
fib is Iterator?  True
[1, 1, 2, 3, 5]

生成器(Generator)

普通函數一般使用 return 返回一個值,但在 Python 中還有一種函數,用關鍵字 yield 來返回值,這種函數叫生成器。函數被調用時會返回一個生成器對象,生成器本質上還是一個迭代器(特殊的迭代器,實現方式不一樣),因此在迭代操作中,生成器對象的行為和迭代器非常相似。下面是使用生成器實現的斐波那契數列:

def fib(n):
    prev = 0
    cur = 1
    while n > 0:
        yield cur
        n -= 1
        prev, cur = cur, cur + prev
        # tmp = prev
        # prev = cur
        # cur = cur + tmp
print([i for i in fib(5)])

[1, 1, 2, 3, 5]

當然也可以使用 next 不斷去遍歷:

fib = fib(5)
print(next(fib))
print(next(fib))
print(next(fib))
print(next(fib))
print(next(fib))

1
1
2
3
5

到此這篇關于Python中的迭代器和生成器詳解的文章就介紹到這了,更多相關迭代器和生成器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論