首页 > 代码库 > PyQt挖地雷游戏学习笔记(6)

PyQt挖地雷游戏学习笔记(6)

学习别人的作品,有一大好处,可以反观自己的不足。

自己的不足,往往是基础知识有欠缺,基本功不扎实。

今天,再补一课:星号表达式(*expression)。

挖地雷程序中,有2处用到星号表达式。一是在main.py,另一处在game_scene.py。

先看第一处的情况:

@pyqtSlot()
def on_action_Setup_triggered(self):
    result = setup.getSetup()
    if not result: return
    self.scene.setMap(*result)
    self.scene.start()

这里的result,从setup.py返回,是这个样子:

def getSetup():
    if SetupDlg().exec_() != QDialog.Accepted: return
    return (conf.w, conf.h), conf.mines

即,result = ((conf.w, conf.h), conf.mines)

再看用星号(*)解析result的样子。调用函数self.scene.setMap(*result)之后,

在game_scene.py中:

def setMap(self, size, mines):
        self.setup = size, mines
        self.map_size = size
        self.mines = mines

可见,*result解析的结果,成为2个对象,一个是元组size,另一个是整数mine。

如果不用*result解析,函数setMap的头部参数为result一个对象,还需再做解析。

下面的函数new_func,是第二处用到星号表达式的,也是常见的情形:

def inGame(func):
    """
    check if this game is running
    """
    def new_func(self, *args, **kw):
        if self.status != RUNNING: return
        return func(self, *args, **kw)
    return new_func

注意!第一,星号表达式只能用在函数头部,否则,是语法错误;

第二,重要的是星号,不是参数名称;

第三,星号意味着,参数属于iterable性质的,即可用函数len()测量其长度。

以下是简单的例子:

>>> def func(*S,**K):print(S,'\n',K)
...
>>> func(1,[2,3],a=5,b='6',c='asd')
(1, [2, 3])
 {'a': 5, 'c': 'asd', 'b': '6'}
>>>

PyQt挖地雷游戏学习笔记(6)