Я очень запутался и не знаю, как решить следующую проблему.
Представьте, что я написал очень длинный код и хочу преобразовать этот длинный код в функцию, предотвращающую повторение. Проблема в том, что мне нужно указать «знак добавления» (+) и «знак вычитания» (-) в качестве входных параметров функции. Я имею в виду, что у меня очень длинный код, в котором мне нужно каждый раз менять два знака сложения и вычитания и ничего больше, и, наконец, получить результат в соответствии с изменением этих двух операторов (эти два оператора на самом деле являются моими переменными!)
Как вы знаете, повторение этой длинной функции для четырех различных состояний изменения «знаков сложения и вычитания» делает мой код еще длиннее и длиннее. Я хотел бы знать, есть ли способ определить только одну функцию, которая дает эти пары операторов сложения и вычитания в качестве входных данных и дает мне выходные данные для этих четырех разных условий? Я привел простой пример, чтобы прояснить вопрос:
Представьте, что у меня есть четыре одинаковых цикла 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. Есть ли другой способ решить эту проблему? У кого-нибудь есть идеи?






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