我想使用匹配大小写检查一个未知长度的迭代(假设为 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