1. 程式人生 > >Python高階特性(切片 迭代 列表生成式 生成器 迭代器)學習筆記

Python高階特性(切片 迭代 列表生成式 生成器 迭代器)學習筆記

在Python中,程式碼不是越多越好,而是越少越好。程式碼不是越複雜越好,而是越簡單越好。
基於這一思想,Python中有非常有用的高階特性,1行程式碼能實現的功能,決不寫5行程式碼。請始終牢記,程式碼越少,開發效率越高。

切片

(Slice)

  1. 切片操作符在python中的原型是 [start:stop:step] ,即:[開始索引:結束索引:步長值] ->
    開始索引:預設從0開始。序列從左向右方向中,第一個值的索引為0,最後一個為-1

    結束索引:切片操作符將取到該索引為止,不包含該索引的值;

    步長值:預設是一個接著一個切取(值為1),如果為2,則表示進行隔一取一操作。步長值為正時表示從左向右取,如果為負,則表示從右向左取。步長值不能為0 。

Sequence[start:end:step] python的序列切片中,第一個:隔離了 起始索引 和 結束索引,第二個:隔離了 結束索引 和 步長
step為正,則從左到右切片,如果 start > end,則為空
step為負,則從右到左切片,如果 start < end,則為空
start 和 end 填空,前者表示最開始,後者表示最後一個, 同時為空的時候,表示取所有。至於方向,取決於 step
可以總結一句規律,step 為正表示從左到右切片,反之為右到左。
如:L[a:b:c] ->表示,從索引a開始每隔c個間隔取,直到索引b為止,但不包括索引b。

  1. 只寫[:]就可以原樣複製一個list。字串也可以用切片操作,Python沒有針對字串的擷取函式,只需要切片一個操作就可以完成。

迭代

可以通過for迴圈來遍歷,這種遍歷我們稱為迭代(Iteration)。任何可迭代物件都可以作用於for迴圈,包括我們自定義的資料型別,只要符合迭代條件,就可以使用for迴圈。

  1. 在Python中,迭代是通過for … in來完成的,而很多語言比如C或者Java,迭代list是通過下標完成的。

  2. enumerate函式 :Python內建的enumerate函式可以把一個list變成索引-元素對,這樣就可以在for迴圈中同時迭代索引和元素本身。

#enumerate把list表索引
for i,value in enumerate(['A','B','C']): print(i,value)

輸出:
0 A
1 B
2 C

列表生成式

列表生成式(range())即List Comprehensions,是Python內建的非常簡單卻強大的可以用來建立list的生成式。

  1. list() 方法用於將元組轉換為列表。
    注:元組(tuple)與列表(list)是非常類似的,區別在於元組的元素值不能修改,元組是放在括號中,列表是放於方括號中。

  2. 運用列表生成式,可以快速生成list,可以通過一個list推匯出另一個list,而程式碼卻十分簡潔。

  3. for迴圈其實可以同時使用兩個甚至多個變數,比如dict的items()可以同時迭代key和value。

執行表示式 for 變數(k,v) in 集合(range())
  1. isinstance() 函式來判斷一個物件是否是一個已知的型別,類似 type()。

isinstance() 與 type() 區別:
type() 不會認為子類是一種父類型別,不考慮繼承關係。
isinstance() 會認為子類是一種父類型別,考慮繼承關係。
如果要判斷兩個型別是否相同推薦使用 isinstance()。

isinstance() 函式用法:

isinstance([1,2,3], Iterable) # list是否可迭代

生成器

