Arbil
@Arbil

Возможно ли улучшить качество кода?

Здрасте
Я хочу стать программистом
И у меня такой вопрос
Если мой код похож на Франкенштейна, вроде этого:
All_Numbers = list( '7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450' )

Finisg_Number = 0

try:

	while True:

	    temp = 1

	    for Number in All_Numbers[ 0 : 13 ]:

	        temp *= int( Number )	        

	    del All_Numbers[ 0 ]

	    if temp > Finisg_Number:

	        Finisg_Number = temp

except Exception:	
	
	print( Finisg_Number )


Если у меня нет аналитического мышления, со временем и практикой код станет лучше?
Или лучше бросить мучить комп и бросать ?

PS. Кому интересно(на счёт кода), то это задача 8 проекта Эйлера
  • Вопрос задан
  • 283 просмотра
Решения вопроса 3
Zoominger
@Zoominger Куратор тега Python
System Integrator
Если у меня нет аналитического мышления

С каких пор какие-то абстрактные понятия о мышлении, введённые непонятно кем и базирующиеся на неавторитетных источниках стали каким-то фильтром для программирования? Вы пишете код? Пишете. Всё.

со временем и практикой код станет лучше?

Безусловно.

Или лучше бросить мучить комп и бросать ?

Если б вы шли в веб, я бы сказал "Да", но нет.

По такому кусочку не скажешь. Код работает? Работает. Покодьте месяц и посмотрите на него снова. Есть что изменить? Если да, то вы растёте, если нет, то зарвались.
Ответ написан
Комментировать
SpacePurr
@SpacePurr
c#, wpf
Если мучаешься - бросай. Если интересно - продолжай и код станет лучше. Как и ты. Как и весь мир.
Ответ написан
longclaps
@longclaps
Решение почти рабочее, содержит ошибку, и вправду похоже на Франкенштейна. Давай-ка его разберём:
Начнем с ошибки:
припишем справа к той длинной строке вот такую: '0999999999999' (ноль и 12 девяток). Очевидно, этот хвост даст произведением ноль. Но твой алгоритм слажает, и в результате выдаст Finisg_Number равным 282429536481. Исправим это:
All_Numbers = list('7316717...2963450' + '0999999999999')
Finisg_Number = 0
for _ in range(len(All_Numbers) - 13):
    temp = 1
    for Number in All_Numbers[: 13]:
        temp *= int(Number)
    del All_Numbers[0]
    if temp > Finisg_Number:
        Finisg_Number = temp
print(Finisg_Number)
Далее пройдёмся по эффективности: хотя задача мелкая и выполняется быстро, почему бы не разобраться, что тормозит? del All_Numbers[0] - это тяжелая операция, при удалении первого элемента листа все остальные копируются на одну позицию левее. А вот del All_Numbers[-1] такого эффекта не вызывает. Попробуем переписать так:
All_Numbers = list('7316717...2963450')
Finisg_Number = 0
for _ in range(len(All_Numbers) - 13):
    temp = 1
    for Number in All_Numbers[-13:]:
        temp *= int(Number)
    del All_Numbers[-1]
    if temp > Finisg_Number:
        Finisg_Number = temp
print(Finisg_Number)

Вроде работает. Ну и еще, на каждом шагу выполняется 13 умножений. Немного, а если бы 313? Есть способ обойти и это. Тут я выложу свой код с минимумом комментариев:
l = list(map(int,
             '73167176531330624919225119674426574742355349194934969835203'
             '12774506326239578318016984801869478851843858615607891129494'
             '95459501737958331952853208805511125406987471585238630507156'
             '93290963295227443043557668966489504452445231617318564030987'
             '11121722383113622298934233803081353362766142828064444866452'
             '38749303589072962904915604407723907138105158593079608667017'
             '24271218839987979087922749219016997208880937766572733300105'
             '33678812202354218097512545405947522435258490771167055601360'
             '48395864467063244157221553975369781797784617406495514929086'
             '25693219784686224828397224137565705605749026140797296865241'
             '45351004748216637048440319989000889524345065854122758866688'
             '11642717147992444292823086346567481391912316282458617866458'
             '35912456652947654568284891288314260769004224219022671055626'
             '32111110937054421750694165896040807198403850962455444362981'
             '23098787992724428490918884580156166097919133875499200524063'
             '68991256071760605886116467109405077541002256983155200055935'
             '72972571636269561882670428252483600823257530420752963450'
             '0999999999999'))
sliding = 1  # в sliding я буду держать произведение тех чисел из окна, которые больше нуля
for a in l[:13]:  # это начальное окно, в цикле я буду сдвигать его вправо
    if a:
        sliding *= a
zerocount = l[:13].count(0)  # тут я буду отслеживать, сколько нулей в текущем окне
best = 0 if zerocount else sliding  # упс, чуть не потерял начальное окно
for a, b in zip(l, l[13:]):  # a выходит из окна, b заходит
    if a:
        sliding //= a
    else:
        zerocount -= 1
    if b:
        sliding *= b
    else:
        zerocount += 1
    if not zerocount and best < sliding:
        best = sliding
print(best)
ps Поработай над стилем, ссылку на pep8 давали выше.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ApeCoder
@ApeCoder
Прочитайте PEP8, найдите инструменты для проверки на соответствие PEP8
Исправьте ошибки найденные инструментами и вручную
Перепишите без использования исключений: исключения только для исключительных ситуаций.
Циклы лучше читаются, если не использовать while true а добавить условие (понятно чего хотим добиться - условие выхода).

Поищите в словаре каждое используемое имя в названия переменных и исправьте описку.

Прочитайте про list и iterator comprehensions, а также функцию max
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы