Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python编写以加减运算符作为参数的函数_Python_Function_Arguments - Fatal编程技术网

用python编写以加减运算符作为参数的函数

用python编写以加减运算符作为参数的函数,python,function,arguments,Python,Function,Arguments,我真的很困惑,我不知道如何解决下面的问题 假设我写了一段很长的代码,我想把这段长代码转换成一个函数来防止重复。问题是我需要将“加号”(+)和“减号”()作为函数输入。我的意思是,我有一个很长的代码,每次我都需要更改两个加减符号,仅此而已,最后根据更改这两个运算符得到输出(这两个运算符实际上是我的变量!) 正如您所知,在四种不同的状态下重复这个长函数来更改“加减符号”,会使我的代码变得越来越长。我想知道是否有任何方法可以定义一个函数,将这对加法和减法运算符作为输入,并为这四种不同的条件提供输出?

我真的很困惑,我不知道如何解决下面的问题

假设我写了一段很长的代码,我想把这段长代码转换成一个函数来防止重复。问题是我需要将“加号”(+)和“减号”()作为函数输入。我的意思是,我有一个很长的代码,每次我都需要更改两个加减符号,仅此而已,最后根据更改这两个运算符得到输出(这两个运算符实际上是我的变量!)

正如您所知,在四种不同的状态下重复这个长函数来更改“加减符号”,会使我的代码变得越来越长。我想知道是否有任何方法可以定义一个函数,将这对加法和减法运算符作为输入,并为这四种不同的条件提供输出? 我举了一个简单的例子来澄清这个问题:

假设我有四个类似的“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和减法_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函数的唯一目的,也就是它们是匿名的。你是对的,我没有思考。编辑以显示我的意思:)