1. 程式人生 > >Python(4)高階特性 總結

Python(4)高階特性 總結

 

Python中很多常見語法可以使程式更加簡潔易讀,這裡我們介紹5個例子:切片、迭代、列表生成器、生成器、迭代器

1.切片(slice)

切片用於取list tuple中部分元素,通過下標索引,只需標出想得到的第一個元素下標和最後一個元素

  • L[a:b] 從a開始取,到(b-1)為止,取(a-b)個元素
  • 若a=0,則可以省略L[:b]
  • 支援倒數切片。L[-a:-b],從倒數第a開始取,到倒輸(b+1)為止,取(a-b)個元素;                                                                                         L[-a:],    從倒數第a開始取,到最後一個元素為止,取a個元素
  • L[:]複製原list或tuple
  • 支援跳著取元素,例如前10個數,每兩個取一個:L[:10:2] ;所有數,每5個取一個:L[::5]
  • 字串可以看作是list,也支援切片
  • tuple不可變,切片後得到型別仍是tuple,但是是一個新的tuple,原tuple不變

2.迭代

迭代指通過for ... in遍歷整個list或tuple

  • 任何可迭代物件都可以作用於for迴圈
  • 可直接用for迴圈的有兩類:一類是集合資料型別,如listtupledictsetstr等;                                                                                                            一類是generator
    ,包括生成器和帶yield的generator function
  • dict的儲存不是按照list的方式順序排列,所以,迭代出的結果順序很可能不一樣。
  • 預設情況下,dict迭代的是key。                                                                                                                                              迭代value  : for value in d.values()                                                                                                                                             同時迭代key和value : for k,v in d.items()
  • list可以通過enumerate函式變成索引-函式對                                                                                                                              for i, value in enumerate(['A', 'B', 'C'])
  • 可以用collections模組的Iterable型別判斷是否為可迭代物件                                                                                                       from collections import Iterable                                                                                                                                               isinstance('abc' , Iterable)
  • for 迴圈可以同時引用兩個變數

 

3.列表生成器

  • list( range(1,11) )
  • [x*x for x in range (1,11)]
  • [x*x for x in range (1,11) if x%2 ==0]
  • [m+n for m in 'abc' for n in '123']

 

4.生成器(generator)

列表裡的元素事先並不知道,需要通過迴圈不斷推算出後一個元素

  • 與列表生成式相同用法,只需要把[]改成()即可,就從list變成generator
  • 生成器計算到最後一個元素,沒有更多元素時丟擲StopIneration錯誤
  • 一般用for迴圈得到後面元素,但是演算法複雜時也可以通過函式實現
  1. 函式定義中含有yield關鍵字即為generator  
  2. generator函式遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行,即,generator函式一般在for迴圈中呼叫
  3. 如果想得到generator函式的返回值,,必須捕獲StopIteration錯誤,返回值包含在StopIterationvalue

5.迭代器(Iterator)

Iterator物件可以被next()函式呼叫並不斷返回下一個資料,直到沒有資料時丟擲StopIteration錯誤。可以把這個資料流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函式實現按需計算下一個資料,

  • 可以直接作用於for迴圈的物件統稱為可迭代物件Iterable。可以使用isinstance()判斷一個物件是否是Iterable物件
  • 可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器Iterator。可以使用isinstance()判斷一個物件是否是Iterator物件
  • 生成器都是Iterator物件,但listdictstr雖然是Iterable,卻不是Iterator
  • listdictstrIterable變成Iterator可以使用iter()函式