Python學習筆記(三)
高級特性
1.切片
顧名思義,就是對集合進行切取,類似java中的subString()
方法的功能。在Python中能進行切片操作的有List,tuple,字符串。在其他語言中需要寫循環語句來遍歷達到截取的目的,在Python中很簡單。
L = list(range(100))
print(L[0:10])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
L[0:10]
表示從從索引0
開始取,直到索引10
爲止,但不包括索引10
。
如果第一個索引是0
,還可以省略:
L = list(range(100))
print(L[:10])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
它同樣支持倒數切片,例如:
L = list(range(100))
print(L[-5:])
[95, 96, 97, 98, 99]
L[-5:]
表示重倒數第5個開始打印,一直到L末尾元素。
前10個數,每兩個取一個:
L = list(range(100))
print(L[:10:2])
[0, 2, 4, 6, 8]
L[:10:2]
表示沒隔兩個取一個。
複製一個list可以用[:]
來處理。
tuple也是一種list,唯一區別是tuple不可變。因此,tuple也可以用切片操作,只是操作的結果仍是tuple:
t = (1,2,3)
print(t[0:3])
(1, 2, 3)
字符串’xxx’也可以看成是一種list,每個元素就是一個字符。因此,字符串也可以用切片操作,只是操作結果仍是字符串:
str = 'ABCDEFG'
print(str[0:3])
ABC
2.迭代
在Python中只要是可迭代對象,無論有無下標,都可以迭代,判斷一個對象是否是可迭代對象
from collections import Iterable
print(isinstance('abc',Iterable))
True
在java中迭代通過for
循環來完成,但是在Python中通過for...in
來完成:
迭代list:
L= [1,2,3]
for i in L:
print(i)
1
2
3
迭代dict:
d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
print(key)
a
c
b
默認情況下,dict迭代的是key
。如果要迭代value
,可以用for value in d.values()
d = {'a': 1, 'b': 2, 'c': 3}
for value in d.values():
print(value)
2
3
1
迭代字符串:
for ch in 'ABC':
print(ch)
A
B
C
如果我們想得到索引index和對應的value,可以通過Python內置函數enumerate
來把一個list變成索引-元素對,這樣就可以用for
來獲同事迭代索引和元素本身。
L = ['A','B','C']
for ch in enumerate(L):
print(ch)
(0, 'A')
(1, 'B')
(2, 'C')
打印結果是一個一個的tuple,說明是enumerate
將list變成一個裝有tuple的list。
L = ['A','B','C']
for index,value in enumerate(L):
print(index,value)
0 A
1 B
2 C
在for
循環中還可以引入兩個變量。
zip()
函數可以把兩個 list 變成一個 list:
L1= [1,2,3,4]
L2 = ['android','java','kotlin','Rxjava']
for x in zip(L1,L2):
print(x)
(1, 'android')
(2, 'java')
(3, 'kotlin')
(4, 'Rxjava')
3.列表生成器
列表生成式即List Comprehensions,是Python內置的非常簡單卻強大的可以用來創建list的生成式。
創建一個[1*1,2*2,3*3...,10*10]
的集合:
L = [x * x for x in range(1,11)]
print(L)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for 循環後面還可以添加判斷條件:
L2 = [x * x for x in range(1,11) if x %2 == 0]
print(L2)
[4, 16, 36, 64, 100]
還可以使用兩層循環,可以生成全排列:
L3 = [m + n for m in 'ABC' for n in 'XYZ']
print(L3)
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
列表生成式也可以使用兩個變量來生成list:
d = {'x': 'A', 'y': 'B', 'z': 'C' }
print([k+':'+v for k,v in d.items()])
['y:B', 'z:C', 'x:A']
items()
函數的作用是將dict裏面的key-value轉變成tuple裝進一個list裏面
d = {'x': 'A', 'y': 'B' , 'z': 'C' }
print(d.items())
dict_items([('z', 'C'), ('y', 'B'), ('x', 'A')])
把一個list中所有的字符串變成小寫:
L = ['Hello', 'World', 'IBM', 'Apple']
print([s.lower() for s in L])
print([s.upper() for s in L])
['hello', 'world', 'ibm', 'apple']
['HELLO', 'WORLD', 'IBM', 'APPLE']
lower()
函數的作用是將字符串變成小寫,upper()
函數的作用是將字符串變成大寫。
3.生成器
在Python中,這種一邊循環一邊計算的機制,稱爲生成器:generator。
L = [s * s for s in range(1,11)]
print(L)
G = (s * s for s in range(1,11))
print(G)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
<generator object <genexpr> at 0x002C05A0>
創建L
和G
的最大的區別就是[]
和()
的區別,L
是一個list,G
是一個generator。
獲取generator裏面的每一個元素,可以利用next()
函數,類似於指針作用,指向哪個元素就可以打印出哪個元素。也可以通過for
循環來打印:
G = (s * s for s in range(1,11))
for s in G:
print(s)
1
4
9
16
25
36
49
64
81
100
如果一個函數定義中包含yield
關鍵字,那麼這個函數就不再是一個普通函數,而是一個generator.
參考資料:廖雪峯的官方網址