PYTHON3 -Могу ли я хранить переменные, созданные в функции вне функции

#python #python-3.x #math

Вопрос:

 import random, secrets  e = 7 M = 11  # Extended euclidean algorithm function def extended_euclidean(a, b):  r, r1, s, s1, t, t1 = b, a, 0, 1, 1, 0  while r != 0:  q = (r1 // r)  (r1, r) = (r, r1 - q * r)  (s1, s) = (s, s1 - q * s)  (t1, t) = (t, t1 - q * t)  d = r1  x = s1  y = t1   if d == 1:  return True, d, x, y  else:  return False  gcd, d, y = (extended_euclidean(e,M)) print("GCD= ", str(gcd), "d = ", str(d), "y= ", y)  

как мне получить переменные d,x и y из моей функции, чтобы их можно было использовать вне функции? я получаю ошибку «строка 25, в gcd, d, y = (extended_euclidean(e,M)) Ошибка значения: слишком много значений для распаковки (ожидается 3)» когда я использовал gcd,d,y=(extended_euclidean(e,M))

Комментарии:

1. вы возвращаете 4 значения, но присваиваете только 3

2. @Mahrkeenerh ах, значит, мне просто нужно присвоить переменной значение True? Теперь , когда я думаю об этом, это имеет смысл, спасибо

3. да, это сработает (но только если d == 1 )

4. Ваша функция возвращает либо квадруплет True, d, x, y , либо одно логическое False значение . Это затрудняет его использование: вызывающий абонент не знает, собираетесь ли вы возвращать четверочку или логическое значение. По крайней мере, я предлагаю вернуть четверку False, None, None, None в else ветке, чтобы вы всегда возвращали четверку.

5. Когда есть несколько значений, которые могут быть полезны для доступа вне функции, но не ясно, какие из них все время лучше (и, следовательно, какие следует возвращать), вы можете сделать функцию __init__ методом своего собственного класса и указать значения, которые полезны для доступа к атрибутам объекта.

Ответ №1:

Поскольку неясно, что должно быть возвращено, я бы рекомендовал создать объект, который имеет значения, которые вы хотите в качестве атрибутов. Что-то вроде этого (хотя я не уверен в том, что такое gcd и d, и это может потребовать корректировки):

 class ExtendedEuclidean:   def __init__(self, a, b):  r, r1, s, s1, t, t1 = b, a, 0, 1, 1, 0  while r != 0:  q = (r1 // r)  (r1, r) = (r, r1 - q * r)  (s1, s) = (s, s1 - q * s)  (t1, t) = (t, t1 - q * t)  if r1 == 1:  self.ok = True  self.gcd = r1  self.x = s1  self.y = t1  else:  self.ok = False  self.gcd = None  self.x = None  self.y = None   ee = ExtendedEuclidean(7, 11)  if ee.ok:  print("GCD= ", str(ee.gcd), "x = ", str(ee.x), "y= ", ee.y) else:  print("not ok")