溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python迭代、可迭代、迭代器的區(qū)別是什么

發(fā)布時間:2021-11-25 11:58:56 來源:億速云 閱讀:117 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“python迭代、可迭代、迭代器的區(qū)別是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“python迭代、可迭代、迭代器的區(qū)別是什么”吧!

生成器的種類

__next__方法

class Fib(object):
    # count表示生成斐波那契數(shù)列的個數(shù)
    def __init__(self, count):
        self.count = count
        # 保存前兩個值
        self.x = 0
        self.y = 1
        # 記錄生成數(shù)列的下標(biāo)
        self.index = 0

    # 聲明Fib類是可迭代的
    def __iter__(self):
        return self

    # 生成下一個數(shù)
    def __next__(self):
        if self.index < self.count:
            result = self.x
            self.x, self.y = self.y, self.x + self.y
            self.index += 1
            return result
        else:
            raise StopIteration


fib1 = Fib(5)
fib1 = Fib(5)
print(next(fib1))
print(next(fib1))
print(next(fib1))
print(next(fib1))
print(next(fib1))
# print(fib1.__next__())  # 功能和next()一致
# print(fib1.__next__())
# print(fib1.__next__())
# print(fib1.__next__())
# print(fib1.__next__())

out:
0
1
1
2
3

以上是斐波那契數(shù)列類的實現(xiàn)方法,生成器就是它的__next__方法。

yield語句

def febonacci(n):
    x, y, count = 0, 1, 0
    while n > count:
        yield x
        x, y = y, x + y
        count += 1

feb5=febonacci(5)
print(next(feb5))
print(next(feb5))
print(next(feb5))
print(next(feb5))
print(next(feb5))
print('__iter__' in dir(febonacci))
print('__next__' in dir(febonacci))
print('__iter__' in dir(feb5))
print('__next__' in dir(feb5))

out:
0
1
1
2
3
False
False
True
True

以上是斐波那契數(shù)列函數(shù)的yield實現(xiàn)方法,生成器就是python根據(jù)yield語句自動生成的__next__方法。

上一次說過的一個點再強調(diào)一次:方法和函數(shù)本身不是生成器,只有執(zhí)行后有命名空間且可以返回值的才是生成器。

yield from語句

def febonacci(n):
    x, y, count = 0, 1, 0
    result = []
    while n > count:
        result.append(x)
        x, y = y, x + y
        count += 1
    count = 0
    result_copy=result.copy()
    while n > count:
        yield from result
        count += 1
        yield from result_copy


feb5 = febonacci(5)
print(next(feb5))
print(next(feb5))
print(next(feb5))
print(next(feb5))
print(next(feb5))
print(next(feb5))
print(next(feb5))
print(next(feb5))
print(next(feb5))
print(next(feb5))

out:
0
1
1
2
3
0
1
1
2
3

以上是斐波那契數(shù)列函數(shù)的yield from實現(xiàn)方法,yield from是指從容器中取值返回。請認(rèn)真看代碼,重點注意2條yield語句執(zhí)行結(jié)果。

不同生成器的區(qū)別

  1. next方法在面向?qū)ο缶幊虝r是最適合。注意next方法中if判斷邊界和raise StopIteration語句結(jié)束取值的結(jié)構(gòu)。

  2. yield語句在函數(shù)式編程最適合。再次強調(diào)函數(shù)本身不是生成器,只有執(zhí)行后有命名空間且可以返回值的才是生成器。另外,yield通常是放在循環(huán)體內(nèi)使用,執(zhí)行到y(tǒng)ield語句時會返回值,此時函數(shù)體內(nèi)會生成一個斷點,再次執(zhí)行函數(shù)時從斷點下一條語句繼續(xù)執(zhí)行。

  3. yield from語句與yield的區(qū)別是取值方式不同,yield from取值是從容器中取,而yield取值是實時生成的。另外,在使用多條yield from語句時一定要謹(jǐn)記,返回值是一個容器取完再取另外一個容器,而不是輪流取。注意看上面的案例。

感謝各位的閱讀,以上就是“python迭代、可迭代、迭代器的區(qū)別是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對python迭代、可迭代、迭代器的區(qū)別是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI