乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      python 循環(huán)高級用法 [expression for x in X [if condition] for y in Y [if condition] ... for n in N [if condition] ]按照從左至右的順序,分別是外層循環(huán)到內(nèi)層循環(huán)

       O聽_海_軒O 2022-01-12

      高級語法

      除了像上面介紹的 [x ** 2 for x in L] 這種基本語法之外,列表推導(dǎo)式還有一些高級的擴(kuò)展。

      4.1. 帶有if語句

      我們可以在 for 語句后面跟上一個 if 判斷語句,用于過濾掉那些不滿足條件的結(jié)果項。

      例如,我想去除列表中所有的偶數(shù)項,保留奇數(shù)項,可以這么寫:

      >>> L = [1, 2, 3, 4, 5, 6]
      >>> L = [x for x in L if x % 2 != 0]
      >>> L
      [1, 3, 5]
      

      4.2. 帶有for嵌套

      在復(fù)雜一點的列表推導(dǎo)式中,可以嵌套有多個 for 語句。按照從左至右的順序,分別是外層循環(huán)到內(nèi)層循環(huán)。

      例如:

      >>> [x + y for x in 'ab' for y in 'jk']
      ['aj', 'ak', 'bj', 'bk']
      

      4.3. 既有if語句又有for嵌套

      列表推導(dǎo)式可以帶任意數(shù)量的嵌套 for 循環(huán),并且每一個 for 循環(huán)后面都有可選的 if 語句。

      通用語法:

      [ expression for x in X [if condition]
                   for y in Y [if condition]
                   ...
                   for n in N [if condition] ]
      

      例如,下面的代碼輸出了0~4之間的偶數(shù)和奇數(shù)的組合。

      >>> [(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]
      [(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]
      

      等價于下面的一般 for 循環(huán):

      >>> L = []
      >>> for x in range(5):
      ...     if x % 2 == 0:
      ...         for y in range(5):
      ...             if y % 2 == 1:
      ...                 L.append((x, y))
      >>> L
      [(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]
      

      4.4. 列表推導(dǎo)式生成矩陣

      生成矩陣的方式有多種,例如手動賦值、一般for循環(huán),還有就是列表推導(dǎo)式。如果我們要用列表推導(dǎo)式生成下面的矩陣,可以怎么寫?

      >>> M = [[1, 2, 3],
      ... [4, 5, 6],
      ... [7, 8, 9]]
      

      一種方法是:

      >>> M = [[x, x+1, x+2] for x in [1, 4, 7]]
      >>> M
      [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
      

      矩陣的列數(shù)少時可以使用這種方法。

      如果矩陣的列數(shù)較多,我們可以使用另外一種方式:在循環(huán)變量的表達(dá)式中使用列表推導(dǎo)式。

      具體代碼如下:

      >>> M = [[y for y in range(x, x+3)] for x in [1, 4, 7]]
      >>> M
      [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
      

      與之前帶 for 嵌套的語法不同,這個例子中,實際使用的是最基本的 [expression for x in L] 語法,只有一個 for 語句。

      復(fù)雜的地方在于前面的變量表達(dá)式 expression 不再是簡單的變量運(yùn)算,而是一個列表推導(dǎo)式,在這個例子中就是 [y for y in range(x, x+3)] 。
      內(nèi)層的列表推導(dǎo)式返回一個行向量,而這些行向量經(jīng)由外層的列表推導(dǎo)式,最終形成一個二維列表,也就是我們想要的矩陣。

      當(dāng)然,在實際的應(yīng)用中不能單純追求代碼的簡潔,還要考慮到代碼的可讀性和維護(hù)成本。
      如果代碼變得過于復(fù)雜,不易于理解,我們寧可多寫幾行代碼來增加它的可讀性。

      5. 生成器表達(dá)式

      生成器表達(dá)式與列表推導(dǎo)式的語法相同,區(qū)別在于生成器表達(dá)式的外面使用圓括號,而列表推導(dǎo)式使用方括號。

      有關(guān)生成器的介紹,請參考這篇文章:《Python高級編程之初識生成器》

      6. 集合推導(dǎo)式和字典推導(dǎo)式

      注意:集合推導(dǎo)式和字典推導(dǎo)式只有在Python2.7以及之后的版本中才有,Python2.7之前的版本不支持這兩種推導(dǎo)式。

      集合推導(dǎo)式的語法與列表推導(dǎo)式相同,只需要把外面的方括號改成花括號即可。

      例如,我們可以通過以下方式來生成一個集合:

      >>> {x ** 2 for x in [1, 2, 2]}
      {1, 4}
      

      字典推導(dǎo)式的外面也是使用花括號,不過花括號的內(nèi)部需要包含鍵值兩部分。

      在值不重復(fù)的情況下,我們可以通過字典推導(dǎo)式快速交換鍵值對:

      >>> D = {'a':1, 'b':2, 'c':3}
      >>> D = {value: key for key, value in D.items()}
      >>> D
      {1: 'a', 2: 'b', 3: 'c'}
      

      from:http://www./article/2017/02/python-advanced-programming-list-comprehensions/

       

      lix = [];
      for x in range(1, 101):
          lix.push(x ** 2)
      執(zhí)行結(jié)果:lix = [1,4,9,16,25.....]
      
      在列表構(gòu)建器的表達(dá)式中,可以添加簡單的條件處理
      lix = [x * x for x in range(1, 101) if x % 2 == 0]
      執(zhí)行結(jié)果:lix = [4,16,36.....]
      

      也可以在循環(huán)過程中,來使用多層循環(huán)嵌套,實現(xiàn)更加復(fù)雜的效果

      lix = [x + y  for x in "abc" for y in "xyz"]
      執(zhí)行結(jié)果:['ax', 'ay', 'az', 'bx', 'by', 'bz', 'cx', 'cy', 'cz']
      

      列表動態(tài)構(gòu)建器

      但是我們通過前面的學(xué)習(xí)已經(jīng)知道,這些數(shù)據(jù)都是加載到內(nèi)存中的,如果列表中的數(shù)據(jù)量比較大的情況下,內(nèi)存消耗是比較嚴(yán)重的
      在某些情況下,我們只需要使用列表中的一部分?jǐn)?shù)據(jù),后面的數(shù)據(jù)并不是特別關(guān)心,如:通過列表來記錄一個符合某種規(guī)則的序列,每次我們只是關(guān)心下一個數(shù)據(jù),并不關(guān)心后面的N條數(shù)據(jù),應(yīng)該怎么做呢?比如我們需要一個奇數(shù)列表

      # 常規(guī)構(gòu)建器的做法
      lix = [2*x + 1 for x in range(1, 101)]
      # 執(zhí)行結(jié)果:[1,3,5,7,9,11,13,15,17.....]
      # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      # 常規(guī)構(gòu)建器可以直接構(gòu)建生成
      # 但是存在問題,如果一次構(gòu)建的數(shù)據(jù)量太大,會嚴(yán)重占用內(nèi)存
      # 我們在使用該列表的時候,有可能只是使用前10項
      # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      # 使用列表動態(tài)構(gòu)建器
      lix = (2 * x - 1 for x in range(1, 101))
      # 執(zhí)行結(jié)果:print (lix) --> <generator object <genexpr> at 0x7f232e462048>
      next(lix)
      # 執(zhí)行結(jié)果:1
      next(lix)
      # 執(zhí)行結(jié)果:3
      next(lix)
      # 執(zhí)行結(jié)果:5
      next(lix)
      # 執(zhí)行結(jié)果:7
      # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      # 列表動態(tài)構(gòu)建器
      # 和構(gòu)建器基本沒有區(qū)別,創(chuàng)建的時候列表中是沒有數(shù)據(jù)的
      # 必須通過next()函數(shù)來獲取列表中的下一條數(shù)據(jù)
      

      from:https://www.jianshu.com/p/fa3fda487f15

      []改成(),就創(chuàng)建了一個generator:

      >>> L = [x * x for x in range(10)]
      >>> L
      [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
      >>> g = (x * x for x in range(10))
      >>> g
      <generator object <genexpr> at 0x1022ef630>
      

      L和g的區(qū)別僅在于最外層的[]()L是一個list,而g是一個generator。

      如果要一個一個打印出來,可以通過next()函數(shù)獲得generator的下一個返回值:

      >>> next(g)
      0
      >>> next(g)
      1
      >>> next(g)
      4
      >>> next(g)
      9
      >>> next(g)

      next(g)實在是太變態(tài)了,正確的方法是使用for循環(huán),因為generator也是可迭代對象:

      >>> g = (x * x for x in range(10))>>> for n in g:...     print(n)... 0149要把fib函數(shù)變成generator,只需要把print(b)改為yield b就可以了:fibprint(b)yield b
      def fib(max):
          n, a, b = 0, 0, 1
          while n < max:
              yield b
              a, b = b, a + b
              n = n + 1
          return 'done'
      

      yield關(guān)鍵字,那么這個函數(shù)就不再是一個普通函數(shù),而是一個generator:

      >>> f = fib(6)
      >>> f
      <generator object fib at 0x104feaaa0>
      

      return語句或者最后一行函數(shù)語句就返回。而變成generator的函數(shù),在每次調(diào)用next()的時候執(zhí)行,遇到yield語句返回,再次執(zhí)行時從上次返回的yield語句處繼續(xù)執(zhí)行。

      # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多