Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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 - Fatal编程技术网

Python 将布尔条件作为参数传递

Python 将布尔条件作为参数传递,python,Python,我有这些 def MsgBox1_YesChosen(sender,e): if e.Key != "A": function0() else: function1() function2() function3() def MsgBox1_NoChosen(sender,e): if e.Key == "A": function0() else: function1() f

我有这些

def MsgBox1_YesChosen(sender,e):
    if e.Key != "A": function0() 
    else: 
        function1()
        function2()
        function3()

def MsgBox1_NoChosen(sender,e):
    if e.Key == "A": function0() 
    else: 
        function1()
        function2()
        function3()

两个def可以合并在一起吗?它们之间唯一的区别是“==”,“!=”

我假设这是一些基于事件的代码,在这种情况下,您不能直接修改事件所采用的参数数量。但是,您仍然有两种可能性:

1) 您可以检查
e
参数,以查找发生的事件类型(单击“是”或“否”按钮)。检查您正在使用的任何库的文档

2) 您可以添加第三个参数,然后在绑定事件时使用lambdas提供第三个参数(示例代码假定为Tkinter):

def MsgBox1_已选择(发件人,e,是_已选择):
如果(e.Key!=“A”)==选择了是:function0()
其他:
职能1()
职能2()
职能3()
msg_box.bind(“”,lambda s,e:MsgBox1_选择(s,e,True))
消息框绑定(“”,lambda s,e:MsgBox1_选择(s,e,False))

是的,以一种非常普遍的方式-你只需要了解以下事实:(1)函数是一级值,(2)运算符只是经过特殊语法处理的函数。例如:

def make_handler(predicate)
    def handler(sender, e):
        if predicate(e.Key, 'A'):
            function0()
        else:
            function1()
            function2()
            function3()
    return handler

使用like(导入后-您可以使用lambda执行此操作,但对于运算符,
运算符
模块是更干净的解决方案)
MsgBox1\u YesChosen=make\u handler(operator.ne)
(这是一个可怕的名称,顺便说一句)。

将comparison运算符作为参数传递。 您不仅可以传递运算符,还可以传递任何其他函数,但“相等”和“不相等”以及所有其他比较运算符或算术运算符都已在“运算符”模块中定义为正确的函数-您的代码可以是:

import operator

def MsgBox1_Action(sender,e, comparisson):
    if comparisson(e.Key, "A"): function0() 
    else: 
        function1()
        function2()
        function3()
MsgBox1_YesChosen = lambda sender, e: MsgBox1_Action(sender, e, operator.eq)
MsgBox1_NoChosen = lambda sender, e: MsgBox1_Action(sender, e, operator.ne)

这就是我要找的:)如果
==
的谓词(e.Key,A):被改为
If predicate():
,你可以使用类似
f1=make\u处理器(lambda:e.Key==“A”)的东西
f2=make_处理程序(lambda:e.Key!=“A”)
--无需乱动
操作符
模块。@martineau:no.
e
在创建处理程序时未定义,处理程序的每次调用都不同!在这种情况下,lambda e:e.Key!=“A”工作(仍然不需要使用
操作员
模块)?@martineau:你把我的答案看完了吗?是的,可以将
操作符.ne
替换为
lambda x:e!='a'
。我已经写过了。但是
操作符
模块的唯一目的是替换这种lambda(从我收集的信息来看,它被认为是更惯用的)。是的,我读过它,你写的是“导入操作符后-你可以用lambda来做这件事”。其次,IMHO使用lambdas比使用
操作符
模块更为惯用。不管怎样,这两种方法中的任何一种都比我第一次投票时意识到的要简单得多。
def make_handler(predicate)
    def handler(sender, e):
        if predicate(e.Key, 'A'):
            function0()
        else:
            function1()
            function2()
            function3()
    return handler
import operator

def MsgBox1_Action(sender,e, comparisson):
    if comparisson(e.Key, "A"): function0() 
    else: 
        function1()
        function2()
        function3()
MsgBox1_YesChosen = lambda sender, e: MsgBox1_Action(sender, e, operator.eq)
MsgBox1_NoChosen = lambda sender, e: MsgBox1_Action(sender, e, operator.ne)