Python: как включить в этот цикл оператор If else, когда задействована лямбда?

У меня есть много функций, которые иногда должны зацикливаться, иногда не должны. Я хочу встроить опцию, чтобы он работал в цикле. Вот мой код. Вы можете видеть, что каждая функция имеет оператор if... else. Есть ли способ поместить оператор if... else в метод loop? Значит, мне не нужно повторять эти строки для каждой функции?

import inspect

def test1(b,shouldloop=False):
    if not shouldloop:
        a = b + 1
        print a

    else:
        loop(lambda z: test1(z) , inspect.currentframe().f_code.co_name)

def test2(d,e,shouldloop=False):
    if not shouldloop:
        a = d * e
        print a

    else:
        loop(lambda z: test2(z,e) , inspect.currentframe().f_code.co_name)

def test3(g,h,i,shouldloop=False):
    if not shouldloop:
        a =  g **2 - h + i
        print a

    else:
        loop(lambda z: test3(z,h,i) , inspect.currentframe().f_code.co_name)

def loop(function,c):
    x = [1,2,3,4]
    for i in x:
        function (i)
        print c

поэтому иногда мне просто нужна функция test1, чтобы не зацикливаться так ...

test1(2)

вывод:

3

и иногда мне нужно, чтобы он так зацикливался ...

test1('',True)

вывод:

2
test1
3
test1
4
test1
5
test1

В других тестовых функциях больше переменных. Но я буду использовать их так же.

Я не понимаю вашу логику здесь, что должен выводить этот код? Кроме того, вместо использования 'yes' для вашего shouldloop вы должны просто использовать логическое значение

Sayse 23.11.2018 16:54

Я согласен с @Sayse, это довольно сложно. Можете ли вы дать более четкое объяснение своего кода?

FMarazzi 23.11.2018 16:58

Поскольку вы выполняете 6 отдельных операций в 3 наборах блоков if... else..., вероятно, лучше всего оставить это так. Я боюсь, что любые другие попытки передать набор блока if... else..., который выполняет разные вещи в разные функции, будут просто беспорядком.

r.ook 23.11.2018 17:03
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете переписать loop как декоратор, чтобы добавить его вокруг произвольных функций:

import functools

def loopable(fnc):  # decorator, takes any function
    @functools.wraps(fnc)
    def fncloop(*args, shouldloop=False, **kwargs):  # take loop switch and arguments for the actual function
        if shouldloop:  # loop logic
            x = [1,2,3,4]
            for i in x:
                fnc(i, *args[1:], **kwargs)  # replace first argument with i
                print(fnc.__name__)
        else:
           fnc(*args, **kwargs)  # call function unconditionally
    return fncloop  # return wrapped function

Применяйте его при определении функции, которая просто содержит тело цикла:

@loopable
def test1(b):
    a = b + 1
    print(a)

Любая декорированная функция теперь поддерживает shouldloop:

>>> test1(2)
3
>>> test1(2, shouldloop=True)
2
test1
3
test1
4
test1
5
test1

Для Python 2 вы должны явно получить аргумент из kwargs:

import functools

def loopable(fnc):
    @functools.wraps(fnc)
    def fncloop(*args, **kwargs):
        if kwargs.pop('shouldloop', False):
            x = [1,2,3,4]
            for i in x:
                fnc(i, *args[1:], **kwargs)  # replace first argument with i
                print(fnc.__name__)
        else:
           fnc(*args, **kwargs)
    return fncloop

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