首页 > 编程问答 >Python Match Case:检查未知长度的可迭代内部的类型

Python Match Case:检查未知长度的可迭代内部的类型

时间:2024-07-24 11:33:04浏览次数:9  
标签:python structural-pattern-matching

我想使用匹配大小写检查一个未知长度的迭代(假设为 list )仅包含给定类型(假设为 float )(还有其他情况,只有这个给我带来了问题)。

case [*elems] if all([isinstance(elem, float) for elem in elems]):
    return num

这个似乎可行,但确实很不Pythony。看来应该有更简单的方法。

我尝试了 [float()] list[float()] list[float] [float(), *elems] 他们都没有成功。


在 Python 的匹配案例语句中,你无法直接检查类型是否匹配可变数量的参数。你的方法(使用守卫语句)已经是一种很好的方法了。

然而,我们可以通过将生成器表达式与 all 函数一起使用,使你的代码更 Pythonic 一点:

match iterable:
    case [*elems] if all(isinstance(elem, float) for elem in elems):
        return num

这种方式更简洁,并且仍然能准确地表达你的意图:如果 iterable 中的所有元素都是浮点数,则返回 num

以下是一些使用此代码的示例:

def check_floats(iterable):
    match iterable:
        case [*elems] if all(isinstance(elem, float) for elem in elems):
            return "所有元素都是浮点数"
        case _:
            return "并非所有元素都是浮点数"

print(check_floats([1.0, 2.5, 3.14]))   # 输出:所有元素都是浮点数
print(check_floats([1, 2, 3]))         # 输出:并非所有元素都是浮点数
print(check_floats([1.0, "2", 3.0]))    # 输出:并非所有元素都是浮点数

请记住,Python 的模式匹配仍然是一个相对较新的功能,它在处理可变长度序列和类型检查方面可能没有那么强大。在这种情况下,使用守卫语句仍然是完全有效且 Pythonic 的解决方案。

标签:python,structural-pattern-matching
From: 77249914

相关文章

  • Python实现excel数据的读取和写入
    1.安装说到前面的话,实现excel文件数据的读取和写入,在python中还有其它方法,比如说pandas。鉴于最近粉丝朋友问到上面的“xlrd”和“xlwt”,那么笔者下面将通过这两个方法,来实现excel文件数据的读取和写入。首先,我们先需要提前安装好对应的库。需要注意的是,xlrd从2.0版本开始,只......
  • python_进程与线程_多线程
    一、程序与进程的概念1、进程:指启动后的程序,系统会为进程分配内存空间二、创建进程的方式1、第一种创建进程的方式process(group=None,target,name,args,kwargs)group:表示分组,实际上不使用,默认为None即可target:表示子进程要执行的任务,支持函数名name:表示子进程的......
  • python_网络编程_socket
    一、网络编程的基本概念通信协议:internet协议,任何私有网络支持此协议,就可以接入互联网二、七层协议与四层协议从下到上分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层三、掌握TCP、IP协议ip协议是整个TCP、IP协议族的核心IP地址就是会联网上计算......
  • 你能对 Python 类型注释进行模式匹配吗?
    你能在Python类型上进行模式匹配吗?我见过简单的例子:importbuiltinsmatchx:casebuiltins.str:print("matchedstr")casebuildins.int:print("matchedint")但我想在嵌套类型上进行模式匹配,比如Annotated[Optional[Literal["a",......
  • python Polars:替换嵌套列表的元素
    有谁知道是否可以有效地替换极坐标中嵌套列表的元素。例如:s=pl.Series('s',[[1,2,3],[3,4,5]])#replace3with10toget[[1,2,10],[10,4,5]]我已经尝试过s.to_frame().with_columns(pl.when(pl.col('s')==3)...)但是pl.when不喜欢List[bo......
  • Python 中的常量应该大写吗?
    在PEP8中,一般规则是在UPPER_CASE字符中声明常量。在现实生活中,可能有多种情况:#!envpythonDATABASE_HOST='localhost'app=Flask('myapp')base_two=partial(int,base=2)通常我们将字符串类型或数字类型变量视为不可变的,因此是常量,而不是对象或函数。问题是......
  • 多重处理会导致 Python 崩溃,并给出一个错误:调用 fork() 时可能已在另一个线程中进行
    我对Python比较陌生,并试图为我的for循环实现一个多处理模块。我在img_urls中存储了一个图像url数组,我需要下载并应用一些Google视觉。if__name__=='__main__':img_urls=[ALL_MY_Image_URLS]runAll(img_urls)print("---%sseconds---"%(......
  • Python编程时输入操作数错误
    我正在用Python编写下面的代码来模拟控制系统。但是,当我调试代码时,我面临以下问题:matmul:输入操作数1没有足够的维度(有0,gufunc核心,签名为(n?,k),(k,m?)->(n?,m?)需要1)文件“D:\ÁreadeTrabalho\GitHub\TCC\CódigosMarcela\SistemaSISO_tres_estados_new.py”,......
  • Python入门知识点 7--散列类型与字符编码
    1、初识散列类型(无序序列)数据类型分为3种:   前面已经学过了两种类型   1.数值类型:int/float/bool只能存储单个数据      2.序列类型:str/list/tuple,有序的存储多个数据--有序类型,有下标,可以进行索引切片步长操作          3.散列类型......
  • Python入门知识点 6--序列类型的方法
    1、初识序列类型方法序列类型的概念:数据的集合,在序列类型里面可以存放任意的数据也可以对数据进行更方便的操作这个操作就是叫增删改查(crud)(增加(Creat),读取查询(Retrieve),更新(Update),删除(Delete)几个单词的首字母简写)增删改查是操作数据最底层的操作(从本质......