用python编写以加减运算符作为参数的函数
我真的很困惑,我不知道如何解决下面的问题 假设我写了一段很长的代码,我想把这段长代码转换成一个函数来防止重复。问题是我需要将“加号”(+)和“减号”()作为函数输入。我的意思是,我有一个很长的代码,每次我都需要更改两个加减符号,仅此而已,最后根据更改这两个运算符得到输出(这两个运算符实际上是我的变量!) 正如您所知,在四种不同的状态下重复这个长函数来更改“加减符号”,会使我的代码变得越来越长。我想知道是否有任何方法可以定义一个函数,将这对加法和减法运算符作为输入,并为这四种不同的条件提供输出? 我举了一个简单的例子来澄清这个问题: 假设我有四个类似的“for循环”,只是“减号”和“加号”不同:用python编写以加减运算符作为参数的函数,python,function,arguments,Python,Function,Arguments,我真的很困惑,我不知道如何解决下面的问题 假设我写了一段很长的代码,我想把这段长代码转换成一个函数来防止重复。问题是我需要将“加号”(+)和“减号”()作为函数输入。我的意思是,我有一个很长的代码,每次我都需要更改两个加减符号,仅此而已,最后根据更改这两个运算符得到输出(这两个运算符实际上是我的变量!) 正如您所知,在四种不同的状态下重复这个长函数来更改“加减符号”,会使我的代码变得越来越长。我想知道是否有任何方法可以定义一个函数,将这对加法和减法运算符作为输入,并为这四种不同的条件提供输出?
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和减法_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)
您也可以直接传入lambda:
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
将lambda的结果指定给名称是违反Python风格的约定的。这违背了lambda函数的唯一目的,也就是它们是匿名的。你是对的,我没有思考。编辑以显示我的意思:)