1. 程式人生 > >python切片、迭代、生成器、列表生成式等高階特性學習

python切片、迭代、生成器、列表生成式等高階特性學習

python高階特性

1行程式碼能實現的功能,決不寫5行程式碼。請始終牢記,程式碼越少,開發效率越高。

  • 切片
    當我們要取一個list中的前n各元素時,如果前n個少的話,我們還可以一個一個的取,但是若前n個元素極其多的話,我們就要採取其他辦法:

    L = [];
    n = 1;
    while n <= 99:
        L.append(n);
        n = n + 2;
    
    print(L);
    
    #取前三個元素
    r = [];
    a = 3;
    for i in range(a):
        r.append(L[i]);
    
    print(r);
    

    對這種經常指定索引範圍的操作,用迴圈會十分繁瑣,所以python提供了切片(slice)操作符,取前三個元素一行程式碼就可以完成:

    #一行程式碼完成取前三個元素
    print(L[0:3]);
    

    表示從0開始取,直到3結束,不包括索引3。類似的。L[-1],就指倒數第一個元素

  • 迭代
    如果給定一個list或tuple,我們可以通過for迴圈來遍歷這個list或tuple,這種遍歷我們稱為迭代。

    #迭代dict(相當於map)
    d = {"a": 1, "b": 2, "c": 3};
    for key in d:
        print(key);
        #a b c
    #迭代value
    for value in d.values():
        print(value);
        #1 2 3
    

    注意:如果要對list實現類似於Java那樣的下標迴圈,我們可以使用python內建的enumerate函式實現索引-元素對。

    #用enumerate函式實現list變成索引-元素對
    for i, value in enumerate(["a", "b", "c"]):
        print(i, value);
        # 0 a
        # 1 b
        # 2 c;
    
  • 列表生成式
    即list comprehensions,是用來建立list的生成式,生成1~10d的list可以用list(range[1, 11])

    #用列表生成式建立list
    print(list(range(1, 11)));
    

    生成[1*1,2*2, 3*3, … ,10*10]

    L1 = [];
    for x in range(1, 11):
        L1.append(x*x);
    print(L1);
    #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    #使用列表生成式
    print([x*x for x in range(1, 11)]);
    

    for迴圈後面還可以加上if判斷語句:

    L2 = [x * x for x in range(1, 11) if x % 2 == 0];
    print(L2);#[4, 16, 36, 64, 100]
    

    等等這樣的生成操作,可以根據自己的情況來進行生成。

  • 生成器
    是一種一邊迴圈一遍計算的機制(也是一個函式):generator (我沒記錯的話,es6中也有這個生成器,但是功能還有有區別)
    建立一個generator,方式:

    1. 將列表生成器的[ ]改成( ),就建立了一個generator:

      #用()建立一個generator
      L3 = (x*x for x in range(10))
      print(L3);
      #<generator object <genexpr> at 0x00000276D57E8A40>
      

      可以通過next()來一個個列印generator的返回值,也可以用迴圈:

      L3 = (x*x for x in range(10));
      for i in L3:
          print(i);
      
    2. 帶yield的generator function
      斐波拉契數列列印:

      #普通函式編寫的費比拉數列
      def fib(max):
          n, a, b = 0, 0, 1;
          while n < max:
              print(b);
              a, b = b, a + b;
              n = n + 1;
          return 'done';
      print(fib(6));
      # 1
      # 1
      # 2
      # 3
      # 5
      # 8
      # done
      #用generator函式只需要把print(b)變成yield b即可
      
      def fib1(max):
          n, a, b = 0, 0, 1
          while n < max:
              yield b
              a, b = b, a + b
              n = n + 1
          return 'done'
      print(fib1(6));
      #<generator object fib at 0x104feaaa0>
      

      generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。在執行過程中,遇到yield就中斷,下次又繼續執行

    3. 楊輝三角

      #楊輝三角
      def triangles():
             N = [1]
             while True:
                 yield N
                 N.append(0)
                 N = [N[i]+N[i-1] for i in range(len(N))]
      
      n1 = 0
      results = []
      for t in triangles():
          print(t)
          results.append(t)
          n1 = n1 + 1
          if n1 == 10:
              break
      
    4. 總結
      generator是非常強大的工具,在Python中,可以簡單地把列表生成式改成generator,也可以通過函式實現複雜邏輯的generator。
      要理解generator的工作原理,它是在for迴圈的過程中不斷計算出下一個元素,並在適當的條件結束for迴圈。對於函式改成的generator來說,遇到return語句或者執行到函式體最後一行語句,就是結束generator的指令,for迴圈隨之結束。
      區分普通函式和generator函式,普通函式呼叫直接返回結果,generator函式的“呼叫”實際返回一個generator物件
  • 迭代器
    可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器:Iterator(很像es6的Iterator介面)
    凡是可作用於for迴圈的物件都是Iterable型別;
    凡是可作用於next()函式的物件都是Iterator型別,它們表示一個惰性計算的序列;
    集合資料型別如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函式獲得一個Iterator物件。

  • 總結
    以上都是python非常強大的特性,他們靈活的運用在python處理list、tuple等資料組上,自己學習的很淺,還是需要進行不斷地練習及接觸更多的關於python的demo。

