python通过字典实现switch语句的函数选择效果

内容导读

  1. 理论基础
  2. 理论实践
  3. 相关资料

1.理论基础

1.1认识字典:

字典是python里的一种可变容器模型,且可存储任意类型对象,其他语言中可能会被称为“关联存储”或“关联数组”,最大的特点就是可以通过快速取出,先来看看它在python里长的什么样子

d = {'key1' : 'value1', 'key2' : 'value2' }

像形如上面这样'key' : 'value' 使用冒号 : 分割的两个值被称为键值对 : 前面的称为只能选取不可变的值(当然字符串以外也可以是整型),后面的称为可以是python支持的所有数据类型的值;每个键值对之间使用逗号 , 分割,而被{}所包裹的键值对就是字典(也可以理解为 键值对 的集合)字母d就是一个字典对象(后面要考)

1.2字典的使用方法:

我们这里就只讲一个get()方法(戳这里详细介绍),通过它我们可以使用安全的取出,当字典里没有我们要取的时该方法会返回一个None,而不会引发KeyError错误。具体语法如下。

# 取出字典d中键为'key1'的值并存入变量m中(如果没有键'key1'则会返回一个None给m)
m = d.get('key1')

# 取出字典d中键为'key3'的值并存入变量m中(如果没有键'key3'则会返回逗号,后面的值给m)
m = d.get('key3', '没有这个键哥们')

1.3函数方法与函数对象:

在python中使用def关键字来定义函数基本语法如下我就不多讲了(戳函数定义):

import math
def case1(x1:float, y1:float, x2:float, y2:float)->float:
    '''
    简单实现一下求两点之间的距离

    Args:
        x1(float):点1横坐标
        y1(float):点1纵坐标
        x2(float):点2横坐标
        y2(float):点2纵坐标
    Returns:
        float:两点间的距离
    '''
    print(f'函数case1,传入x1参数=={x1}==')
    print(f'函数case1,传入y1参数=={y1}==')
    print(f'函数case1,传入x2参数=={x2}==')
    print(f'函数case1,传入y2参数=={y2}==')

    return math.sqrt(((x1 - x2)**2 + (y1 - y2)**2))

# 调用函数
print(case1(x1=4, y1=5, x2=8, y2=2))

接下来我们引入方法与对象的基本概念,对于函数来说就是带不带()的关系,带()的是方法,不带的是对象(有没有觉得很水)。对于方法解释器只要碰到了就会去执行,并且方法只能将函数的运行结果赋值给变量,其函数本身是不能进行存储的,而对象却可以作为函数本身被存储(我个人感觉有点像c里面的指针)。来看下面示例。

我们使用变量temp来存储方法case1()temp2来存储对象case1,并输出它们的值和类型。

temp = case1(x1=4, y1=5, x2=8, y2=2)
print('temp的值和类型')
print('值:' + str(temp) + '<-->' + '类型:' + str(type(temp)))

temp2 = case1
print('temp2的值和类型')
print('值:' + str(temp2) + '<-->' + '类型:' + str(type(temp2)))

运行结果

temp的值和类型
值:5.0<-->类型:<class 'float'>
temp2的值和类型
值:<function case1 at 0x000002AE329804A0><-->类型:<class 'function'>

怎么样看出区别了吗(没有可是要吃栗子的哦),下面介绍一下怎么通过存储了对象temp2来调用函数,其实主要在temp2屁股后面加上()就行,来看示例。

temp2 = case1
print('temp2的值和类型')
print('值:' + str(temp2) + '<-->' + '类型:' + str(type(temp2)))

# 使用temp2来调用函数,记得将需要的参数加上
print(temp2(x1=4, y1=5, x2=8, y2=2))

运行结果

temp2的值和类型
值:<function case1 at 0x00000260758C04A0><-->类型:<class 'function'>
函数case1,传入x1参数==4==
函数case1,传入y1参数==5==
函数case1,传入x2参数==8==
函数case1,传入y2参数==2==
5.0

到这里我们就可以去构建复杂的映射关系了。

2.理论实践

'''
# Author: 荣鑫宇
# Update: 2024-08-28
# Content: 以字典驱动的函数映射(实现switch语句的功能)
# Version: 0.0.0
'''

def switch(item:str, string:str)->str:
    def case1():
        print(f'函数case1,传入参数=={string}==')
        return string + '返回参数'
    def case2():
        print(f'函数case2,传入参数=={string}==')
        return string + '返回参数'
    def case3():
        print(f'函数case3,传入参数=={string}==')
        return string + '返回参数'
    
    # 字典映射注意,这里就写case1,不要写成'case1'/case1()/'case1()'
    dic = {
        1:case1,
        2:case2,
        3:case3,
    }

    # 这里是简写
    # return dic.get(int(item), lambda: print(f'--无效的函数:{item}--'))()#不要忘记屁股后面的()啊

    # 使用字典.get()方法获取函数,如果不存在则返回默认函数
    case_func = dic.get(int(item))

    # 如果case_func不是None,调用它;否则执行默认行为
    if case_func:
        return case_func()  # 调用函数并返回结果
    else:
        print(f'不存在--{item}函数--')  # 默认行为
        return None  # 或者其他默认返回值


# 使用循环进行测试
while True:
    # switch(item=input('选则函数:'), string=input('需要传入的参数:'))
    print(switch(item=input('选则函数:'), string=input('需要传入的参数:')))

3.相关资料

Python 字典方法 (w3school.com.cn)

Python 字典 get() 方法 (w3school.com.cn)

5. 数据结构 — Python 3.11.8 文档

Python 字典(Dictionary) | 菜鸟教程 (runoob.com)

Python字典的使用技巧(万字详解) - 知乎 (zhihu.com)

内置异常 — Python 3.11.8 文档

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注