一些別的

一些別的

切片

在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的計算是惰性的,只有在需要返回下一個數據時它纔會計算。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章