Python學習目錄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行代碼。請始終牢記,代碼越少,開發效率越高。編程
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沒有針對字符串的截取函數,只須要切片一個操做就能夠完成,很是簡單。網絡
from collections import Iterable
isinstance('abc', Iterable) # str是否可迭代
>>> True
複製代碼
for i, value in enumerate(['A', 'B', 'C']):
print(i, value)
>>>
0 A
1 B
2 C
複製代碼
list(range(1, 11))
L = []
for x in range(1, 11):
L.append(x * x)
複製代碼
[x * x for x in range(1, 11)]
複製代碼
generator保存的是算法,每次調用next(g),就計算出g的下一個元素的值,直到計算到最後一個元素,沒有更多的元素時,拋出StopIteration的錯誤; 一樣也可使用for循環遍歷app
g = (x * x for x in range(10))
for n in g:
print(n)
>>>
0
1
4
9
16
25
36
49
64
81
複製代碼
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)
複製代碼
這些能夠直接做用於for循環的對象統稱爲可迭代對象:Iterable。可使用isinstance()判斷一個對象是不是Iterable對象。 而生成器不但能夠做用於for循環,還能夠被next()函數不斷調用並返回下一個值,直到最後拋出StopIteration錯誤表示沒法繼續返回下一個值了。能夠被next()函數調用並不斷返回下一個值的對象稱爲迭代器:Iterator。可使用isinstance()判斷一個對象是不是Iterator對象。函數式編程
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是永遠不可能存儲全體天然數的。