Python學習之高級特性

Python學習目錄python

  1. 在Mac下使用Python3
  2. Python學習之數據類型
  3. Python學習之函數
  4. Python學習之高級特性
  5. Python學習之函數式編程
  6. Python學習之模塊
  7. Python學習之面向對象編程
  8. Python學習之面向對象高級編程
  9. Python學習之錯誤調試和測試
  10. Python學習之IO編程
  11. Python學習之進程和線程
  12. Python學習之正則
  13. Python學習之經常使用模塊
  14. Python學習之網絡編程

練習代碼git

掌握了Python的數據類型、語句和函數,基本上就能夠編寫出不少有用的程序了。好比構造一個1, 3, 5, 7, ..., 99的列表,能夠經過循環實現:github

L = []
n = 1
while n <= 99:
    L.append(n)
    n = n + 2
複製代碼

取list的前一半的元素,也能夠經過循環實現。算法

可是在Python中,代碼不是越多越好,而是越少越好。代碼不是越複雜越好,而是越簡單越好。基於這一思想,咱們來介紹Python中很是有用的高級特性,1行代碼能實現的功能,決不寫5行代碼。請始終牢記,代碼越少,開發效率越高。編程

切片(Slice)

L = list(range(100))
L[:10]

>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

(0, 1, 2, 3, 4, 5)[:3]

>>> (0, 1, 2)

'ABCDEFG'[:3]

>>> 'ABC'
複製代碼

在不少編程語言中,針對字符串提供了不少各類截取函數(例如,substring),其實目的就是對字符串切片。Python沒有針對字符串的截取函數,只須要切片一個操做就能夠完成,很是簡單。網絡

迭代

  1. 經過collections模塊的Iterable類型判斷對象是否爲可迭代對象
from collections import Iterable
isinstance('abc', Iterable) # str是否可迭代

>>> True
複製代碼
  1. Python內置的enumerate函數能夠把一個list變成索引-元素對,這樣就能夠在for循環中同時迭代索引和元素自己
for i, value in enumerate(['A', 'B', 'C']):
    print(i, value)

>>>
    0 A
    1 B
    2 C
複製代碼

列表生成

  1. list(range(1, 11))
  2. 生成[1x1, 2x2, 3x3, ..., 10x10]
L = []
for x in range(1, 11):
    L.append(x * x)
複製代碼
  1. 列表生成式(list comprehensions)能夠用一行語句代替循環生成上面的list
[x * x for x in range(1, 11)]
複製代碼

生成器(generator)

generator保存的是算法,每次調用next(g),就計算出g的下一個元素的值,直到計算到最後一個元素,沒有更多的元素時,拋出StopIteration的錯誤; 一樣也可使用for循環遍歷app

  1. 把一個列表生成式的[]改爲()
g = (x * x for x in range(10))
for n in g:
   print(n)

>>>
    0
    1
    4
    9
    16
    25
    36
    49
    64
    81
複製代碼
  1. 函數定義中包含yield關鍵字,那麼這個函數就再也不是一個普通函數,而是一個generator

generator和函數的執行流程不同。函數是順序執行,遇到return語句或者最後一行函數語句就返回。而變成generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。 把函數改爲generator後,咱們基本上歷來不會用next()來獲取下一個返回值,而是直接使用for循環來迭代編程語言

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'
f = fib(6)
複製代碼

迭代器

  1. 能夠直接做用於for循環的數據類型有如下幾種: 一類是集合數據類型,如list、tuple、dict、set、str等; 一類是generator,包括生成器和帶yield的generator function

這些能夠直接做用於for循環的對象統稱爲可迭代對象:Iterable。可使用isinstance()判斷一個對象是不是Iterable對象。 而生成器不但能夠做用於for循環,還能夠被next()函數不斷調用並返回下一個值,直到最後拋出StopIteration錯誤表示沒法繼續返回下一個值了。能夠被next()函數調用並不斷返回下一個值的對象稱爲迭代器:Iterator。可使用isinstance()判斷一個對象是不是Iterator對象。函數式編程

  1. 集合數據類型如list、dict、str等是Iterable但不是Iterator,不過能夠經過iter()函數得到一個Iterator對象。
  2. Python的for循環本質上就是經過不斷調用next()函數實現的。
for x in [1, 2, 3, 4, 5]:
    pass
複製代碼

徹底等同於:函數

# 首先得到Iterator對象:
it = iter([1, 2, 3, 4, 5])
# 循環:
while True:
    try:
        # 得到下一個值:
        x = next(it)
    except StopIteration:
        # 遇到StopIteration就退出循環
        break
複製代碼

小結:Python的Iterator對象表示的是一個數據流,這個數據流看作是一個有序序列,但咱們卻不能提早知道序列的長度,只能不斷經過next()函數實現按需計算下一個數據,因此Iterator的計算是惰性的,只有在須要返回下一個數據時它纔會計算。 Iterator甚至能夠表示一個無限大的數據流,例如全體天然數。而使用list是永遠不可能存儲全體天然數的。

下一篇:Python學習之函數式編程

相關文章
相關標籤/搜索