Написание функции на Python с операторами сложения и вычитания в качестве аргументов

Я очень запутался и не знаю, как решить следующую проблему.

Представьте, что я написал очень длинный код и хочу преобразовать этот длинный код в функцию, предотвращающую повторение. Проблема в том, что мне нужно указать «знак добавления» (+) и «знак вычитания» (-) в качестве входных параметров функции. Я имею в виду, что у меня очень длинный код, в котором мне нужно каждый раз менять два знака сложения и вычитания и ничего больше, и, наконец, получить результат в соответствии с изменением этих двух операторов (эти два оператора на самом деле являются моими переменными!)

Как вы знаете, повторение этой длинной функции для четырех различных состояний изменения «знаков сложения и вычитания» делает мой код еще длиннее и длиннее. Я хотел бы знать, есть ли способ определить только одну функцию, которая дает эти пары операторов сложения и вычитания в качестве входных данных и дает мне выходные данные для этих четырех разных условий? Я привел простой пример, чтобы прояснить вопрос:

Представьте, что у меня есть четыре одинаковых цикла for, но с разными знаками «минус» и «плюс»:

edges=set()
a=60; b=40
for i in range(0,300):
    a+=1; b+=1
    if a!=0 and b!=0:
        edges.add((a, b))

a=60; b=40
for i in range(0,300):
    a-=1; b-=1
    if a>=0 and b>=0:
        edges.add((a, b))

a=60; b=40
for i in range(0,300):
    a+=1; b-=1
    if a>=0 and b>=0:
        edges.add((a, b))

a=60; b=40
for i in range(0,300):
    a-=1; b+=1
    if a>=0 and b>=0:
        edges.add((a, b))
print(edges)

Как видите, все эти четыре цикла for одинаковы, за исключением знаков плюс и минус. Я хочу написать только одну функцию вместо этих четырех повторяющихся циклов for. Есть ли другой способ решить эту проблему? У кого-нибудь есть идеи?

Почему в 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
0
2 269
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Напишите функцию для приема приращений в качестве параметров.

def add_edges(aincr, bincr):
    for i in range(0,300):
        a += aincr; b += bincr
        if a!=0 and b!=0:
            edges.add((a, b))

Затем передайте соответствующие приращения при вызове:

add_edges(1, 1)
add_edges(-1, -1)
add_edges(1, -1)
add_edges(-1, 1)

Нет необходимости передавать понятие «сложение» или «вычитание», поскольку вы можете делать это численно. Вы мог (как показывают другие ответы), но старайтесь не усложнять вещи.

import operator
ops = { "+": operator.add, "-": operator.sub } # etc.


def doMath(a,b,s):


    print(ops[s](a,b))


doMath(5,3,'-')

Использовал Превратить строку в оператор как ссылку

Вы можете создать add_1 и minus_1 как функции и передать их как аргументы в другую функцию:

def add_1(x):
    return x + 1

def minus_1(x):
    return x - 1

def do_op(a, b, f1, f2):
    for i in range(0,300):
        a, b = f1(a), f2(b)
        if a>=0 and b>=0:
            edges.add((a, b))

do_op(60, 40, add_1, add_1)
do_op(60, 40, minus_1, minus_1)
do_op(60, 40, add_1, minus_1)
do_op(60, 40, minus_1, add_1)
print(edges)

Вы также можете напрямую передавать лямбды:

do_op(60, 40, lambda x:  x + 1, lambda x:  x + 1)
do_op(60, 40, lambda x:  x - 1, lambda x:  x + 1)
do_op(60, 40, lambda x:  x + 1, lambda x:  x - 1)
do_op(60, 40, lambda x:  x - 1, lambda x:  x - 1)

Назначать результат лямбда-выражения имени противоречит соглашениям в стиле Python. Это противоречит единственной цели лямбда-функции: они анонимны.

juanpa.arrivillaga 19.04.2018 22:05

Я, ты прав - не думал. Отредактировано, чтобы показать, что я имел в виду :)

Pavel Savine 19.04.2018 22:17

Вычитание аналогично добавлению отрицательного значения, поэтому:

def operation(first_val, second_val, add=True):
    second_val = second_val if add else -second_val
    return first_val + second_val

или используя обозначение + =:

def increment_decrement(value, add=True):
    step = 1 if add else -1
    value += 1
    return value

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