↓
 ↑
Регистрация
Имя/email

Пароль

 
Войти при помощи
ArtChaos
28 сентября 2019
Aa Aa
Никак не могу понять, как это гуглить, поэтому спрошу тут:
Как лучше писать код: с лишней переменной, куда единоразово сведём расчёты или каждый раз фигачить расчёты?

Пример:
a = int(input())
b = int(input())
c = int(input())

d = a // 2
e = a % 2
f = b // 2
g = b % 2
h = c // 2
i = c % 2

print(d + e + f + g + h + i)
или
a = int(input())
b = int(input())
c = int(input())

print(((a // 2) + (a % 2)) + ((b // 2) + (b % 2)) + ((c // 2) + (c % 2)))
Понятно, что в таких учебных программах не важна загрузка сервера лишними вычислениями, но меня, скажем так, интересует философия написания кода. А в дзене Питона такого нет, я не знаю, что проще из двух вариантов.

В первом дофига переменных, что выглядит глупо для маленьких программ.
Но второй вариант выглядит глупо уже для больших программ, где такие скобки с мнимыми переменными могут сильно затруднить читабельность кода и зарузить сервер вычислениями.

#ламмерское #IT #проггерское
28 сентября 2019
23 комментариев из 24
Если можно не объявлять переменную, то лучше ее не объявлять. Если конечно, это не выльется в 1000 символьную запутанную лапшу.
Дoлoxов
но, согласись, что 6 переменных просто так выглядят, ну... так себе.
Я в таких случаях, во времена, когда активно писал проги на паскале, просто прогонял тестовый пример в цикле на скорость. Строго говоря, не зная, как работает оптимизация кода перед исполнением, какой вариант лучше без такой проверки не узнаешь. Думаю, интерпретаторов это тоже касается.
rewaQ
а если в итоге вот те вычисления, что можно выделить в переменную, будут повторяться?
ArtChaos
Если будут, то можно. Но для разового расчета лучше не заводить специальные переменные.
В теории, нужно использовать принцип сode reuse. Особенно если у вас будет много-много строчок еще. Если вы объявили дополнительные переменные - вы сможете использовать их в будущем, особенно если сделать код динамичным. Но с этим языком - без понятия, как оно там.
Bless
О, давно тебя не видел в блогах) С возвращением)
Bless
В Питоне можно, это в в Го вроде нельзя)


Дoлoxов
rewaQ
П_Пашкевич
Bless
пасиба)
Дoлoxов
Привет, да, я ожил, но преимущественно в режиме "пассивный чтец".
Рад видеть знакомые лица :)
Представьте, что вы откроете этот кусок кода через полгода и зададите себе вопрос: что эта формула делает? Все понятно?

А вообще, слишком мало данных, чтобы понять, как лучше.

(Философия написания кода: пишем для людей, а не для машины. Всегда. Даже если программа маленькая.)
//Провокационно
Напишите на ассемблере и не страдайте. Переменные, понимаешь. Абстрактный ввод-вывод, пхе.
:-)))
Marlagram
Кросс-платформенный ассемблер? Если это Питон, оно же с высокой вероятностью будет выполняться на сервере с неведомой архитектурой.
Главное, читаемость кода. От лишних десяти переменных, которые исчезнут когда функция отработает свое, ничего не изменится. Можно методы писать в одну строку... Вот только читаемость там на уровне - Что это, бл* за хер*я ?!!
Lucia Malfoy
>зарузить сервер вычислениями

чо
в обоих вариантах примерно одинаковое кол-во операций
Lucia Malfoy
>интересует философия написания кода
пиши читаемый и расширяемый код, изи
Lucia Malfoy
если кажется, что всё плохо, юзай профайлер
Lucia Malfoy
в примерах-то да, но если во втором примере придётся ещё раз использовать те же вычисления при расширении проги?
Lucia Malfoy
расширяемый код?
Lucia Malfoy
П_Пашкевич
Ну, если уж серьёзнее - то надо иметь ввиду вот это.
Marlagram
Ну, самим встроенным ассемблером меня не удивить: он ещё в шестом турбопаскале появился, а из него идея перешла в Дельфи и была заимствована во фрипаскаль. Но ведь там для каждого процессора свой набор операндов. А что касается cuda - я с этим столкнулся в какой-то биоинформатической проге, когда оказалось, что её линукс-версия требует непременно видеокарту NVIDIA (хорошо, что виндовая версия запустилась под вайном).
ArtChaos
> Как лучше писать код

Вот так:

abc = input().split(' ').strip()
print(sum([(x//2+x%2) for float(x) in abc]))

> меня, скажем так, интересует философия написания кода

Функциональная парагидма наше всё.
Ну или даже так, для вящей "расширяемости":

abc = [float(strip(x)) for x in input().split(' ')]
foo = lambda x: x//2 + x%2
print(sum([foo(x) for x in abc]))
ПОИСК
ФАНФИКОВ







Закрыть
Закрыть
Закрыть