Как я могу проверить, какое значение содержится в параметре функции *args?

#python

Вопрос:

У меня есть эта функция, в которой я получаю переменное количество параметров в параметре функции *args, и я должен их добавить. Исходя из этой суммы, я должен проверить некоторые условия:

  1. Если их сумма меньше 21, выведите их
  2. Если сумма больше 21, вычтите 10 из суммы для каждого значения 11 и выведите «не годится», если сумма все еще больше 21 после всех вычитаний
  3. Если сумма равна 21, и у меня есть значение 10 и значение 11, выведите «Выигрыш».
 def get_hand_value(*args):
    sum=0
    for argument in args:
        sum  =argument
    if(sum < 21):
        print("The value of your hand is {}".format(sum))
    if(sum > 21 and argument == 11):
        sum -=10
        print(sum)
    if(sum>21 and argument != 11):
        print("No Good!")
    if(sum ==21 and argument == 11 and argument == 10):
        print("Win!")    
            
hand_1 = get_hand_value(4,4,4,4)
hand_2 = get_hand_value(11,10)
hand_3 = get_hand_value(11,5,6,4,11,4)
hand_4 = get_hand_value(11,5,6,10)
hand_5 = get_hand_value(10,5,7)
 

Это то, что я смог придумать, но после первой раздачи он просто печатает «никуда не годится».

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

1. argument после цикла — последнее значение из args . Проверять это в вашем случае не имеет особого смысла. Вам нужно просмотреть все значения ( for например, с циклом) и вычитать из суммы каждый раз, когда вы видите 11.

2. Обратите внимание, что, как правило, плохая практика заключается в том, чтобы создавать тени, такие как sum

3. Что делать, если сумма равна ровно 21, а у вас нет 10 и 11?

Ответ №1:

Основная проблема, по-видимому, заключается в использовании argument вне for цикла. Он всегда будет иметь значение последнего аргумента args , и это не то, что вы имели в виду.

В частности, эти условия:

 if(sum > 21 and argument == 11):
    sum -=10
    print(sum)

if(sum ==21 and argument == 11 and argument == 10):
    print("Win!")  
 

никогда не будет верным для входных данных, которые вы перечислили.

Кроме того, я бы рекомендовал не вызывать переменную sum , так как это имя встроенной функции. По иронии судьбы, это название функции, которая облегчила бы вам жизнь здесь.

 total = sum(args)
 

Ответ №2:

Когда вы используете argument после цикла, вы просто получаете последний аргумент, вы не проверяете каждый аргумент, чтобы убедиться, что он равен 11. Вы должны проверить 11 , есть ли внутри цикла.

Не используйте sum в качестве имени переменной, так как это имя встроенной функции (которую вы могли бы использовать для вычисления суммы).

Используйте elif при тестировании взаимоисключающих условий.

 def get_hand_value(*args):
    total=0
    elevens = 0
    for argument in args:
        total  =argument
        if argument == 11:
            elevens  = 1
    if (total < 21):
        print("The value of your hand is {}".format(total))
    elif total > 21:
        total -= elevens * 10
        if total < 21:
            print("The value of your hand is {}".format(total))
        else:
            print("No Good!")
    elif total == 21 and elevens == 1:
        print("Win!")