一些別的
切片
在list和tuple 中可以截取其中的一部分。
切片的索引從0
開始,最後一位可以使用索引-1
表示
L[::2]
表示切片步長,從開始到結尾以2爲步長選取數據。
L[0:3]
表示選取前三個數,下面索引0 1 2
,即到3爲止前面的集合。
str也可以使用切片
迭代
如果給定一個list或tuple,可以通過for
循環來便利整個list或tuple,這種遍歷成爲迭代(Iteration)。
for ... in ...
用來完成迭代。
for迭代除了可以用在list或tuple上,還可以使用在其他可迭代對象上。比如dict,沒有下標也可以使用迭代。由於dict沒有下標沒有順序,所以迭代出來的數據順序可能與之前不同。默認情況下,dict迭代的是key。
如果需要迭代value則需要調用for value in dict.value()
。
如果需要同時迭代key和value,則需要調用for item in dict.item()
。
如何判斷一個對象是可迭代對象?
通過使用collections模塊的Iterable,進行判斷:
from collections import Iterable
isinstance('abc',Iterable)
如果要對list實現類似Java那樣的下標循環怎麼辦?Python內置的enumerate
函數可以把一個list變成索引-元素對,這樣就可以在for循環中同時迭代索引和元素本身:
>>> for i, value in enumerate(['A', 'B', 'C']):
... print(i, value)
...
0 A
1 B
2 C
列表生成器
list(range(1,11))
可以生成一個list。
把if
加入到列表生成器中:
L1 = ['Hello', 'World', 18, 'Apple', None]
L2 = [s.lower() for s in L1 if instance(s, str)]
L2 = ['hello', 'world', 'apple']
即使用if對列表生成器進行判斷。
生成器generator
由於列表容量是有限的,所以如果列表成員過多的話會浪費很大內存引起浪費。
生成器是用來生成一個可以推算出來的序列。
方法一:將列表的[]
改爲()
>>> L = [x * x for x in range(10)] #list
>>> L
[0,1,4,9,16,25,36,49,64,81]
>>> g = (x * x for x in range(10)) #generator
>>> g
<generator object <genexpr> at 0x1022ef630> #返回值爲一個生成器
可以使用next()
函數獲得generator的下一個元素。next(g)
依次獲取下一個值,直到計算到最後一個值,沒有元素時,跑出StopIteration
異常。
或者,使用for循環獲取各個值:
for n in g:
print(n)
方法二:將函數改爲生成器:
例如斐波那契數列,
def fib(max):
n,a,b = 0,0,1
while n < max:
print(b)
a, b = b, a+b #使用一行可以將ab重新賦值
n = n+1
return 'done'
上述函數只能將數列打印出來,而不能生成list。需要將print(bb)
改爲yield b
即得到一個生成器。
即,如果函數中包含了yield
關鍵字,那麼則是一個generator。
與函數執行的順序不同,generator在每次調用next()時,遇到yield語句返回,再次執行從上次放回的yield處進行。
例:楊輝三角
def triangle():
b = [1]
while True:
yield(b)
b = [1]+ [b[i]+b[i+1] for i in range(len(b)-1)] + [1]
注意不會執行for i in range(0)
。
迭代器Iterator
可以直接作用於for
循環的數據類型:1.list
tuple
dict
set
str
,集合數據類型。2. generator
生成器。
這些是可以直接用作for循環的對象成爲可迭代對象:Iterable
。可以使用isinstance()
判斷一個對象是否是可迭代對象。
>>>from collections import Iterable
>>>isinstance([], Iterable) # 判斷[]是否是Iterable
可以被next()
函數調用並不斷返回下一個值的對象成爲迭代器:Iterator
。
同樣可以使用isinstance()
判斷一個對象是否是迭代器。
生成器都是iterator對象但是list、dict、str雖然是Iterable但不是Iterator。
可以使用iter()
函數把list、dict、str等Iterable變成Iterator。
Python的
Iterator
對象表示的是一個數據流,Iterator
對象可以被next()
函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration
錯誤。可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()
函數實現按需計算下一個數據,所以Iterator
的計算是惰性的,只有在需要返回下一個數據時它纔會計算。