#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")