#python
Вопрос:
У меня есть функция Python, которая возвращает значение.
def population_gen(P)
...
return fittest
Теперь мне нужно написать фрагмент кода, который сравнивает «наиболее подходящий» с последней итерацией вызова функции population_gen(P), которая возвращает «наиболее подходящий» и останавливается, когда текущий наиболее подходящий становится равным предыдущему.
То, что я попробовал, заключается в следующем:
def population_gen(P)
...
return fittest
gen_count = 0
max_gen_count = 10
while gen_count <= max_gen_count:
population_gen(Pop)
gen_count = 1
Я могу запустить это любое количество раз (в данном случае 11) и убедиться, что мой код работает. Но я не хочу, чтобы он запускался 11 раз, скорее продолжайте цикл while до тех пор, пока не будет выполнено вышеупомянутое условие. Я также хотел упомянуть, что эта функция генерирует популяцию из заданной начальной популяции. Затем я снова загружаю эту функцию с помощью популяции, которую она генерирует, и успешно поддерживаю ее работу столько раз, сколько захочу. Но я не могу реализовать условие сравнения «наиболее подходящего» значения.
Пожалуйста, помогите. Заранее спасибо!
Комментарии:
1. В принципе, вы хотите вызывать функцию
population_gen
до тех пор, пока два последних вызова не вернут одно и то же значение. Выходныеpopulation_gen
данные становятся входными данными на следующей итерации. Это правильно?
Ответ №1:
Я предполагаю, что вы хотите продолжать повторять цикл, если текущее и последнее значения возвращаемой функции не равны.
Теория: Вы можете объявить две переменные, одну внутри цикла и одну снаружи. Работа внутреннего заключается в том, чтобы получить значение функции, возвращаемое функцией, а внешний будет использоваться для проверки предыдущего значения, чтобы оно не потерялось (я имею в виду предыдущее значение здесь).
Теперь, вы знаете, как это просто, давайте реализуем это. Во-первых, для примера я бы создал функцию, которая возвращает случайное значение из списка.
import random # Importing random module for help in choosing random value
def foo():
_list = [1, 2, 3]
return random.choice(_list)
Теперь у нас есть наш пример функции, давайте создадим цикл для проверки. ПРИМЕЧАНИЕ: Можно использовать тип цикла, который вы используете, но более эффективным является использование for
цикла, так как вы можете использовать функцию диапазона, как это предлагает @Jab.
Пришло время объявить переменные и цикл:
var = None # Outside the loop, will be used as a container for previous returned value
for _ in range(1, 12): # range(min. value, max. value [not included])
a = foo() # Creating a variable 'a', that would be holding current returned value from the function
if var is not None and a == var: # For first iteration, it would be None but the value will be assigned to 'var' in for it's next iteration and checking it whether the prev. and current values are equal or not
break # Break the loop
var = a # Assigns 'var' the value if the loop is still running
Теперь приведенный выше пример можно использовать в качестве ответа. Но что, если вы захотите это проверить? Итак, ниже приведен код, приведенный с примером для целей отладки:
import random
def func():
l = [1, 2, 3]
val = random.choice(l)
print(val) # Printing the value, for debugging purposes
return val
var = None
for x in range(1, 12):
a = func()
if var is not None and a == var:
print(f'nSame values after {x} iterations') # It will show, after how many iterations the loop stopped
break
var = a
Теперь я запустил приведенный выше код 3 раза, ниже приведен результат:
OUTPUT:
>>> 3
>>> 3
>>>
>>> Same values after 2 iterations
>>> 2
>>> 3
>>> 2
>>> 2
>>>
>>> Same values after 4 iterations
>>> 2
>>> 2
>>>
>>> Same values after 2 iterations
Я надеюсь, вы поняли концепцию.
Комментарии:
1. Это слишком много слов для чего-то тривиально простого, тебе не кажется?
2. @AbhijitSarkar Без обид, но я думаю, что вы путаетесь между тем, чтобы правильно объяснить кому-то и показать, как это легко. Я хотел убедиться, что спрашивающий все понял, иначе я бы просто добавил код и несколько комментариев, и ответ был бы окончен. Что касается демонстрации того, насколько это просто, то это так же просто, как три строки из раздела Теории. Мир.
3. @8D Мастера Во-первых, большое вам спасибо за замечательное объяснение. Это действительно помогло мне понять концепцию. Я не из области программирования, но мне нужно много заниматься python для докторских исследований в области электротехники! В основном я занимаюсь численным анализом. Некоторые люди, по-видимому, этого не понимают и отговаривают других, которые пытаются объяснить!! Еще раз спасибо. Однако я хотел бы отметить, что мне нужно использовать только цикл while. Я понимаю, что могу поместить действительно большое число в диапазон func, но все же пока цикл лучше.
Ответ №2:
Используйте новую переменную по умолчанию, установленную в качестве максимальной в аргументах. Нравится — def population_gen(P, prev_fit = 99999): if prev_fit < population_gen(P): return prev_fit
Ответ №3:
Предполагая, что вы хотите вызывать функцию population_gen
до тех пор, пока два последних вызова не вернут одно и то же значение. Выходные population_gen
данные становятся входными данными на следующей итерации.
import random
def population(limit: int) -> int:
return random.randint(1, limit)
prev = None
cur = population(10)
while prev != cur:
prev = cur
cur = population(prev)
print(prev)