学习别人的作品,有一大好处,可以反观自己的不足。
自己的不足,往往是基础知识有欠缺,基本功不扎实。
今天,再补一课:星号表达式(*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'} >>>
时间: 2024-11-05 11:57:39