Как я должен проверить, чтобы параметры в моей функции были целыми или плавающими?

#python #function #input #parameters

#python #функция #ввод #параметры

Вопрос:

 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))
  

Вопрос:
Как я должен проверять параметры в моей функции, чтобы они были целыми или плавающими?

Комментарии:

1. Что вы хотите сделать в этом случае? Разве TypeError исключения недостаточно?

2. Это зависит от того, что вы хотите сделать , если они не все сопоставимы. Я бы сказал, что сочетание int и float значений подходит, потому что можно сравнить int с float . Но вы не можете сравнить str ни с тем, ни с другим, поэтому вы хотите молча игнорировать такие значения или вы просто хотите вызвать ошибку (которая max уже произойдет, так что вы можете перехватить это или просто позволить ей распространяться вверх по стеку вызовов).?

3. также вызовет исключение, если окажется, что вы не можете добавить два самых больших значения.

4. Да, я хочу знать, как работать с * аргументами и исключениями в этом случае

Ответ №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
  

Комментарии:

1. Спасибо! Это действительно полезно!

Ответ №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 .