Сделать возврат родительской функции - супер-возврат?

есть проверка, которую мне нужно выполнять после каждого последующего шага в функции, поэтому я хотел определить этот шаг как функцию внутри функции.

>>> def gs(a,b):
...   def ry():
...     if a==b:
...       return a
...
...   ry()
...
...   a += 1
...   ry()
...
...   b*=2
...   ry()
... 
>>> gs(1,2) # should return 2
>>> gs(1,1) # should return 1
>>> gs(5,3) # should return 6
>>> gs(2,3) # should return 3

так как мне заставить gs возвращать "a" изнутри ry? Я думал использовать super, но думаю, что это только для классов.

Спасибо

Произошла небольшая путаница ... Я хочу вернуть только если a == b. если a! = b, то я пока не хочу, чтобы gs что-либо возвращала.

редактировать: Теперь я думаю, что декораторы может быть лучшим решением.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
3 714
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ты имеешь ввиду?

def gs(a,b):
    def ry():
        if a==b:
            return a
    return ry()

вы возвращаете ry () явно, а не просто вызываете его.

There's been a little confusion... I only want to return a if a==b. if a!=b, then I don't want gs to return anything yet.

Тогда проверьте это:

def gs(a,b):
    def ry():
        if a==b:
            return a
    ret = ry()
    if ret: return ret
    # do other stuff

Когда вы упоминаете «шаги» в функции, кажется, что вам нужен генератор:

def gs(a,b):
  def ry():
    if a==b:
      yield a
  # If a != b, ry does not "generate" any output
  for i in ry():
    yield i
  # Continue doing stuff...
  yield 'some other value'
  # Do more stuff.
  yield 'yet another value'

(Генераторы теперь также могут действовать как сопрограммы, начиная с Python 2.5, используя новый синтаксис yield.)

это не совсем ответ на мой вопрос, НО он решает проблему, которую я пытался решить :)

Jiaaro 14.01.2009 06:06

@All: вы можете использовать yield только во внутренней функции, если хотите, чтобы внешняя функция оставалась нормальной функцией, и вам не приходилось перебирать результат.

Mike Boers 18.02.2009 23:36
Ответ принят как подходящий

Это должно позволить вам продолжать проверять состояние и возвращаться из внешней функции, если a и b когда-либо оказываются одинаковыми:

def gs(a,b):
    class SameEvent(Exception):
        pass
    def ry():
        if a==b:
            raise SameEvent(a)
    try:
        # Do stuff here, and call ry whenever you want to return if they are the same.
        ry()

        # It will now return 3.
        a = b = 3
        ry()

    except SameEvent as e:
        return e.args[0]

это немного хакерское, но мне нравится! очень умный :)

Jiaaro 19.02.2009 17:04

У меня была аналогичная проблема, но я решил ее, просто изменив порядок звонка.

def ry ()
    if a==b 
        gs()

в некоторых языках, таких как javascript, вы даже можете передать функцию как переменную в функции:

function gs(a, b, callback) {
   if (a==b) callback();
}

gs(a, b, ry);

Другие вопросы по теме