2015-04-24 2 views
0

Я только начал изучать Python и пытаюсь выполнить упражнение.Python: Как использовать возвращаемое значение функции в более позднем коде?

Я чувствую, что мне не хватает чего-то действительно элементарного, так как я не могу получить некоторые значения, которые возвращаются, чтобы повлиять на мой код.

Пункт следующего кода состоит в том, чтобы печатать первичные коэффициенты входной доли пользователя, за исключением того, что он будет печатать только простые коэффициенты введенной доли, а не упрощенные дроби.

def gcd(a,b): 
    while b: 
     a,b = b,a%b 
    return a 
def simplify_fraction(numerator,denominator): 
    cd = gcd(numerator,denominator) 
    (simple_num,simple_denom) = (numerator/cd,denominator/cd) 
    if simple_denom == 1: 
     return simple_num 
    elif cd == 1: 
     return simple_num,simple_denom 
    else: 
     return simple_num,simple_denom 
def prime_factors(n): 
    i = 2 
    factors = [] 
    while i * i <= n: 
     if n % i: 
      i += 1 
     else: 
      n //= i 
      factors.append(i) 
    if n > 1: 
     factors.append(n) 
    return factors 
while True: 
    try: 
     while True: 
      fraction = input("Input a positive fraction then press enter:") 
      numerator,denominator = fraction.split("/") 
      numerator = int(numerator) 
      denominator = int(denominator) 
      if denominator == 0: 
       raise ValueError 
      elif numerator < 0: 
       print("That is not a positive fraction, please try again.") 
       continue 
      elif denominator < 0: 
       print("That is not a positive fraction, please try again.") 
       continue    
      elif numerator == 0: 
       print(str(numerator) + "/" + str(denominator) + " -> [0]") 
      elif numerator == 1: 
       print(str(fraction) + " -> [1]/" + str(prime_factors(denominator))) 
      elif int(denominator) == 1: 
       print(str(fraction) + " -> " + str(prime_factors(numerator))) 
      else: 
       simplify_fraction(numerator,denominator) 

Я уверен, что я что-то не хватает здесь, чтобы связать свою функцию simplify_fraction на этот мой код блока, но я не могу понять, что это такое.

   print(str(fraction) + " -> " + str(prime_factors(numerator)) + "/" + str(prime_factors(denominator))) 
      while True: 
       character = str(input('Continue (y/n)? ')) 
       if character == "y": 
        break 
       if character == "n": 
        quit() 
       else: 
        print ("That was not a valid choice, please select (y/n).") 
        continue 
except ValueError: 
    print("That is not a fraction, please try again.") 
    continue 

Вот 2 примера:

вход 3/9 дает 3/9 -> [3]/[3,3]. Я хочу, чтобы это было 3/9 -> [1]/[3].

Ввод 138/24 дает 138/24 -> [2,3,23]/[2,2,2,3]. Я хочу, чтобы это было 138/24 -> [23]/[2,2]

Может кто-нибудь, пожалуйста, дайте мне совет по этому поводу?

+1

Я не совсем понимаю ваш код, но обратите внимание, что 'simplify_fraction (числитель, знаменатель)' в конце вашего цикла ничего не делает, потому что вы не присваиваете результат чему-либо. Просто вызов функции не изменит строки на месте. – Kevin

+1

Вау, это много кода для вопроса «как использовать возвращаемое значение функции». Попытайтесь уменьшить неродственный код. – TarasB

+0

Эй, Тарас, извините, я знаю, что это так, я пытался дать полную картину, чтобы дать полное понимание и ясность. И Кевин, да, это ядро ​​проблемы ... Я пытаюсь понять, как назначить эти результаты, чтобы изменить строки на месте ... работая над изменением строки на данный момент, надеясь, что это сработает. –

ответ

1

Пробовал еще несколько способов добиться этого за последние пару часов и отсортировал его. почувствовал, что ответить на этот вопрос, как это теперь спорный так ... Вот готовый код:

