1. 程式人生 > 其它 >【Python】python的高階特性

【Python】python的高階特性

整理一波python高階特性,包括:切片、列表生成式、生成器、迭代器。具體教程參考廖雪峰的python教程

在Python中,程式碼不是越多越好,而是越少越好。程式碼不是越複雜越好,而是越簡單越好。請始終牢記,程式碼越少,開發效率越高。

切片

>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']

  • 切片,取前3個元素
    >>> L[0:3]
    說明:L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個元素。

  • 如果第一個索引是0,可以省略
    >>> L[:3]

  • 倒數切片
    >>> L[-2:]
    說明:從倒數第二個取,一直取到最後一個

  • 前10個數,每兩個取一個
    >>> L = list(range(100)) //建立一個0-99的list


    >>> L[:10:2]

  • 複製list
    >>> L[:]

  • tuple也可以用切片操作,只是操作的結果仍是tuple
    >>> (0, 1, 2, 3, 4, 5)[:3]

  • 字串也可以用切片操作,只是操作結果仍是字串
    >>> 'ABCDEFG'[:3]

列表生成式

  • 生成列表:[1x1, 2x2, 3x3, ..., 10x10]
    >>> [x * x for x in range(1, 11)]
    說明:把要生成的元素x*x放到前面,後面跟for迴圈,就可以把list創建出來
  • if ... else
    跟在for後面的if是一個篩選條件,不能帶else
    >>> [x for x in range(1, 11) if x % 2 == 0]

    for前面的部分是一個表示式,必須加上else。表示式:x if x % 2 == 0,它無法根據x計算出結果,因為缺少else
    >>> [x if x % 2 == 0 else -x for x in range(1, 11)]

生成器

定義:列表元素可以按照某種演算法推算出來,可以在迴圈的過程中不斷推算出後續的元素。在Python中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。

  • 建立生成器的方法
    >>> g = (x * x for x in range(10))
  • 通過next()函式獲得生成器的下一個返回值:
    >>> next(g)

    說明:生成器儲存的是演算法,每次呼叫next(g),就計算出g的下一個元素的值,直到計算到最後一個元素,沒有更多的元素時,丟擲StopIteration的錯誤。
  • 使用for迴圈也可獲取
>>> g = (x * x for x in range(10))
>>> for n in g:
...     print(n)

迭代器

  • 可迭代物件:可以直接作用於for迴圈的物件統稱為可迭代物件
    一類是集合資料型別,如list、tuple、dict、set、str等;
    一類是generator,包括生成器和帶yield的generator function。
  • isinstance()判斷一個物件是否是可迭代物件
>>> from collections.abc import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False
  • 迭代器:可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器
  • 使用isinstance()判斷一個物件是否是迭代器物件
>>> from collections.abc import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False

說明:生成器都是可迭代物件,但list、dict、str雖然是可迭代物件,卻不是迭代器。

可以這樣簡單理解,迭代器可以表示一個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。

  • 使用iter()函式,把可迭代物件變成迭代器
    >>> isinstance(iter([]), Iterator)

生成器和迭代器的總結

  • 凡是可作用於for迴圈的物件都是可迭代型別;

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

  • 集合資料型別如list、dict、str等是可迭代物件但不是迭代器,不過可以通過iter()函式變為迭代器。

  • 生成器是一種特殊的迭代器(注意這個邏輯關係反之不成立)。

  • 合理使用生成器,可以降低記憶體佔用、優化程式結構、提高程式速度。

  • 生成器在 Python 2 的版本上,是協程的一種重要實現方式;而 Python 3.5 引入 async await 語法糖後,生成器實現協程的方式就已經落後了。

  • 迭代器是一個有限集合,生成器則可以成為一個無限集。呼叫 next(),生成器根據運算會自動生成新的元素

  • 宣告一個迭代器, [i for i in range(10)]

  • 宣告一個生成器, (i for i in range(10))

  • 生成器並不會像迭代器一樣佔用大量記憶體,只有在被使用的時候才會呼叫。而且生成器在初始化的時候,並不需要執行一次生成操作,相比於迭代器節省了一次生成10個元素的過程,因此耗時明顯比迭代器短。

本文來自部落格園,作者:是小魚呀,轉載請註明原文連結:https://www.cnblogs.com/sophia12138/p/15949669.html