兩道面試題

fi = []
for i in range(3):
    def foo(x):print(x + i) #因爲函數在這時尚未執行,在這裏的i,指向的仍是同一個IP地址,因此都是2.
    fi.appent(foo)
for f in fi:
    f(2)
答案:4,4,4

 

a = [0, 1, 2, 3, 4] print(a[-6:6])    #[0, 1, 2, 3, 4] print(a[6:-6])    #[]

 

切片:咱們基本上都知道Python的序列對象都是能夠用索引號來引用的元素的,索引號能夠是正數由0開始從左向右,也能夠是負數由-1開始從右向左。python

一般一個切片操做要提供三個參數 [start_index:  stop_index:  step]  
start_index是切片的起始位置
stop_index是切片的結束位置(不包括),顧頭不顧尾。
step能夠不提供,默認值是1,步長值不能爲0,否則會報錯ValueError。

當 step 是正數時,以list[start_index]元素位置開始, step作爲步長到list[stop_index]元素位置(不包括)爲止,從左向右截取,
start_index和stop_index不管是正數仍是負數索引仍是混用均可以,可是要保證 list[stop_index]元素的【邏輯】位置
程序員

必須在list[start_index]元素的【邏輯】位置右邊,不然取不出元素。
ruby

當 step 是負數時,以list[start_index]元素位置開始, step作爲步長到list[stop_index]元素位置(不包括)爲止,從右向左截取,
start_index和stop_index不管是正數仍是負數索引仍是混用均可以,可是要保證 list[stop_index]元素的【邏輯】位置
必須在list[start_index]元素的【邏輯】位置左邊,不然取不出元素。
假設list的長度(元素個數)是length, start_index和stop_index在符合虛擬的邏輯位置關係時,
start_index和stop_index的絕對值是能夠大於length的。
例如上面那道題。
app

Python中切片操做的實現機制

(注:Python中先後雙下劃線名字的方法(函數)叫特殊方法,也有稱魔術方法的,這是從ruby那裏借用的。
一般特殊方法都是應當由解釋器去調用的,對程序員的接口一般是看起來更簡潔的方式,如常見的 len(list)
實質是解釋器調用list.__len__()方法。)


實際上在Python中對list引用元素和形式優雅簡潔的切片操做都是由解釋器調用的list.__getitem__(x)特殊方法。
>>> help(list.__getitem__)
Help on method_descriptor:


__getitem__(...)
    x.__getitem__(y) <==> x[y]


其中x能夠是個整數對象或切片對象。


alist[5] 和 alist.__getitem__(5) 是徹底等效的。
>>> alist[5]
5
>>> alist.__getitem__(5)
5
>>>


而切片操做是把切片對象做參數調用__getitem__(),
>>> help(slice)
Help on class slice in module builtins:


class slice(object)
 |  slice(stop)
 |  slice(start, stop[, step])
 |  
 |  Create a slice object.  This is used for extended slicing (e.g. a[0:10:2]).


見下面的例子。


>>> alist[1:7:2]
[1, 3, 5]
>>> slice_obj = slice(1,7,2)
>>> alist.__getitem__(slice_obj)
[1, 3, 5]
>>>


一些經常使用的切片操做

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


# 取前一部分
>>> alist[:5]
[0, 1, 2, 3, 4]


# 取後一部分
>>> alist[-5:]
[5, 6, 7, 8, 9]


# 取偶數位置元素
>>> alist[::2]
[0, 2, 4, 6, 8]


# 取奇數位置元素
>>> alist[1::2]
[1, 3, 5, 7, 9]


# 淺複製,等價於list.copy()更加面向對象的寫法
>>> blist = alist[:]
>>> blist
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


# 返回一個逆序列表,推薦reversed(list)的寫法,更直觀易懂。
>>> alist[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]


# 在某個位置插入多個元素
>>> alist[3:3] = ['a','b','c']
>>> alist
[0, 1, 2, 'a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9]


# 在開始位置以前插入多個元素
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[:0] = ['a','b','c']
>>> alist
['a', 'b', 'c', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


# 替換多個元素
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[0:3] = ['a','b','c']
>>> alist
['a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9]


# 刪除切片
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del alist[3:6]
>>> alist
[0, 1, 2, 6, 7, 8, 9]
函數

相關文章
相關標籤/搜索