Использование дробей в Python

Здесь я использую классы для ввода дроби (при наличии числителя и знаменателя), а также для сложения и умножения двух дробей. По какой-то причине модуль импортированных дробей корректно работает только для части программы; метод gcd работает, но метод Fraction (где при задании двух чисел помещается в формат дроби) не работает, вместо этого выдается ошибка NameError (в частности, «глобальное имя« Дроби »не определено»).

Что я делаю неправильно? Я относительно новичок в Python, и любые предложения о том, как сделать этот код более жестким с большим количеством исключений, будут очень признательны.

Вот мой код:

import fractions

class FractionClass:
    # Initialize starting numerator and denominator.
    n = 0
    d = 0
    def __init__(self, numerator, denominator):
        self.n = numerator
        self.d = denominator

    # Function that adds fractions, whichs throws NameError if gcd() doesn't work!  
    def add_fractions(self, other):
        try:
            sum_numerator = self.n + other.n
            sum_denominator = fractions.gcd(self.d, other.d)
            return(sum_numerator, sum_denominator)
        except NameError:
            print("Methods aren't defined.")

    # Function that multiplies fractions, whichs throws NameError if gcd() doesn't work!    
    def multiply_fractions(self, other):
        try:
            product_numerator = self.n * other.n
            product_denominator = self.d * other.d
            return(product_numerator, product_denominator)
         except NameError:
            print("Methods aren't defined.")

    # Enter input function.
def user_input():
    try:
        print("Enter a numerator and denominator:")
        n, d = [int(x) for x in input().split()]
        print("Enter a numerator and denominator:")
        n2, d2 = [int(x) for x in input().split()]
        # Check used to debug for denominators that aren't the minimum of 1 (0 can't be divided!)
        check = 1 / d 
        check = 1 / d2 
        # print(check)

        # Exception for d = 0.
    except ZeroDivisionError:
        print("\n You didn't enter the minimum denominator.")
        print("Set denominator to minimum default.")
        d = 1
        # Exception for not entering a space in between numbers.
    except UnboundLocalError:
        print("You didn't enter your numbers in properly! Try again.")
        # Exception for not entering all required.
    except NameError:
        print("\n You didn't enter two numbers.")
        # Exception for user input both or one of them, not being integers.
    except TypeError:
        print("\n You didn't enter all valid numbers.")
        # General exception case.
    except:
        print("Something went wrong!")

    fract = FractionClass(n,d)
    another_fraction = FractionClass(n2, d2)
    total_sum = fract.add_fractions(another_fraction)
    # Unpacks total sum tuple.
    # Puts in fraction format.
    sum_numerator, sum_denominator = total_sum
    add_output = fractions.Fraction(sum_numerator, sum_denominator)
    total_product = fract.multiply_fractions(another_fraction)
    # Unpacks product sum tuple.
    # Puts in fraction format.
    product_numerator, product_denominator = total_product
    multiply_output = fractions.Fraction(product_numerator, product_denominator)
    print(add_output, multiply_output)

person user1739537    schedule 10.12.2012    source источник
comment
Почему вы ловите NameError или UnboundLocalError? Это, скорее всего, ошибки в вашем коде.   -  person lqc    schedule 11.12.2012
comment
Мало того, что в вашем коде нет ничего с именем «Дроби», и нет никаких ссылок на что-либо из этого с именем, поэтому я думаю, что то, что вы сказали о получении NameError для глобального имени «Дроби», не может быть правильный. Пожалуйста, добавьте все фактические строки из трассировки стека в свой вопрос или, по крайней мере, исправьте его.   -  person martineau    schedule 11.12.2012
comment
@ lqc эти исключения предназначены для обеспечения корректного ввода. Так, например, NameError для случаев, когда пользователь не вводит указанное количество чисел, UnboundLocalError для пробелов и т. д. Теперь это работает. Спасибо всем!   -  person user1739537    schedule 12.12.2012


Ответы (2)


Вам не нужен собственный класс для умножения двух дробей:

>>> from fractions import Fraction as F
>>> F("1/2")
Fraction(1, 2)
>>> F("3/4")
Fraction(3, 4)
>>> F("1/2") * F("3/4")
Fraction(3, 8)
>>> F("1/2") + F("3/4")
Fraction(5, 4)
>>> F(5, 8) + F(4, 7)
Fraction(67, 56)

Что касается упомянутой вами ошибки, это маловероятно, поскольку в вашем коде нет имени «Дроби» и вы не опубликовали трассировку. Скорее всего, вы используете какую-то старую версию своего кода.

person lqc    schedule 10.12.2012
comment
Re: какая-то старая версия, reload твой друг. - person Mark Ransom; 11.12.2012
comment
Фракции есть в моем коде, и я реализовал кое-что из того, что вы сказали: теперь это работает! - person user1739537; 12.12.2012

В строке 26 есть еще один пробел:

         except NameError:

Должен быть

        except NameError:

Вы также должны проверить и исправить отступ. В противном случае нет тела — ничего не называется.

person pepr    schedule 10.12.2012