在Python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。

  1. 建立L和g的區別僅在於最外層的[]和(),L是一個list,而g是一個generator。定義generator的另一種方法。如果一個函式定義中包含yield關鍵字,那麼這個函式就不再是一個普通函式,而是一個generator。雖然執行流程仍按函式的流程執行,但每執行到一個 yield 語句就會中斷,並返回一個迭代值,下次執行時從 yield 的下一個語句繼續執行。

  2. generator儲存的是演算法,每次呼叫next(g),就計算出g的下一個元素的值,直到計算到最後一個元素,沒有更多的元素時,丟擲StopIteration的錯誤。

  3. generator和函式的執行流程不一樣。函式是順序執行,遇到return語句或者最後一行函式語句就返回。而變成generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。

  4. for迴圈呼叫generator時,發現拿不到generator的return語句的返回值。如果想要拿到返回值,必須捕獲StopIteration錯誤,返回值包含在StopIteration的value中。關於如何捕獲錯誤,檢視後面的錯誤處理。

  5. 對於函式改成的generator來說,遇到return語句或者執行到函式體最後一行語句,就是結束generator的指令,for迴圈隨之結束。
    注:請注意區分普通函式和generator函式,普通函式呼叫直接返回結果;generator函式的“呼叫”實際返回一個generator物件。

  #斐波拉契數列(Fibonacci),除第一個和第二個數外,任意一個數都可由前兩個數相加得    到:1, 1, 2, 3, 5, 8, 13, 21, 34, ...
  程式碼如下:
#使用生成器:generator
def fib(max):
    n,a,b = 0,0,1
    while n < max:
        yield (b)
        a,b = b,a+b #把a賦值給n會導致n的個數隨fib數增長
        n = n+1
        return 'done'
for n in fib(5): #迴圈迭代
    print(n)

獲取return的返回值’done’

while True:
    try:
        x = next(g)
        print('g:', x)
    except StopIteration as e:
        print('Generator return value:', e.value)
        break

迭代

可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器:Iterator。

  1. 可以直接作用於for迴圈的資料型別有以下幾種:
    一類是集合資料型別,如list、tuple、dict、set、str等;一類是generator,包括生成器和帶yield的generator function。

這些可以直接作用於for迴圈的物件統稱為可迭代物件:Iterable。可以使用isinstance()判斷一個物件是否是Iterable物件。

  1. iter()函式:生成器都是Iterator物件,但list、dict、str雖然是Iterable,卻不是Iterator。把list、dict、str等Iterable變成Iterator可以使用iter()函式.

16.Python的Iterator物件表示的是一個數據流,Iterator的計算是惰性的,只有在需要返回下一個資料時它才會計算。

總結
凡是可作用於for迴圈的物件都是Iterable型別;

凡是可作用於next()函式的物件都是Iterator型別,它們表示一個惰性計算的序列;

集合資料型別如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函式獲得一個Iterator物件。

學習網站: www.liaoxuefeng.com

相關推薦

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

在Python中,程式碼不是越多越好,而是越少越好。程式碼不是越複雜越好,而是越簡單越好。 基於這一思想,Python中有非常有用的高階特性,1行程式碼能實現的功能,決不寫5行程式碼。請始終牢記,程式碼越少,開發效率越高。 切片 (Slice) 切

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

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

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

廖雪峰老師的教程上學來的,地址:python高階特性  下面以幾個具體示例演示用法: 一、切片 1.1 利用切片實現trim def trim(s): while s[:1] == " " or s[-1:] == " ": # 若第1個元素或最後1個元素為空格 if

python高階特性1:切片

原文 取一個list或tuple的部分元素是非常常見的操作。比如,一個list如下: L = [‘Michael’, ‘Sarah’, ‘Tracy’, ‘Bob’, ‘Jack’] 取前3個元素,應該怎麼做?

Python高階特性2:Closures、Decorators和functools

裝飾器(Decorators) 裝飾器是這樣一種設計模式:如果一個類希望新增其他類的一些功能,而不希望通過繼承或是直接修改原始碼實現,那麼可以使用裝飾器模式。簡單來說Python中的裝飾器就是指某些函式或其他可呼叫物件,以函式或類作為可選輸入引數,然後返回函式或類

Python高階特性3: Classes和Metaclasses

