Итерация для последнего значения итерации в Python

#python

Вопрос:

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

Моя функция определяется следующим образом:

 def Deulab(c, yh1, a, b):
     Deulab = c- (EULab(c, yh1, a, b)-1)*0.3
     return (Deulab,yh1, a,b)
 

Выход есть

 Deulab(1.01, 1, 4, 2)
0.9964391705626454
 

Теперь я хочу выполнить итерацию, сохраняя фиксированные значения yh1 ,a, b, и начать с c0=1, а затем рекурсивно выполнить итерацию для c.

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

1. Приведение примера поможет.

2. вы читали о рекурсии — realpython.com/python-thinking-recursively

Ответ №1:

Самый простой способ сделать это-определить взаимодействующий генератор:

 def iterates(f,x):
    while True:
        yield x
        x = f(x)

#test:
def f(x):
    return 3.2*x*(1-x)

orbit = iterates(f,0.1)

for _ in range(10):
    print(next(orbit))
 

Выход:

 0.1
0.2880000000000001
0.6561792000000002
0.7219457839595519
0.6423682207442558
0.7351401271107676
0.6230691859914625
0.7515327214700762
0.5975401280955426
0.7695549549155365
 

Вы можете использовать генератор до тех пор, пока не будет выполнен какой-либо критерий остановки. Например, в итерации с фиксированной точкой вы можете повторять до тех пор, пока две последовательные итерации не окажутся в пределах некоторого допуска друг от друга. Сам генератор будет работать вечно, поэтому при его использовании вам нужно убедиться, что ваш код не переходит в бесконечный цикл (например, не просто предполагайте сходимость).

Ответ №2:

Это звучит так, как будто вы ищете рекурсию.

Вот основной пример

 def f(x):
    x  = 1
    if x < 10:
        x = f(x)
    return x

print (f(4))
 

В этом примере функция вызывает саму себя до тех пор, пока не будет удовлетворен какой-либо критерий.

Ответ №3:

CodeCupboard предоставил пример, который должен соответствовать вашим потребностям.

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

 class classA:  

    #Declare initial values for class variables here
    fooResult = 0  #Say, taking 0 as an initial value, not unreasonable!

    def myFoo1(x):
        y = 2*x   fooResult  #A simple example function

        classA.fooResult = y  #This line is updating that class variable, so next time you come in, you'll be using it as part of calc'ing y

        return y  #and this will return the calculation back up to wherever you called it from


#Example call
rtn = classA.myFoo1(5)
#rtn1 will be 10, as this is the first call to the function, so the class variable had initial state of 0

#Example call2
rtn2 = classA.myFoo1(3)
#rtn2 will be 16, as the class variable had a state of 10 when you called classA.myFoo1()
 

Поэтому, если вы работали с набором данных, в котором вы не знали, каким будет второй вызов (т. Е. 3 в вызове 2 выше было неизвестно), вы можете вернуться к функции, не беспокоясь об обработке хранения данных в коде верхнего уровня. Полезно для нишевого случая.

Конечно, вы могли бы использовать его в соответствии с:

 list1 = [1,2,3,4,5]
for i in list1:
    rtn = classA.myFoo1(i)
 

Что даст вам окончательное значение rtn 30 при выходе из цикла for.