相關推薦

python切片生成器列表生成高階特性學習

python高階特性 1行程式碼能實現的功能,決不寫5行程式碼。請始終牢記,程式碼越少,開發效率越高。 切片 當我們要取一個list中的前n各元素時,如果前n個少的話,我們還可以一個一個的取,但

Python(七)語法 高階特性 切片 | (迴圈)| 列表生成 | 生成器 |

切片 取一個list或tuple的部分元素是非常常見的操作 有一個list[0,1,2,3,4,5]如果我們要取前n個元素比如說3個數 一般做法是 >>> L=[] >>> n=3 >>> for i in range(n): .

《OpenCV3程式設計入門》——5.1.5 訪問影象中畫素的三類方法(指標訪問器iterator動態地址計算配合at元素)

目錄 1、指標訪問畫素 2、迭代器操作畫素 3、動態地址計算 OpenCV中,有三種方式訪問影象畫素:  指標訪問:C操作符[]; 迭代器iterator 動態地址計算 上述方法在訪問速度上略有差異。debug模式下,

java設計模式之——策略模式模板方法模式觀察者模式子模式責任鏈模式命令模式備忘錄模式狀態模式訪問者模式中介者模式直譯器模式(行為型)【讀書筆記】

一、策略模式           定義:定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到演算法的客戶。           使用場景:策略模式是一種定義一系列演算法的方法,從概念上看,所有的這些演算法完成的都是相同的工作,只是實現不

如何正確遍歷刪除List中的元素(普通for迴圈增強for迴圈器iteratorremoveIf+方法引用)

遍歷刪除List中符合條件的元素主要有以下幾種方法: 普通for迴圈 增強for迴圈 foreach 迭代器iterator removeIf 和 方法引用 (一行程式碼搞定) 其中使用普通for迴圈容易造成遺漏元素的問題,增強for迴圈foreach會報java.util.Concurre

關於python yield 和 生成器的使用

python的迭代器 就是重複的做很多事情,可以使用for 迴圈 將裡面的元素迴圈遍歷出來。 迭代器的優點: 使用迭代器不要求事先準備好整個迭代過程中的所有元素,僅僅是在迭代的時候才會展示出來, 建立迭代器: a = [1,2,3,4,5,6,7] b

Python生成器列表生成