def gcd(a,b): 
    while b: 
     a,b = b,a%b 
    return a 
def simplify_fraction(numerator,denominator): 
    cd = gcd(numerator,denominator) 
    (simple_num,simple_denom) = (numerator/cd,denominator/cd) 
    return int(simple_num),int(simple_denom) 
def prime_factors(n): 
    i = 2 
    factors = [] 
    while i * i <= n: 
     if n % i: 
      i += 1 
     else: 
      n //= i 
      factors.append(i) 
    if n > 1: 
     factors.append(n) 
    return factors 
while True: 
    try: 
     while True: 
      fraction = input("Input a positive fraction then press enter:") 
      numerator,denominator = fraction.split("/") 
      numerator = int(numerator) 
      denominator = int(denominator) 
      if denominator == 0: 
       raise ValueError 
      elif numerator < 0: 
       print("That is not a positive fraction, please try again.") 
       continue 
      elif denominator < 0: 
       print("That is not a positive fraction, please try again.") 
       continue 
      simple_num,simple_denom = simplify_fraction(numerator,denominator) 
      if simple_denom == 1 and simple_num == 0: 
       print(str(fraction) + " -> [0]") 
      elif simple_denom == 1: 
       print(str(fraction) + " -> " + str(prime_factors(simple_num))) 
      elif simple_num == 1: 
       print(str(fraction) + " -> [1]/" + str(prime_factors(simple_denom))) 
      else: 
       print(str(fraction) + " -> " + str(prime_factors(simple_num)) + "/" + str(prime_factors(simple_denom))) 
      while True: 
       character = str(input('Continue (y/n)? ')) 
       if character == "y": 
        break 
       if character == "n": 
        quit() 
       else: 
        print ("That was not a valid choice, please select (y/n).") 
        continue 
except ValueError: 
    print("That is not a valid fraction, please try again.") 
    continue 

Вот тест программы:

Введите положительная дробь затем нажмите клавишу ВВОД: -6/2
Это не положительная доля, повторите попытку.
Введите положительную долю и нажмите enter: 6/-2
Это не положительная дробина, повторите попытку.
Введите положительную долю и нажмите enter: 10/0
Это недопустимая доля, повторите попытку.
Введите положительную долю, затем нажмите enter: 0/0
Это недействительная доля, повторите попытку.
Введите положительную долю, затем нажмите ввод: 0/10
0/10 -> [0]
Продолжить (y/n)? y
Введите положительную долю, затем нажмите enter: 138/24
138/24 -> [23]/[2,2]
Продолжить (y/n)? y
Введите положительную долю и нажмите enter: 24/138
24/138 -> [2,2]/[23]
Продолжить (y/n)? u
Это был неверный выбор, пожалуйста, выберите (y/n).
Продолжить (y/n)? tt
Это был неверный выбор, пожалуйста, выберите (y/n).
Продолжить (y/n)? Y
Это был неверный выбор, пожалуйста, выберите (y/n).
Продолжить (y/n)?y
Введите положительную долю и нажмите enter: 66
Это недействительная доля, повторите попытку.
Введите положительную долю и нажмите enter: 1024/512
1024/512 -> [2]
Продолжить (y/n)? у
ввода положительной фракции нажмите клавишу ВВОД: 1024/511
1024/511 = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]/[7, 73]
Продолжить (Y/N)? n

Программа выходит.

Моя основная ошибка заключалась в том, чтобы не устанавливать переменные simple_num и simple_denom в моем основном блоке кода .... знал, что это что-то основное. Как только это было сделано, это было просто вопросом настройки, чтобы сделать его идеальным.

WOW, что напыщенная речь. Извини за это.

Если кто-то смотрит на это и знает, как это сделать, я бы хотел его увидеть ... всегда пытаюсь улучшить.

Благодаря этому удивительному сайту и сообществу!

Смежные вопросы