真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

成都創(chuàng)新互聯(lián)專注于崇陽企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,成都商城網(wǎng)站開發(fā)。崇陽網(wǎng)站建設(shè)公司,為崇陽等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

生成器的種類

__next__方法

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

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

    # 生成下一個(gè)數(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ù)列類的實(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實(shí)現(xiàn)方法,生成器就是python根據(jù)yield語句自動(dòng)生成的__next__方法。

上一次說過的一個(gè)點(diǎn)再強(qiáng)調(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實(shí)現(xiàn)方法,yield from是指從容器中取值返回。請(qǐng)認(rèn)真看代碼,重點(diǎn)注意2條yield語句執(zhí)行結(jié)果。

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

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

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

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

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


網(wǎng)站題目:python迭代、可迭代、迭代器的區(qū)別是什么
文章位置:http://weahome.cn/article/gpjsgi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部