Функция не сохраняет переменные
Форумчане! Возникла проблема с тем, что почему-то функция не хочет отдавать мне значение вычисленной переменной. Пишет, мол "Ошибка в 18 строке. Имя 'р' не найдено"... Объясните, как решить эту проблему (Это особенность функции или ошибка в коде? Желательно с более правильным вариантом). Заранее, спасибо!
def fr(p1, q1):
p = p1
q = q1
while (p != 0) and (q != 0):
if p > q:
p = p % q
else:
q = q % p
p = p + q
return p
a = int(input('...'))
b = int(input('...'))
fr(a, b)
a = a // p
b = b // p
Ответы (2 шт):
p = fr(a, b)
Ещё, скорее всего, у вас тут неправильный отступ:
def fr(p1, q1):
p = p1
q = q1
while (p != 0) and (q != 0):
if p > q:
p = p % q
else:
q = q % p
p = p + q
return p
Ошибка заключается в неверном понимании области видимости. Покажу более наглядно:
def fr(p1, q1):
p = p1
q = q1
# тут есть переменная p
while (p != 0) and (q != 0):
if p > q:
p = p % q
else:
q = q % p
p = p + q
# и вот тут есть переменная p
return p
# и даже тут переменная p ещё есть
# а вот тут её уже нет, поскольку тело функции закончилось
a = int(input('...'))
b = int(input('...'))
fr(a, b) # функция создала переменную p ВНУТРИ СЕБЯ, но снаружи никакой p нет!
# переменную p всё ещё не создали!
a = a // p
b = b // p
Как это должно работать:
def fr(p1, q1):
p = p1
q = q1
while (p != 0) and (q != 0):
if p > q:
p = p % q
else:
q = q % p
p = p + q
return p
a = int(input('...'))
b = int(input('...'))
p = fr(a, b) # вот тут мы создаём эту переменную p и получаем в неё значение p из функции
# теперь p есть :) её можно использовать
a = a // p
b = b // p
Ну и, как указал автор другого ответа, у вас явно проблема с отступом около return, поскольку такой отступ полностью лишает смысла существование цикла - на первой же итерации функция закончится.
Впрочем, это уже ошибка логическая, и с вашим исключением она не связана.
Ах да, благодаря всё тому же понятию области видимости вы можете называть формальные параметры сразу нужными именами, а не присваивать их позже:
def fr(p, q):
while (p != 0) and (q != 0):
if p > q:
p = p % q
else:
q = q % p
p = p + q
return p