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))

posted on 2021-01-14 12:08  纵横二剑  阅读(132)  评论(0编辑  收藏  举报