Использовать вывод функции как ввод новой итерации функции - PullRequest
0 голосов
/ 29 октября 2018

У меня есть функция, которую можно упростить до:

def do_stuff(a,b,c):
    a = a*2
    b = b*3
    c = c
    return a, b, c

При заданных начальных условиях: a = 2, b = 3, c = 1

Я хочу перебрать функцию, пока а не станет равным 64

Я пытаюсь использовать цикл while, что-то вроде

while True:
   new_a, new_b, new_c = do_stuff(a, b, c)

   ... Here is where I am confused ...

   if new_a = 64:
       return False

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

Любая помощь приветствуется!

Ответы [ 4 ]

0 голосов
/ 29 октября 2018

Если вы ищете простое итеративное решение, попробуйте это.

def do_stuff(a,b,c):
    a = a*2
    b = b*3
    c = c
    return a,b,c

a,b,c = (2,3,1)
while a != 64:
    a,b,c = do_stuff(a,b,c)
0 голосов
/ 29 октября 2018

Вы можете использовать рекурсивную функцию с оператором if:

def do_stuff(a, b, c):
    if a == 64:
        return a, b, c
    return do_stuff(a*2, b*3, c)

a, b, c = do_stuff(2, 3, 1)

print((a, b, c))

(64, 729, 1)

См. Основы рекурсии в Python , чтобы понять, как работает рекурсия.

0 голосов
/ 29 октября 2018

Ответ на конкретный вопрос

Сделайте вашу функцию генератором, примените фильтр к выражению генератора и вызовите next.

>>> def do_stuff(a,b,c):
...:    while True:
...:        a = a*2
...:        b = b*3
...:        c = c
...:        yield a, b, c
...:        
>>> next((a, b, c) for a, b, c in do_stuff(2, 3, 1) if a == 64)
>>> (64, 729, 1)

Ответ на более общий вопрос в названии для будущих читателей

Как использовать вывод функции в качестве ввода новой итерации другой функции?

Рассмотрим сопрограмму! Вот очень простой пример.

>>> def computation(x):
...:    return x%2
>>> 
>>> def consumer():
...:    while True:
...:        got = yield 
...:        print('consumer got value {}'.format(got))
...:        # do something awesome with got
...:        
>>> 
>>> cons = consumer()
>>> next(cons) # prime coroutine
>>> 
>>> for i in range(3):
...:    cons.send(computation(i))
consumer got value 0
consumer got value 1
consumer got value 0

Если вы хотите узнать больше о сопрограммах, взгляните на эту отличную презентацию Дэвида Бизли.

0 голосов
/ 29 октября 2018
def do_stuff(a,b,c):
        global new_a
        global new_b
        global new_c
        new_a = a*2
        new_b = b*3
        new_c = c
        print(new_a,new_b,new_c)
        return(new_a,new_b,new_c) 

new_a = 2
new_b = 3
new_c = 1

while new_a != 64:
      do_stuff(new_a,new_b,new_c)
      if new_a == 64:
              break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...