python3 小知識
本博客分為三部分,一是字典和函數結合,代替if-else判斷語句;二是數組的元素帶有括號;三是完整代碼。圖片略多。
1. 字典和函數結合,代替if-else判斷語句
??寫函數時經常會遇到一個函數的某個參數有多個值可供選擇的情況,并且每個可選值恰對應了一個子函數,這時需要用到if-else等判斷語句來進行判斷。其實也可以利用字典,字典的鍵為參數的可選值,字典的值為對應的子函數。舉個例子:
??這是一小段支持向量機的核函數選擇代碼,用的是if-else來選擇核函數,可選的核函數有三種:線性核函數、多項式核函數、高斯徑向基核函數。
import numpy as np
# if-else 寫法
def myfun_if(x,y,mode='linear'):
if mode=='linear':
return np.dot(x,y) # 線性核函數
elif mode=='polynomial':
return (1+np.dot(x,y))**2 # 多項式的階數定為2
elif mode=='radial':
return np.exp(-1*pow(x-y,2).sum()) # 高斯徑向基函數的gamma參數定為1
# 字典寫法
myfun_dict={'linear':lambda x,y:np.dot(x,y),
'polynomial':lambda x,y:(1+np.dot(x,y))**2,
'radial':np.exp(-1*pow(x-y,2).sum())}
結果對比:
myfun_if(x=np.array([1,2,3]),
y=np.array([-1,-2,-3]),
mode='polynomial')
myfun_dict['polynomial'](x=np.array([1,2,3]),
y=np.array([-1,-2,-3]))
2. 數組的元素帶有括號
??先看這樣一個數組heros
heros=np.array([('劉備',180,192,214),('關羽',249,180,192),('張飛',250,122,175)],
dtype=[('人物', 'U8'), ('武力', 'f'),('智力', 'f'),('速度','f')])
heros
數組里面的元素雖然帶括號,但不是元組,因為可以進行修改:
another=heros.copy()
another
another[0][0]='劉皇叔'
another
heros
但是依然可以拆包:
for num,hero in enumerate(heros):
print('序號=',num,' ',
'hero:',hero,sep='')
# print(type(hero))
name,attack,IQ,speed = hero #對hero進行拆包
print(name,'的綜合能力是',
np.mean([attack,IQ,speed]),'\n',sep='')
??也可以轉為數據框
import pandas as pd
DF=pd.DataFrame(heros)
DF
但是列舉(enumerate())的結果不同,結果是將數據框的每一列列舉出來:
list(enumerate(DF))
3. 完整代碼
# 1.字典和函數結合,代替if-else判斷語句
import numpy as np
def myfun_if(x,y,mode='linear'):
if mode=='linear':
return np.dot(x,y)
elif mode=='polynomial':
return (1+np.dot(x,y))**2 # 多項式的階數定為2
elif mode=='radial':
return np.exp(-1*pow(x-y,2).sum()) #高斯徑向基函數的gamma參數定為1
myfun_dict={'linear':lambda x,y:np.dot(x,y),
'polynomial':lambda x,y:(1+np.dot(x,y))**2,
'radial':np.exp(-1*pow(x-y,2).sum())}
myfun_if(x=np.array([1,2,3]),
y=np.array([-1,-2,-3]),
mode='polynomial')
myfun_dict['polynomial'](x=np.array([1,2,3]),
y=np.array([-1,-2,-3]))
# 2.數組的元素帶有括號
heros=np.array([('劉備',180,192,214),
('關羽',249,180,192),
('張飛',250,122,175)],
dtype=[('人物', 'U8'),
('武力', 'f'),
('智力', 'f'),
('速度','f')])
for num,hero in enumerate(heros):
print('序號=',num,' ',
'將領:',hero,sep='')
# print(type(hero))
name,attack,IQ,speed = hero
print(name,'的綜合能力是',
np.mean([attack,IQ,speed]),'\n',sep='')
DF=pd.DataFrame(heros)
list(enumerate(DF))
浙公網安備 33010602011771號