2015-09-16 3 views
0

Я пытаюсь изучить python, и один из сайтов, с которыми я работаю, имеет одну из следующих проблем: Учитывая два значения int, a и b, верните True, если один из них равен 6. Или если их сумма или разность равна 6.Есть ли лучший, более короткий код для этого?

и вот мой код он

def love6(a, b): 
    diff = a-b 
    sum = a+b 
    if a==6 or b==6: 
    return True 
    elif sum==6 or abs(diff)==6: 
    return True 
    else: 
    return False 

Это нормально, и работает отлично - просто интересно, если это может быть сжат дальше?

+4

Кстати, это не очень хорошая идея затенять встроенную функцию 'sum' с переменной этого имени. –

+0

прав, спасибо. Думаю, потребуется некоторое время, чтобы понять все встроенные функции (хотя _sum_ должен был быть мне понятен) – awkward101

+0

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

ответ

7

Поскольку две ветви вашего if сделать то же самое, вы можете объединить их в один, связывая их с другим or:

if a==6 or b==6 or sum==6 or abs(diff)==6: 
    return True 
else: 
    return False 

, но это просто:

return (a == 6 or b == 6 or sum==6 or abs(diff)==6) 

Но так как все из них испытывают одинаковое равенство, вы можете использовать оператор in следующим образом:

return 6 in (a,b,sum,abs(diff)) 

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

return 6 in (a,b,a+b,abs(a-b)) 
+2

Ждал, чтобы кто-то использовал 'in'. Мне это нравится. Но я бы не использовал его, потому что он менее интуитивно понятен и, вероятно, медленнее, потому что он должен строить кортеж. Я бы придерживался второй версии. – spectras

+0

@spectras I .. очень сомневаюсь, что разница во времени здесь будет отдаленно заметна. Даже при использовании полностью короткой замыкающей версии, такой как ответ PM 2Ring (моя вторая версия все еще вычисляет 'sum' и' diff' раньше времени), вероятно, будет иметь разницу во времени, измеренную за 10 секунд * циклов *. – lvc

+0

Ofc. Это было более интуитивно. Однако я сделал «время» из любопытства. При возврате False разница составляет около 10%. К сожалению, я не могу считать циклы с «timeit», поскольку частота масштабирования начинается, но я полностью согласен, что она настолько коротка, что это не будет иметь никакого значения в какой-либо реальной программе. – spectras

6

Зачем тратить время предварительного вычисления суммы & абсолютной разницы, когда они может не понадобиться?

def love6(a, b): 
    return a==6 or b==6 or a+b==6 or abs(a-b)==6 

питон or оператора короткого замыкания, поэтому вышеуказанные тесты оцениваются слева направо, а когда истинное значение найдено, не больше тестов выполняются. Например, если a или b равен 6, то сумма не рассчитывается, а абсолютная разница вычисляется только если ни a, ни b равно 6, а их сумма не 6.

+0

Не оспаривая, что короткое замыкание - полезная вещь, чтобы узнать и знать, я не думаю, что «тратить время «это хороший способ создать его здесь (разница во времени будет действительно незначительной). – lvc

+2

@lvc: справедливая точка, хотя это не просто время вычисления, которое было сохранено - есть также время и оперативная память, сохраненные при создании временных объектов, которые содержат результаты расчета. Конечно, в этом примере все мелочи. Но если бы мы делали это в цикле над миллиардом пар '(a, b), разница в производительности была бы заметной (хотя влияние на оперативную память, вероятно, было бы не так уж плохо, из-за того, что Python обрабатывает целые объекты) , –

+0

Стоимость оперативной памяти для двух 'int' составляет примерно 60 байт. Это происходит, если они массивны, поэтому, если сумма и разница составляют порядка 10^30 (одна миллиарда миллиардов миллиардов), это около 80 байт. Помимо эффекта небольшого целочисленного кэша CPython, они могут собираться для сбора мусора, как только функция возвращается, поэтому количество вызовов несущественно. Они будут быстрыми местными жителями, поэтому поиск в CPython является тем же самым индексом массива C (постоянная арифметика указателя времени), что и для 'a' и' b'. Любая фактическая стоимость оплачивается * один раз *, когда функция компилируется. – lvc

Смежные вопросы