Python: как мне вставить оператор If else в этот цикл, когда используется лямбда? - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть много функций, которые иногда должны повторяться, а иногда нет.Я хочу встроить опцию, чтобы сказать это зациклить.Вот мой кодВы можете видеть, что каждая функция имеет оператор 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

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

1 Ответ

0 голосов
/ 23 ноября 2018

Вы можете переписать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...