【问题标题】:How should I check parameters in my func to be an integer or float?我应该如何检查我的函数中的参数是整数还是浮点数?
【发布时间】:2020-09-16 13:40:47
【问题描述】:
def sum_of_max(*args):
    my_list = list(args)
    first_max = max(my_list)
    my_list.remove(max(my_list))
    return first_max + max(my_list)

print(sum_of_max( "qwerty", 1, 6))

问题: 我应该如何检查我的 func 中的参数是整数还是浮点数?

【问题讨论】:

  • 在这种情况下你想做什么? TypeError 异常还不够吗?
  • 这取决于你想要做什么,如果它们不是全部可比的话。我认为intfloat 值的混合很好,因为可以将intfloat 进行比较。但是您不能将str 与任何一个进行比较,所以您是想默默地忽略这些值,还是只想引发一个错误(max 已经这样做了,所以您可以抓住它或干脆让它向上传播调用堆栈)。?
  • + 如果事实证明您无法添加两个最大值,也会引发异常。
  • 是的,我想知道在这种情况下如何使用 *args 和异常

标签: python function input parameters


【解决方案1】:

一个选项可能是:

def sum_of_max(*args):
    if not all(type(x) in (float, int) for x in args):
        raise TypeError("Parameters should be of type 'int' or 'float'")

    my_list = list(args)
    first_max = max(my_list)
    my_list.remove(max(my_list))
    return first_max + max(my_list)

print(sum_of_max( "qwerty", 1, 6))
# Output: TypeError: Parameters should be of type 'int' or 'float'

但它只是将max() 引发的异常替换为更明确的异常。最好的选择可能是让你的函数保持原样,并在使用它时发现潜在的错误:

try:
    print(sum_of_max("qwerty", 1, 6))
except ValueError:
    # Do what you want in case of ValueError

【讨论】:

  • 谢谢!这真的很有帮助!
【解决方案2】:

您的函数不应该真正关心它获得的值的类型。它关心的是:

  1. 列表中的所有值都可以相互比较
  2. 可以将两个最大值相加。

最简单的做法是假设这些都是真的,并让>+ 引发的任何异常传播;调用sum_of_max 的任何人都可以捕获并处理它们,方法是修复参数并再次调用sum_of_max,或者提供一些默认值来代替sum_of_max 可能返回的值。这实际上更容易在不使用 max 的情况下完成,但您需要自己迭代参数。

def sum_of_max(*args):
    biggest = None
    second_biggest = None
    for x in args:
        if biggest is None or x > biggest:
            biggest = x
            second_biggest = biggest
    return biggest + second_biggest

请注意,biggest + second_biggest 会引发异常的一种情况是,如果没有至少两个可比较的值,在这种情况下,将永远不会为一个或两个都分配除 None 以外的值。

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2012-08-19
    相关资源
    最近更新 更多