<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          弄懂這 5 個問題,拿下 Python 迭代器!

          共 1291字,需瀏覽 3分鐘

           ·

          2020-09-21 00:37

          我的施工之路

          1我的施工計劃

          2數(shù)字專題

          3字符串專題

          4列表專題

          5流程控制專題

          6編程風格專題

          7函數(shù)使用

          8面向?qū)ο缶幊?上篇)

          9面向?qū)ο缶幊?下篇)

          10十大數(shù)據(jù)結(jié)構(gòu)

          11包和模塊使用總結(jié)

          12Python正則專題總結(jié)

          13設計模式

          14Python時間模塊總結(jié)

          15?Python 裝飾器

          按照施工計劃,該到迭代器部分。

          本篇專題寫作思路,由幾個問題,逐步討論迭代器存在的價值、使用的方法、以及如何轉(zhuǎn)化為自身武器并真正用到日常Python中。

          第一個問題:什么是迭代器?

          迭代器,英文 Iterator,它首先是個對象,其次它是訪問可迭代序列(Iterable)的一種方式。通常其從序列的第一個元素開始訪問,直到所有的元素都被訪問才結(jié)束。

          迭代器又是一個特殊的對象,特殊在于它必須實現(xiàn)兩個方法:__iter____next__.

          第二個問題:為什么要有迭代器?

          迭代器存在的一個最重要價值:節(jié)省內(nèi)存,這在小數(shù)據(jù)量時無足輕重。

          但是,當數(shù)據(jù)量大或者對程序要求性能高時,它的價值凸顯。

          第三個問題:迭代器怎么節(jié)省內(nèi)存了?

          只知道使用迭代器能節(jié)省內(nèi)存,但卻不知道怎么使用才能節(jié)省內(nèi)存,下面就來回答這個問題。

          首先創(chuàng)建一個list:

          In?[1]:?a=[1,3,5,9,10]

          其次,列表內(nèi)每個元素+1,創(chuàng)建一個新列表

          In?[2]:?a1?=?[i+1?for?i?in?a]??

          依次打印a1中每個元素:

          In?[8]:?for?i?in?a1:?
          ???...:?????print(i)?

          上面操作等價于:

          a1?=?[]
          for?i?in?a:
          ??a1.append(i+1)
          for?i?in?a1:
          ??print(i)

          空間復雜度為 O(n),n為列表a內(nèi)元素個數(shù)。

          但是,使用迭代器實現(xiàn)上面的元素+1并打印的空間復雜度是多少呢?

          ait?=?(i+1?for?i?in?a)?#?得到生成器,也是一種特殊的迭代器
          for?i?in?ait:
          ??print(i)

          上面操作等價于:

          for?i?in?a:
          ??print(i+1)

          不需要額外空間,所以使用迭代器加1并打印的空間復雜度為O(1).

          結(jié)論:迭代器更加節(jié)省空間!

          第四個問題:如何自定義一個迭代器?

          上面說過,迭代器對象必須要實現(xiàn)兩個方法,為了更加具體,我們演示如何自定義一個迭代器。

          自定義一個迭代器,實現(xiàn)斐波那契數(shù)列:

          #斐波那契數(shù)列
          class?Fabs():
          ????def?__init__(self,max):
          ????????self.max=max
          ????????self.n,self.a,self.b=0,0,1
          ????
          ????#定義__iter__方法
          ????def?__iter__(self):
          ????????return?self
          ????????
          ????#定義__next__方法
          ????def?__next__(self):
          ????????if?self.n????????????tmp=self.b
          ????????????self.a,self.b=self.b,self.a+self.b
          ????????????self.n+=1
          ????????????return?tmp
          ????????raise?StopIteration

          使用這個迭代器,打印斐波那契數(shù)列前10項:

          In?[13]:?for?item?in?Fabs(10):?
          ????...:?????print(item,end='?')????????????????????????????????????????????????????????????????????
          1?1?2?3?5?8?13?21?34?55?

          第五個問題:迭代器使用有哪些注意事項?

          迭代器只能前進不能回退!

          也就是說一旦迭代結(jié)束,要想再使用此迭代器對象從頭開始遍歷元素,將是不可行的!

          In?[14]:?a=iter([1,4,5])?

          In?[16]:?next(a)????????????????????????????????????????????????????????????????
          Out[16]:?1

          In?[17]:?next(a)????????????????????????????????????????????????????????????????
          Out[17]:?4

          In?[18]:?next(a)????????????????????????????????????????????????????????????????
          Out[18]:?5

          #?要想再使用此迭代器對象從頭開始遍歷元素,將是不可行的!
          In?[19]:?next(a)???????????????????????????????????????????
          #?拋出異常:StopIteration:?

          使用內(nèi)置函數(shù)iter,可將Iterable序列轉(zhuǎn)化為迭代器。

          最后總結(jié):

          • 第一個問題:什么是迭代器?

          • 第二個問題:為什么要有迭代器?

          • 第三個問題:迭代器怎么節(jié)省內(nèi)存了?

          • 第四個問題:如何自定義一個迭代器?

          • 第五個問題:迭代器使用有哪些注意事項?

          • 這是我的第407篇原創(chuàng),歡迎點贊。




          歡迎關注我的視頻號

          我正在陸續(xù)打造100個

          Python視頻案例

          視頻+圖片+文字,學習效果最佳

          瀏覽 41
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一区中文字幕 | 手机A V在线 | 五月丁香福利视频 | 国产一在线 | v片网址|