2. 星號式子 (一) : 用於串列物件
在等號左側 : 合併(打包)元素為串列
25 串列(二)
等號左側僅能有一個星號式子
函式參數設定 運算結果 說明
( a , *b ) = (1,2,3,4) a = 1 , b = [2,3,4] 小括號可省略
*a , b , c = [1,2,3,4] a = [1,2]
b = 3 , c = 4
*a , b = 1 錯誤 右式不是常串列,缺逗號
a , *b = 1 , a = 1 , b = []
*a , b = 1 , a = [] , b = 1
*a = 1 , 2 , 3 錯誤 左式不是常串列,缺逗號
*a , = 1 , 2 , 3 a = [1,2,3]
*a , = () a = []
3. 星號式子 (二)
在等號右側 : 拆解串列成元素
35 串列(二)
函式參考設定 運算結果 說明
x = [4,5]
( a , b , c ) = ( 3 , *x )
a = 3
b = 4 , c = 5
小括號可省略
x = [1,2]
a , b = *x ,
a = 1
b = 2
末尾逗號不可省略
x = [1,2]
a , b , c = *x ,
錯誤 等號左側多一個變數
x = [1,2,3] , y = [4]
a , b , c , d = *x , *y
a = 1 , b = 2
c = 3 , d = 4
等號右側可有多個
星號用來拆解串列
7. enumerate 列舉函式 (二)
印出串列的次序與其值
如果使用傳統方式,需另設整數:
75 串列(二)
# 型式一:
for n , val in enumerate( [”rat”,”ox”,”tiger”,”rabbit”] ) :
print( n+1 , ’:’ , val )
# 型式二: p 為兩個元素的常串列
for p in enumerate( ["rat","ox","tiger","rabbit"] ) :
print( p[0]+1 , ’:’ , p[1] )
輸出:
1 : rat
2 : ox
3 : tiger
4 : rabbit
n = 0
for val in [”rat”,”ox”,”tiger”,”rabbit”] :
print( n+1 , ’:’ , val )
n += 1
8. zip 拉鏈函式 (一)
zip 拉鏈函式:在多個一維串列與一個多維串列之間互換
將多個一維串列合成一個多維串列
使用 list 將 zip 函式的輸出轉型為串列
85 串列(二)
>>> a = list( zip( ["cat","dog","bird"] , [20,55,38] ) )
>>> a
[(’cat’, 20), (’dog’, 55), (’bird’, 38)]
9. 英文組句
由分量組成座標點
95 串列(二)
zip 拉鏈函式 (二)
subjects = [ "John" , "Tom" , "Mary" ]
verbs = [ "likes" , "has" , "plays with" ]
objects = [ "cat" , "dog" , "parrot" ]
for s , v , o in zip( subjects , verbs , objects ) :
print( s , v , o )
輸出:
John likes cat
Tom has dog
Mary plays with parrot
>>> xs , ys , zs = [1,2,3] , [4,5,6] , [7,8,9]
>>> pts = list( zip( xs , ys , zs ) )
>>> pts
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
17. sort 與 sorted 排序函式 (五)
找出數字排列順序
175 串列(二)
>>> a = [12,76,3,25]
>>> b = sorted(a)
# c 為 a 序列數字由小到大的順序編號
>>> c = [ b.index(x)+1 for x in a ]
>>> c
[2, 4, 1, 3]
# d 為 a 序列數字由大到小的順序編號
>>> b = sorted(a,reverse=True)
>>> d = [ b.index(x)+1 for x in a ]
>>> d
[3, 1, 4, 2]
18. map 映射函數 (一)
map( fn , a ):逐一取出 a 串列元素送到 fn 函式執行,
fn 函式名稱後不需小括號
map( lambda x : ... , a ):逐一取出 a 串列元素當成
lambda 函式參數 x
map 執行後的結果可與迴圈結合使用
list( map(..,a) ):將 map 執行後的結果轉為串列,且此串列
與 a 串列等長
185 串列(二)
若有 n 個串列,lambda 函式要有 n 個參數
19. map 映射函數 (二)
操作範例:
求得最長字串長度
將整數字串轉為整數數字:使用 list 將 map 結果轉為串列
印出個位數:map 輸出與迴圈結合
195 串列(二)
>>> for x in map( lambda a : a%10 , [ 13, 46 ] ) : print(x)
3
6
>>> for x in [ a%10 for a in [ 13, 46 ] ] : print(x)
len 函式名稱後不加小括號成為 len()
>>> max( map( len , [ "cat", "tiger" , "lion" ] ) )
5
>>> foo = list( map( int , [ ”100” , ”200” , ”300” ] ) )
>>> foo
[100, 200, 300]
若不使用 list 轉型,則 foo 為 map 物件,無法當成串列使用
也可使用 list comprehension 得到與 map 同等效果
20. map 映射函數 (三)
整數字串的平方和
兩串列內積:lamdba 需要兩個參數才能處理兩個串列
205 串列(二)
>>> sum( map( lambda x : int(x)**2 , [ ”1” , ”2” , ”3” ] ) )
14
>>> sum( [ int(x)**2 for x in [ "1" , "2" , "3" ] ] )
14
>>> a , b = [1, 2, 3] , [3, 7, 4]
>>> sum( map( lambda x , y : x*y , a , b ) )
29
# 使用 zip 將多個串列打包
>>> sum( map( lambda p : p[0]*p[1] , zip( a , b ) ) )
29
>>> sum( [ p[0]*p[1] for p in zip( a , b ) ] )
29
21. map 映射函數 (四)
印出字元複製次數
215 串列(二)
>>> s = [ "a", "b", "c" ]
>>> n = [ 5, 7, 2 ]
>>> for z in map( lambda x , y : x*y , s , n ) : print( z )
aaaaa
bbbbbbb
cc
以上等同:
>>> for z in [ x*y for x , y in zip( s , n ) ] : print( z )
49. subplots (四)
495 串列(二)
# 上圖:散佈圖
for i in range(len(xs)) :
while True :
c = [ random.random() for x in range(3) ]
if sum(c) < 1.5 : break
cs += [ c ]
for j in range(ys[i]) :
gs[0].scatter(xs[i]+0.4,j+1,marker=random.choice(mstr),
color=c,s=200)
# 顯示數字
gs[0].text(xs[i]+0.35,ys[i]+0.6,str(ys[i]),fontsize=15,
color=c)
# 下圖:兩條細直條
ys1 = [ max( 1 , y - random.randint(1,3) ) for y in ys ]
ys2 = [ y + random.randint(1,3) for y in ys ]
for i in range(len(xs)) :
gs[1].bar(xs[i],ys1[i],color=cs[i]+[0.5],width=0.3) # 左側直條線
gs[1].bar(xs[i]+0.4,ys2[i],color=cs[i],width=0.3) # 右側直條線
50. subplots (五)
505 串列(二)
# 設定上圖圖示
gs[0].set_ylabel(”quantity”) # 設定 x 軸文字
gs[0].set_title(”current animal quantity”) # 設定圖形標頭
# 設定上圖的 Y 軸刻度範圍
yloc = list(range(max(ys2)+1))
pylab.setp( gs[0] , xticks=[] , yticks=yloc )
# 設定下圖圖示
gs[1].set_ylabel(”quantity”) # 設定 y 軸文字
gs[1].grid(axis=’y’) # 顯示格線
gs[1].set_title(”max and min animal quantity”) # 設定圖形標頭
# 設定下圖的 X 軸刻度對應字串
xloc = [ x + 0.3 for x in range(1,7) ]
pylab.setp( gs[1] , xticks=xloc , xticklabels=animals )
pylab.show()
有關 subplots 更詳細的用法,請參考 matplotlib 網站