<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】詳解Python列表推導(dǎo)式|迭代器|生成器|匿名函數(shù)

          共 3802字,需瀏覽 8分鐘

           ·

          2022-06-28 01:32

          詳解python3匿名函數(shù)、推導(dǎo)式、迭代器和生成器用法。

          1、匿名函數(shù)(lambda)

          個(gè)人理解為一種簡單的定義函數(shù)的方式,不需要使用def關(guān)鍵字定義函數(shù)。語法:lambda 參數(shù):操作參數(shù)表達(dá)式。

          add = lambda x, y: x + y
          print(add(35))

          8

          list(map(lambda x, y: x + y, range(-22), range(15)))
          #傳入兩個(gè)iterable對象range(-2, 2), range(1, 5)

          [-1, 1, 3, 5]


          2、推導(dǎo)式(comprehensions)

          列表,字典和集合中都可以使用推導(dǎo)式。

          列表推導(dǎo)式

          一種簡單創(chuàng)建列表的方法。

          #if 語句置于for之后
          In [29]: [x for x in range(111if x % 2 == 0]
          #對于range(1, 11)中每個(gè)元素,能被2整除的輸出組成新列表
          Out[29]: [246810]

          #if 語句置于for之前可以使用else
          In [30]: [x if x % 2 == 0 else -x for x in range(111)]
          #對于range(1, 11)中每個(gè)元素,能被2整除的輸出原值,不能整除的取原值負(fù)數(shù)輸出,組成新列表
          Out[30]: [-12-34-56-78-910]

          字典推導(dǎo)式

          mcase = {'a'10'b'34'A'7'Z'3}
          {k:v for k,v in mcase.items()}

          {'a': 10, 'b': 34, 'A': 7, 'Z': 3}

          集合推導(dǎo)式

          {x**2 for x in [112]}#集合不允許重復(fù)

          {1, 4}


          3、迭代器(Iterator)

          可迭代對象(Iterable)

          python中的對象,只要具有方法__iter__和__getitem__就是可迭代對象,可迭代對象能提供迭代器。

          迭代器(Iterator)

          被定義了__next__方法的python對象。

          判斷對象是否是可迭代對象或迭代器

          from collections.abc import Iterable, Iterator
          def g():
              yield 1
              yield 2
              yield 3
          #是否為python可迭代對象判斷
          print('Iterable? [1, 2, 3]:', isinstance([123], Iterable))#isinstance()判斷一個(gè)對象是否是Iterable對象
          print('Iterable? \'abc\':', isinstance('abc', Iterable))
          print('Iterable? 123:', isinstance(123, Iterable))
          print('Iterable? g():', isinstance(g(), Iterable))

          #是否為python迭代器判斷
          print('Iterator? [1, 2, 3]:', isinstance([123], Iterator))#isinstance()判斷一個(gè)對象是否是Iterator對象
          print('Iterator? iter([1, 2, 3]):', isinstance(iter([123]), Iterator))
          print('Iterator? \'abc\':', isinstance('abc', Iterator))
          print('Iterator? 123:', isinstance(123, Iterator))
          print('Iterator? g():', isinstance(g(), Iterator))
          Iterable? [1, 2, 3]: True
          Iterable? 'abc': True
          Iterable? 123: False
          Iterable? g(): True
          Iterator? [1, 2, 3]: False
          Iterator? iter([1, 2, 3]): True
          Iterator? 'abc': False
          Iterator? 123: False
          Iterator? g(): True 

          迭代(Iteration)

          使用一個(gè)循環(huán)來遍歷某個(gè)python對象時(shí),這個(gè)過程就叫迭代。


          4、生成器(Generators)

          生成器也是一種迭代器,但是,只能對其迭代一次。這是因?yàn)樗鼈儾]有把所有的值存在內(nèi)存中(可節(jié)省大量內(nèi)存),而是邊循環(huán)邊生成值(生成器保存算法,可以計(jì)算下一個(gè)元素的值),創(chuàng)建生成器方法如下:

          ( )包圍列表推導(dǎo)式生成

          g = (x * x for x in range(10))#只迭代一次,只存儲(chǔ)算法,不會(huì)生成所有元素存儲(chǔ)于內(nèi)存。
          g

          <generator object <genexpr> at 0x000002B53772C4C0>

          for i in g:#for循環(huán)打印每個(gè)生成器中元素,在執(zhí)行輸出nothing(只迭代一次,只存儲(chǔ)算法)
              print(i)

          0149162536496481

          自定義函數(shù)中添加yield關(guān)鍵字構(gòu)建生成器

          推算算法很復(fù)雜時(shí)使用自定義函數(shù)。舉個(gè)例子,計(jì)算斐波那契數(shù)列的生成器。

          def fibon(n):
              a = b = 1
              for i in range(n):
                  yield a#該函數(shù)為一個(gè)生成器
                  a, b = b, a + b
           for x in fibon(1000000):
              print(x) #不用擔(dān)心它會(huì)使用大量資源      


          參考資料

          https://www.liaoxuefeng.com/wiki/1016959663602400/1017318207388128
          Intermediate Python

          -END-

          往期精彩回顧




          瀏覽 50
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  看片亚洲 | 亚洲AV无码成人精品区欧洲 | 国产高清一级a片免费看古女 | 日本精品在线视频 | 伊人狠狠操 |