#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:
Ваша функция не должна заботиться о типе значений, которые она получает. Что действительно волнует, так это:
- Все значения в списке можно сравнить друг с другом
- Два самых больших значения могут быть добавлены вместе.
Самое простое, что можно сделать, это предположить, что они верны, и разрешить распространение любых исключений, вызванных >
или
; тот, кто вызывал 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
.