Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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_Python 3.x_Pyqt_Pyqt4 - Fatal编程技术网

Python 调用一个函数,然后反转同一函数的参数并再次调用

Python 调用一个函数,然后反转同一函数的参数并再次调用,python,python-3.x,pyqt,pyqt4,Python,Python 3.x,Pyqt,Pyqt4,我想知道这在一个函数中是否可行: def test(x, y): print(x, "+", y) 当我调用test时,我想调用test(1,2),然后紧接着调用test(2,1) 这是QPushButton.clicked.connect的内部,因此它需要是可调用的。 我试着列一张理解的清单 [x for x in [test(1, 2), test(2, 1)]] 我得到了一个奇怪的输出,我无法解释 1 + 2 2 + 1 [None, None] 我能做点什么吗?那会

我想知道这在一个函数中是否可行:

def test(x, y):
    print(x, "+", y)
当我调用test时,我想调用test(1,2),然后紧接着调用test(2,1)

这是QPushButton.clicked.connect的内部,因此它需要是可调用的。 我试着列一张理解的清单

[x for x in [test(1, 2), test(2, 1)]]
我得到了一个奇怪的输出,我无法解释

1  +  2
2  +  1
[None, None]
我能做点什么吗?那会是非音速的吗

现在我只做了一个辅助函数,但我觉得这有点难看

def press_test(x,y):
    test(x,y)
    test(y,x)
编辑我应该添加我有多个测试(y,x)应该遵循的函数:

def test2(x, y):
    print(x, y)

def press_test2(x, y):
    test2(x,y)
    test(y,x)

一般做法是:

[yourMethod(*arg) for arg in itertools.permutations(args)]

在这种情况下,
args
表示
(1,2)
。当然,如果您不需要这些是一个列表,只需使用相同的方法而不需要列表理解…

您可能希望将*args与itertools一起使用:

from itertools import permutations

def press_test(*args):
    all_args = permutations(args)
    for arglist in all_args:
        test(*arglist)
顺便说一句,你真的不想在这里使用列表理解。。。像这样的列表

[f(x) for x in list]

仅当f(x)返回值时才真正有用。如果f(x)只是想做点什么,for循环(通常)会更快。因为f(x)只“做某事”而不返回值,所以您将得到一个列表,其中包含
None
,正如您所注意到的,您将要扔掉它。您可以使用
timeit
来验证方法的相对速度。

在PyQt中,当连接这样的信号时,一个常见的习惯用法是使用带有默认参数的
lambda

    self.button.clicked[()].connect(
        lambda x=1, y=2: (self.test(x, y), self.test(y, x)))
这里有几件事需要注意。首先,必须使用
[()]
选择器,否则单击
将默认发送一个布尔参数,这将阻塞lambda的第一个参数。其次,函数调用必须进入元组(或等效元组),因为
lambda
只能包含一个表达式(省略括号将导致错误)

更新

有些信号有几个重载,它们发送不同的值

例如,信号可以发送int或button。要选择特定重载,您可以执行以下操作之一:

    buttongroup.buttonClicked[int].connect(handler)
或:

在PyQt中,您还可以省略选择器,在这种情况下,将使用默认重载(这恰好是上例中的第二个重载)

但是,有些信号(如QPushButton.clicked和QAction.triggered)具有默认参数值。也就是说,C++签名看起来像这样:

    void clicked (bool = 0)
在PyQt中,这实际上意味着有两个重载:一个总是发送布尔值,另一个不发送。默认重载是这样做的。因此,为了显式选择不需要的元组,必须传入一个空元组,即:

    button.clicked[()].connect(handler)

我试图在没有“按下测试”功能的情况下完成它。这正是我想要的。“你能解释一下[()]吗?或者给我一些东西让我看看这到底是怎么回事吗?”法勒。我用解释更新了我的答案。
    button.clicked[()].connect(handler)