Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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 如何使用LifoQueue进行函数调用?_Python_Stack_Python 3.6 - Fatal编程技术网

Python 如何使用LifoQueue进行函数调用?

Python 如何使用LifoQueue进行函数调用?,python,stack,python-3.6,Python,Stack,Python 3.6,我正在做一个数独解算器,想让指令一次执行一个,采用后进先出的结构,以类似大多数人(或至少我)玩数独的方式 我的解算器课程的相关部分- class SudokuSolver(): possible_answers = None def __init__(self, board): self.board = board self.instruction_stack = LifoQueue() ... def work_on_

我正在做一个数独解算器,想让指令一次执行一个,采用后进先出的结构,以类似大多数人(或至少我)玩数独的方式

我的解算器课程的相关部分-

class SudokuSolver():
    possible_answers = None

    def __init__(self, board):
        self.board = board
        self.instruction_stack = LifoQueue()
        ...

    def work_on_group(self, group_num):
        print(f"working on group {group_num}")
    
    def work_on_row(self, row):
        print(f"working on row {row}")

    def work_on_column(self, column):
        print(f"working on column {column}")
    
    def do_next_step(self):
        if self.instruction_stack.empty():
            self.instruction_stack.put(self.work_on_group(9))
            self.instruction_stack.put(self.work_on_group(8))
            ...
            self.instruction_stack.put(self.work_on_group(2))
            self.instruction_stack.put(self.work_on_group(1))
        self.instruction_stack.pop()
其中,最终我的
工作组
工作行
工作列
函数将具有在结果展开时向堆栈添加指令的条件。然而,现在,当我尝试
do\u next\u step()
时,我得到的是

working on group 9
working on group 8
...
working on group 2
working on group 1
因此,我的函数似乎是在我将它们放入堆栈时进行计算,而不是等待我弹出它们

理想情况下,如果运行正确,我会看到

第1组的工作

因为这是最后一条指令,我只有一条pop命令

另一件值得注意的事情——这三个函数只需要一个参数,我可以看到基于电路板的更复杂的函数,需要更多的参数,并且希望我的堆栈/弹出能够处理这一点——存储函数引用,然后使用任意数量的
*args**kwargs
运行。我怎样才能做到这一点

编辑:

我已经想出了这个方法,我认为它可以对任意数量的位置参数起作用,但我不知道如何将关键字参数与此结合起来

    def do_next_step(self):
        if self.instruction_stack.empty():
            self.instruction_stack.put((self.work_on_group,(9)))
            self.instruction_stack.put((self.work_on_group,(8)))
            self.instruction_stack.put((self.work_on_group,(7)))
            self.instruction_stack.put((self.work_on_group,(6)))
            self.instruction_stack.put((self.work_on_group,(5)))
            self.instruction_stack.put((self.work_on_group,(4)))
            self.instruction_stack.put((self.work_on_group,(3)))
            self.instruction_stack.put((self.work_on_group,(2)))
            self.instruction_stack.put((self.work_on_group,(1)))
        func, params = self.instruction_stack.get()
        func(params)

我通过将我的
do\u next\u step
函数更改为以下内容来实现这一点

    def do_next_step(self):
        """
        Creates, and then does, next step into stack.
        """
        if self.instruction_stack.empty():
            self.instruction_stack.put((self.work_on_group,(9,),{}))
            self.instruction_stack.put((self.work_on_group,(8,),{}))
            self.instruction_stack.put((self.work_on_group,(7,),{}))
            self.instruction_stack.put((self.work_on_group,(6,),{}))
            self.instruction_stack.put((self.work_on_group,(5,),{}))
            self.instruction_stack.put((self.work_on_group,(4,),{}))
            self.instruction_stack.put((self.work_on_group,(3,),{}))
            self.instruction_stack.put((self.work_on_group,(2,),{}))
            self.instruction_stack.put((self.work_on_group,(1,),{}))
        func, params, keyword_params = self.instruction_stack.get()
        func(*params, **keyword_params)

这是因为您正在将调用方法的结果放入队列-即
self.instruction\u堆栈。put(self.work\u on\u group(9))
将调用
self.work\u on\u group(9)
的结果放入
指令堆栈。如果你在你的问题中提供了一个runnable,那么你就可以告诉你如何避免它(如果你不明白的话)。是的,这就是解决问题的方法。这实际上是处理Python中函数的延迟调用(和“回调”)的一种相当常见的方法。