#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.