Мне нужно написать функцию Python, которая может решить любое квадратное уравнение в форме: ax2 + bx + c = 0, а также обработать особый случай, когда некоторые из коэффициентов равны нулю, мне нужно написать функцию с 3 необязательными аргументами ключевого слова, со значением по умолчанию 0. Таким образом, эту функцию можно использовать с любым порядком коэффициентов, если квадратичный член равен a, линейный член равен b, а константа равна c. Кроме того, можно опустить коэффициенты, если они равны 0. И я должен вернуть список на основе следующих условий: Из этих коэффициентов вычислить каждое действительное решение и вернуть их в виде списка, не длиннее 2. Вернуть None, если все коэффициенты равны нулю, потому что в этом случае у вас было бы бесконечное количество решений. Если решения нет или есть только сложные, то вернуть пустой список. Если есть реальный корень с кратностью 2, то вернуть один длинный список. Однако проблема в том, что я не знал, как установить значения словаря по умолчанию, когда я получаю пустой словарь в качестве входных данных. Заранее спасибо за вашу помощь!

Это мой код

import math
def quadratic_solve(**dictr):
    List=[]
    x1=dictr['a']
    x2=dictr['b']
    x3=dictr['c']
    delta=x1*x1-4*x2*x3
    if (x1==0 and x2==0 and x3==0):
        return None
    if (x1==0):
        List.append(-x3/x2)
        return List
    if(dictr['b']*dictr['b']-4*dictr['a']*dictr['c']<0) :
        return List
    if(x2*x2-4*x1*x3>0) :
        List.append((-x2+math.sqrt(delta))/2*x1)
        List.append((-x2-math.sqrt(delta))/2*x1)
        return List
0
Med Hazem Bouzir 10 Апр 2020 в 15:46
Да, ввод должен быть словарем, а вывод - списком, есть идеи, как решить эту проблему?
 – 
Med Hazem Bouzir
10 Апр 2020 в 15:54
Я думаю, проблема в том, что я не знал, как выполнить это условие: мне нужно написать функцию с 3 необязательными ключевыми аргументами со значением по умолчанию 0. Таким образом, эту функцию можно использовать с любым порядком коэффициентов. пока квадратичный член равен a, линейный член равен b, а константа равна c. Кроме того, можно опустить коэффициенты, если они равны 0. Поэтому, когда я ввожу ввод {'c': -1, 'b': 1, 'a': 1} или {}, я всегда получаю эту ошибку: TypeError: quadratic_solve() получил неожиданный ключевой аргумент 'c' или TypeError: quadratic_solve() отсутствует 1 обязательный позиционный аргумент: 'dictr'
 – 
Med Hazem Bouzir
10 Апр 2020 в 16:03

1 ответ

Вы могли бы лучше использовать функцию Python, чтобы уменьшить объем кода (т.е. сосредоточиться на основных условиях):

def quadratic_solve(params):
    a,b,c = [params.get(p,0) for p in "abc"]   # get this out of the way early
    if a==0: return [] if b==0 else [-c/b]     # linear equation
    b2_4ac = b*b-4*a*c                         # part under the square root
    if b2_4ac < 0: return []                   # complex result 
    p,n = (-b+b2_4ac**0.5)/2/a, (-b-b2_4ac**0.5)/2/a # + or - square root results
    return [p] if p==n else [p,n]              # one or two solutions


quadratic_solve({'a':2,'b':3}) # [0.0, -1.5]
1
Alain T. 10 Апр 2020 в 21:45
Ввод должен быть словарем, а не целым числом
 – 
Med Hazem Bouzir
10 Апр 2020 в 17:30
Вы используете **dictr с dictr['a'], dictr['b']... точно так же, как и параметры со значениями по умолчанию. Это просто стандартная распаковка параметров в Python, поэтому словарь не является ненужным усложнением.
 – 
Alain T.
10 Апр 2020 в 17:33
Извините, это ошибка, которую я забыл исправить, я должен был написать dictr вместо **dictr (в словаре 3 элемента). Однако функция, которую я должен написать, автоматически проверяется системой и передает словарь в качестве входных данных, таких как {'c': -1, 'b': 1, 'a': 1} или {}. Поэтому я не могу использовать dictr['a'], dictr['b'], dictr['c'] в качестве параметров
 – 
Med Hazem Bouzir
10 Апр 2020 в 17:39
Я изменил пример, чтобы как можно раньше устранить проблему со структурой параметров в функции. Таким образом, остальная часть кода остается читаемой.
 – 
Alain T.
10 Апр 2020 в 21:46