Python условные операторы - PullRequest
1 голос
/ 07 августа 2011
def Fitness(a, b, c):  
    if ((a&b&c) >= 4) & ((a+b+c) >= 13):  
        return('Gold')  
    if ((a&b&c) >= 3) & ((a+b+c) >= 10):  
        return('Silver')   
    if ((a&b&c) >= 2) & ((a+b+c) >= 07):  
        return('Pass')  
    else:  
        return('Fail')

Теперь проблема в том, что когда задано Fitness(2,2,5), управление переходит к значению по умолчанию, т.е. 'Потерпеть поражение'. Где фактический выход «Проход». ?

Ответы [ 5 ]

17 голосов
/ 07 августа 2011

Обратите внимание, что

a&b&c >= 2

отличается от

a>=2 and b>=2 and c>=2.

Я думаю, что вы имеете в виду второе, то есть все значения больше двух. (Первый делает двоичный файл и со всеми вашими значениями и сравнивает его со значением два.)

5 голосов
/ 07 августа 2011

Используйте and вместо & (двоичное и).И не пишите 07 - числа, начинающиеся с 0, могут интерпретироваться как восьмеричные в зависимости от вашей версии Python.

Вместе с вдохновением Говарда я бы предложил следующее:

def Fitness(a, b, c):
    if all(x>=4 for x in (a,b,c)) and (a+b+c) >= 13:
        return('Gold')
    if all(x>=3 for x in (a,b,c)) and (a+b+c) >= 10:
        return('Silver') 
    if all(x>=2 for x in (a,b,c)) and (a+b+c) >= 7:
        return('Pass')
    return('Fail')

Кроме того, грустно, что вы не вручаете бронзовую медаль ...

3 голосов
/ 07 августа 2011

Где фактический выход - «Пропуск».

Нет, это не так.2 (0b010) & 2 & 5 (0b101) равно 0, поэтому все выражения не будут выполнены, даже если вы измените &, разделяющий два члена, на and.Возможно, вы хотели использовать совершенно другое выражение?

2 голосов
/ 07 августа 2011

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

def fitness(*args):
    arg_sum = sum(args)
    smallest_arg = min(args)

    if smallest_arg >= 4 and arg_sum >= 13:
        return 'Gold'
    if smallest_arg >= 3 and arg_sum >= 10:
        return 'Silver'
    if smallest_arg >= 2 and arg_sum >= 7:
        return 'Pass'
    return 'Fail'

Сначала важные вещи:

  1. Заключение возвращаемого значения в круглые скобки, как в return('Gold'), само по себе не является неправильным, но может смутить читателя; return это утверждение, а не функция. Тем не менее, это работает, потому что круглые скобки игнорируются . Если вы действительно хотели вернуть кортеж с одним строковым элементом, выполните return ('Gold',).
  2. DRY : один раз вычислить сумму и наименьший элемент аргументов и использовать вычисленные значения в блоках if, как показано выше.
  3. Поскольку все аргументы обрабатываются одинаково и вместе, соберите их в *args кортеж. Это также обобщает функцию для работы с любым количеством аргументов. Если это не должно быть разрешено, добавьте это в начало функции:

    if len(args) != 3:
        raise TypeError("Need exactly 3 arguments, got {0}".format(len(args)))
    

Наконец, я просто упомяну, что функции должны иметь lower_case_names согласно руководству по стилю Python . Следование руководству по стилю, конечно, не обязательно, просто рекомендуется. :)

0 голосов
/ 21 сентября 2012
def fitness(*args):
    arg_sum = sum(args)
    smallest_arg = min(args)

    if smallest_arg >= 4 and arg_sum >= 13:
        return 'Gold'
    if smallest_arg >= 3 and arg_sum >= 10:
        return 'Silver'
    if smallest_arg >= 2 and arg_sum >= 7:
        return 'Pass'
    return 'Fail'
...