<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>

          Python迭代器還可以這樣玩

          共 1486字,需瀏覽 3分鐘

           ·

          2020-10-11 02:50

          ?

          ?
          十一這幾天基本在家周邊玩,萬象匯、格林公園、肖甸湖、師弟的婚宴,空了就看看極客時間,玩玩游戲,刷刷微信,就這么過去了,此外每周五天五公里的跑步,依然在堅持。
          最近發(fā)現(xiàn)了迭代器的一個妙招,忍不住分享給愛學習的你。
          關(guān)于可迭代對象,迭代器,生成器的定義和理解,可以參考前文Python基礎(chǔ)系列--可迭代對象、迭代器與生成器
          簡而言之,它們的關(guān)系可以使用下圖表示:
          知乎上看到這樣一個圖,更形象:
          下面我們來做一道算法題:
          給定字符串 s 和 t ,判斷 s 是否為 t 的子序列。
          你可以認為 s 和 t 中僅包含英文小寫字母。字符串 t 可能會很長(長度 ~= 500,000),而 s 是個短字符串(長度 <=100)。
          字符串的一個子序列是原始字符串刪除一些(也可以不刪除)字符而不改變剩余字符相對位置形成的新字符串。(例如,"ace"是"abcde"的一個子序列,而"aec"不是)。
          來源:力扣(LeetCode)
          鏈接:https://leetcode-cn.com/problems/is-subsequence
          要解決這個問題,常規(guī)算法是貪心算法,維護兩個指針 Ps,Pt 分別指向兩個字符串 s,t 的最開始,然后對字符串 t 一路掃過去,如果某個字符和 Ps 一樣,那么就把 Ps 指針前進一步,當 Ps 移出字符串 s 的最后一個字符的時候,返回 True,否則返回 False。
          不過,這個代碼寫下來怎么也得 10 行左右。
          如果使用迭代器和生成器,兩行就搞定了:
          >>>?def?is_subseq(s,t):
          ...?????t?=?iter(t)
          ...?????return?all(i?in?t?for?i?in?s)
          ...?
          >>>?is_subseq('ace','abcde')
          True
          >>>?is_subseq('aec','abcde')
          False
          >>>?
          如果你一眼就看穿代碼背后的邏輯,那說明已經(jīng)是資深的 Python 工程師了,如果是一頭霧水,那么我們把代碼展開一步一步看:
          首先,將原字符串變成一個迭代器:
          >>>?t?=?'abcde'
          >>>?iter(t)
          0x7fa7f22c8a60>
          >>>?t?=?iter(t)
          >>>?t
          0x7fa7f229d4c0>
          然后遍歷子字符串,依次判斷每個字符是否在上述的迭代器?t
          (i?in?t?for?i?in?s)
          一般的的思維定勢:i 必然在 t 中,因為字串 aec 的每個字符都存在于原字符串 abcde 中。
          妙就妙在在這個 in 操作,in 操作判斷一個字符是否在一個迭代器中,肯定是要遍歷這個迭代器的,而遍歷就是調(diào)用迭代器的 __next__ 方法,當存在時直接返回 True,而下一次判斷時繼續(xù)?__next__ 而并不回到起始位置重新查找。這一點,我們可以一步一步執(zhí)行 next 做實驗:以 s= 'aec' 和 t = 'abcdef' 為例:
          >>>?t?=?'abcdef'
          >>>?s?=?'aec'
          >>>?t?=?iter(t)
          >>>?'a'?in?t
          True
          >>>?next(t)
          'b'
          >>>?'e'?in?t
          True
          >>>?#此時指針已經(jīng)指向?e,再調(diào)用?next?回返回?f
          >>>?next(t)
          'f'?
          >>>?'c'?in?t?#指針已經(jīng)指向?f,f?后面不會出現(xiàn)字符?c,必然返回?false?
          False
          看到這里,相信你已經(jīng)明白了,in 操作返回 True 之后,下一次再 in 判斷時,是從上一次結(jié)束的位置開始查找,換句話說,在循環(huán)里面用 in 來判斷一個元素是否在一個迭代器中,迭代器會自動記憶上一次判斷后的位置,這相當于一個隱形指針,對于解決這道問題,提供了莫大的便利。
          最后的 all 函數(shù),用來判斷一個迭代器的元素是否全部為 True,如果是則返回 True,否則就返回 False。
          Python 就是這么神奇而優(yōu)雅。不過你一定注意,面試的時候盡量不要用這種技巧,因為你的面試官有可能并不知道生成器的用法,這個技術(shù)知識點上,在實際工作的應用上,你已經(jīng)比很多人更加熟練了。
          Python七號,做更滿意的七號,每周學習一個 Python 技巧,歡迎關(guān)注。
          (完)
          ?

          ?

          瀏覽 39
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  日韩欧美亚洲 | 超碰在线直播 | 粉嫩小泬BBBB欣赏 | 牛牛操逼| 亚洲免费福利视频 |