如何用单行代码实现Python函数多参数的数字类型校验?
Python 参数类型判断的单行实现方案
原始函数
用户编写的初始函数如下:
def punch_your_three_brothers_in_order_of_age(a, b, c): list = [a, b, c] if type(a) == str: return "Please use numbers for each brother's age." elif type(b) == str: return "Please use numbers for each brother's age." elif type(c) == str: return "Please use numbers for each brother's age." else: list.sort(reverse=True) A = list return "Start with the " + str(A[0]) + " year old, then continue with your " + str(A[1]) + " year old brother."
需求与问题
需求是:当参数a、b、c任意一个不为数字类型(int或float)时,返回提示语"Please use numbers for each brother's age.",并希望将这部分判断逻辑用单行代码实现。
用户尝试的代码无法正常运行:
if type(a, b, c) != int or float: print("Please use numbers for each brother's age.")
错误原因:
type()函数仅能接收单个参数,type(a, b, c)写法不符合语法;!= int or float的逻辑解析错误,实际会被识别为(type(x) != int) or float,而float作为布尔值始终为True,导致判断完全失效。
正确实现方式
可以用any()结合生成器表达式,搭配isinstance()函数实现单行判断:
方案一:判断存在非数字类型
if any(not isinstance(x, (int, float)) for x in [a, b, c]): return "Please use numbers for each brother's age."
isinstance(x, (int, float))用于判断参数x是否属于int或float类型;any()遍历所有参数,只要有一个参数满足not isinstance(...)(即非数字类型),就返回True,触发提示语返回。
方案二:判断是否不全为数字类型
if not all(isinstance(x, (int, float)) for x in [a, b, c]): return "Please use numbers for each brother's age."
all()要求所有参数都满足isinstance(...)才返回True,取反后就表示存在非数字类型的参数。
修改后的完整函数
def punch_your_three_brothers_in_order_of_age(a, b, c): brothers = [a, b, c] # 单行判断任意参数非数字类型 if any(not isinstance(x, (int, float)) for x in brothers): return "Please use numbers for each brother's age." brothers.sort(reverse=True) # 改用f-string简化字符串拼接 return f"Start with the {brothers[0]} year old, then continue with your {brothers[1]} year old brother."
额外说明
如果需要排除布尔值(Python中bool是int的子类,isinstance(True, int)会返回True),可以调整判断条件为:
if any(type(x) not in (int, float) for x in brothers):
这种方式会严格判断参数类型是否为int或float,排除布尔值的干扰。
内容的提问来源于stack exchange,提问作者girtlakkanseri
相关产品推荐
相关产品推荐

