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

Пароль

 
Вход при помощи VK ID
временно не работает,
как войти читайте здесь!
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
21 комментариев из 24
Я в таких случаях, во времена, когда активно писал проги на паскале, просто прогонял тестовый пример в цикле на скорость. Строго говоря, не зная, как работает оптимизация кода перед исполнением, какой вариант лучше без такой проверки не узнаешь. Думаю, интерпретаторов это тоже касается.
ArtChaos Онлайн
rewaQ
а если в итоге вот те вычисления, что можно выделить в переменную, будут повторяться?
ArtChaos
Если будут, то можно. Но для разового расчета лучше не заводить специальные переменные.
В теории, нужно использовать принцип сode reuse. Особенно если у вас будет много-много строчок еще. Если вы объявили дополнительные переменные - вы сможете использовать их в будущем, особенно если сделать код динамичным. Но с этим языком - без понятия, как оно там.
Дoлoxов Онлайн
Bless
О, давно тебя не видел в блогах) С возвращением)
ArtChaos Онлайн
Bless
В Питоне можно, это в в Го вроде нельзя)


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

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

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

чо
в обоих вариантах примерно одинаковое кол-во операций
Lucia Malfoy
>интересует философия написания кода
пиши читаемый и расширяемый код, изи
Lucia Malfoy
если кажется, что всё плохо, юзай профайлер
ArtChaos Онлайн
Lucia Malfoy
в примерах-то да, но если во втором примере придётся ещё раз использовать те же вычисления при расширении проги?
ArtChaos Онлайн
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]))
ПОИСК
ФАНФИКОВ











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