生成器: 在Python中, 這種一邊迴圈一邊計算的機制, 稱為生成器:generator 列表生成式:L(list) = [x * x for x in range(10)] 生成器:    g(generator) = (x * x for x in range(10)

python器&生成器使用技巧(2):切片遍歷索引值多序列多容器物件

1. 迭代器切片 迭代器和生成器不能使用標準的切片操作,因為它們的長度事先並不知道(並且也沒有實現索引)。 函式 islice() 返回一個可以生成指定元素的迭代器,通過遍歷並丟棄直到切片開始索引位置的所有元素,然後開始一個個的返回元素,並直到切片結束索引位置。 impo

Python學習筆記--3高階特性-切片列表生成生成器

廖老師在這個地方提到了,在Python 中,並不是寫的程式碼越多越好,而是寫的程式碼越少越好,月簡單越好。 1、切片  什麼是切片,簡單來說就是對list或者tuple中的部分元素進行取出操作。例子如下: 應注意的是,python的首位的元素的編號是0,所以,要確定好[

Python切片列表生成生成器

切片: 在Python中對於具有序列結構的資料來說都可以使用切片操作,比如列表(list)中,我們可以用切片取出其中一部分元素。 需要注意的是序列物件某個索引位置返回的是一個元素,而切片操作返回是和被切片物件相同型別物件的副本 如: >>> alis

python生成器__call__閉包簡單說明

1.生成器 這種一邊迴圈一邊計算的機制,稱為生成器:generator,最簡單的方法是把生成式的[]改為(). >>> l=(x * x for x in range(1, 11) if x % 2 == 0) >>> l <generator obje

python 基礎系列--可物件器與生成器

迭代器是 Python 最強大的功能之一,可以想像如果有個幾十 GB 的大檔案,你需要編寫程式處理其中的文字資訊,如果一次性全部讀入記憶體,估計機器會直接罷工了,但是借住可迭代物件,可以一次從硬碟讀取一小塊內容到記憶體,處理完後寫回硬碟,不斷迭代,從而節省記憶體,加快處理速度。 首先來解

python-生成器閉包裝飾器

一、生成器 1、什麼是生成器 在Python中,這種一邊迴圈一邊計算的機制,稱為生成器(generator) 2、建立生成器方法 方法1:只要把一個列表生成式的[ ]改為() In [1]: L = [ x*2 for x in range(5)] In [2]: L Out[

Python練習-生成器器-2018.12.01

如果列表元素可以按照某種演算法推算出來,可以在迴圈的過程中不斷推算出後續的元素。這樣就不必建立完整的list,從而節省大量的空間。在Python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。 #將列表生成式的[]改為()得到generator,通過for迴圈得到generator的下

3PythonPython 3入門(流程控制/器/生成器/函式/變數作用域)

一、流程控制 1、if 控制 if 表示式1: 語句 if 表示式2: 語句 elif 表示式3: 語句 else: 語句 elif 表示式4: 語句 else: 語句     1、

python3自學筆記4-切片列表生成生成器

目錄切片迭代列表生成式生成器迭代器 切片 1、Python提供了切片(Slice)操作符:; 2、list可以進行切片操作: # 生成列表 >>> L = list(range(100)) >>> L [0, 1, 2, 3,

完全理解Python物件生成器

本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺寫的這篇文章是按照自己的理解做的參考翻譯,算不上是原文的中譯版本,推薦閱讀原文,謝謝網友指正。 在瞭解Python的資料結構時,容器(container)、可迭代物件(ite

python學習筆記】33:生成器高階函式

生成器 生成器(generator)相比列表推導式,只佔用很小的空間,因為它是一邊迴圈一邊推算,通過next()呼叫下一元素,並在結束時丟擲StopIteration異常,在語法上只要把[]換成()即可

Python切片列表生成

切片 L=list(range(5)) 取相應範圍內的元素:L[m:n]表示從索引m開始取,直到索引n為止,但不包括索引n,如果第一個索引是0,還可以省略: L[0:3]/L[:3]——[1,2,3] 還支援倒數切片: L[-2:]——[4,5] L[-2:-

Python中的容器(container)器(iterator)和生成器(generator:yield)

1、容器迭代器iterator  以list容器(tuple,range,file類似)為例,list容器可以呼叫自己的__iter__()方法獲取用來迭代自己內部元素的迭代器。例如: # list容器 myList = [1, 2, 3] # 獲取list容器的迭代器 it