類和物件 類和函式一樣都是Python中的物件。當一個類定義完成之後,Python將建立一個“類物件”並將其賦值給一個同名變數。類是type型別的物件(是不是有點拗口?)。 類物件是可呼叫的(callable,實現了 __call__方法),並且呼叫它能夠建立類

Python高階特性1:Iterators、Generators和itertools

【譯註】:作為一門動態指令碼語言,Python對程式設計初學者而言很友好,豐富的第三方庫能夠給使用者帶來很大的便利。而Python同時也能夠提供一些高階的特性方便使用者使用更為複雜的資料結構。本系列文章共有三篇,本文是系列的第一篇,將會介紹迭代器、生成器以及iter

Python列表生成生成器

三元表示式 列表生成式 我們現在有個需求,將列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]中每個數字都加1,你能想到幾種解決方案? NO1. 普通青年版 a = [1, 2, 3, 4, 5, 6,

【原創】collections庫 和 python生成 生成器

  其他--需要研究的資料 參考資料-- 內容太多,以後繼續學 https://www.cnblogs.com/wj-1314/p/8490822.html https://www.cnblogs.com/pengsixiong/p/5841923.html htt

Python【知識點】面試小點列表生成小坑

ada 調用 strong res 得到 bad 裝飾器 print eve 1、問題 有這麽一個小面試題: 看下面代碼請回答輸出的結果是什麽?為什麽? result = [lambda x: x + i for i in range(10)] print(re

列表生成,叠&生成器

函數 logs bsp fibonacci aec 生成式 more code 元素 一、列表生成式   用例--使列表數值都加上1 1 li = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 li_tmp = [i+1 for i in li] 3

python協程函數應用 列表生成 生成器表達

錯誤 擴展 存儲 ini 是否 釋放 lba func 斷點 協程函數應用 列表生成式 生成器表達式 一、知識點整理: 1、可叠代的:對象下有_iter_方法的都是可叠代的對象 叠代器:對象._iter_()得到的結果就是叠代器 叠代器的特性

STM32暫存學習筆記——實驗五:外部中斷

儲備知識: (1)STM32F103ZET6(CM3核心)共有256箇中斷,需要進行管理 首先,要對STM32進行分組,組0~4,同時要對每個中斷設定一個搶佔優先順序和響應優先順序 (搶佔優先順序:是指打斷其它中斷的級別,高的搶佔優先順序可以打斷低的搶佔優先順序的工作

Day 4 列表生成 生成器

今天主要做的就是楊輝三角的生成器 (generator),其中輸出每行list時利用了列表生成器。 楊輝三角的主要思想其實就是假設有兩個list ,L和M,其中M[i]=L[i-1]+L[i](這

C++繼承、多型,虛成員函式包括虛解構函式、虛複製建構函式學習筆記

通過哺乳類派生貓、狗等學習繼承、多型中的知識點 先貼上類的程式碼 #include<iostream> enum BREED { YORKIE, CAIRN, DANDIE, SHETLAND, DOBERAMN, LAB };//犬種 class Mam

09 Python 高階特性1切片列表生成

1 切片 對於取指定索引範圍的數,用迴圈麻煩,Python提供了切片(Slice)操作來簡化操作。 # 定義一個List >>> arr=['zhangsan','lisi','wanger'] >>> arr ['z

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

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

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

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

python2.7學習筆記6 ——高階特性切片列表生成生成器

切片 用於擷取list中的元素,比如L是一個list L[a : b] a 迭代 如果給定一個list或tuple,我們可以通過for迴圈來遍歷這個list或tuple,這種遍歷我們稱為迭代(Iteration)。 只要是可迭代物件,無論有無下

Python基礎8python中的特性進階篇列表生成生成器

python中還包括一些高階特性,以下簡單介紹。 迭代 定義:用for迴圈來遍歷物件的過程,叫做迭代。 作用物件:可迭代物件 如何判斷是否為可迭代物件:isinstance(xxx,Iterable),Iterable型別來源於collections模組。 應用場景: 1