這篇文章主要講解了“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ù)
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__方法。
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í)行后有命名空間且可以返回值的才是生成器。
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é)果。
next方法在面向?qū)ο缶幊虝r(shí)是最適合。注意next方法中if判斷邊界和raise StopIteration語句結(jié)束取值的結(jié)構(gòu)。
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í)行。
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)注!