Top.Mail.Ru
Ответы

Переделайте код python

Выдает ошибку, я понимаю в чем она, но если переписывать код с учетом этой ошибки то получится еще больше
может есть способы как сократить код и исправить ошибку?
Ошибка
Traceback (most recent call last):
File "test.py", line 4, in
exec(sys.stdin.read().strip())
File "", line 1, in
File "/temp/executing/solution.py", line 10, in solve
elif s[2] == 0:
IndexError: tuple index out of range
make: *** [run] Error 1
Ввод
print(sorted(solve(2, -1)))
Ожидаемый результат
[0.5]
Вывод
Makefile:5: recipe for target 'run' failed

https://ideone.com/4g26MY

По дате
По Рейтингу
Аватар пользователя
Новичок

def solve(*s):
~~if len(s) == 0 or len(s) > 3: return None # None - константа, а не строка
~~if sum(map(abs, s)) == 0: return ['all']
~~if s[-1] != 0 and sum(map(abs, s[:-1])) == 0: return []
~~if len(s) == 2 or s[0] == 0: return [-s[-1] / s[-2]]
~~d = s[1] * s[1] - 4 * s[0] * s[2]
~~if d < 0: return []
~~if d == 0: return [-s[1] / (2 * s[0])]
~~return [(-s[1] - d ** 0.5) / (2 * s[0]), (-s[1] + d ** 0.5) / (2 * s[0])]

Можно сделать финт ушами и удалить все нулевые коэф-ты слева. Это не сократит код, но упростит его понимание:

def solve(*s):
~~if len(s) == 0 or len(s) > 3: return None
~~s = list(s) # из кортежа удалить элементы нельзя - преобразовываем в список
~~while len(s) > 0 and s[0] == 0: s.pop(0)
~~if len(s) == 0: return ['all']
~~if len(s) == 1: return []
~~if len(s) == 2: return [-s[1] / s[0]]
~~d = s[1] * s[1] - 4 * s[0] * s[2]
~~if d < 0: return []
~~if d == 0: return [-s[1] / (2 * s[0])]
~~return [(-s[1] - d ** 0.5) / (2 * s[0]), (-s[1] + d ** 0.5) / (2 * s[0])]

Аватар пользователя
Мыслитель

https://pastebin.com/XvG0VeGC
def solve(*coefficients):
if len(coefficients)!=3:raise ValueError
a,b,c=coefficients
if a!=0:D=b*b-4*a*c;return[(-b+D**.5)/2/a,(-b-D**.5)/2/a]if D>0 else[-b/2/a]if D==0 else[]
else:return[-c/b]if b!=0 else[]if c!=0 else['all']

Аватар пользователя
Мастер

Вот ты начал красиво - сразу ввернул 'None', если количество аргументов ноль, либо больше трех. А дальше почему не анализируешь количество аргументов? Ведь у тебя еще случаи, когда их 3, 2 и 1.
В строке 5 два раза проверяешь s[1].

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