我可以使用字典来调用相同的函数但不同的参数吗?

时间:2017-12-24 10:46:47

标签: python dictionary

我想通过存储在字典中来调用函数。 实际上,我会收集

dictStar = {1:...,2:..., ... , 100:....}

但我只尝试了3次

star = [1,2,3]

dictStar = {                    #######################
        1: drawStar(2,1,s),     #    Problem Here     #
        2: drawStar(2,4,s),     #    They always      #
        3: drawStar(2,7,s)      #    call 3 functions #
}                               #######################

def drawStar(row,column,s):
    global plaRotate
    plaRotate = plaRotate+0.5
    sm2 = buildScaleMatrix(s/10,s/10,s/10)
    column = (column - 5.5)*s
    row = -(row - 1.0)*s
    glUniform1i(fragMode, int(7)) 
    Obj_platonic.draw(programID_1,projectionMatrix,np.dot(buildMoveMatrix(column,20,row),np.dot(buildRotateMatrix(0,1,0,plaRotate),sm2)))
    glUniform1i(fragMode, int(4)) 

def dstar():                            ####################
    if len(star) > 0:                   #    When I call   #
        for i in range(len(star)):      #                  #
            dictStar(star[i])           ####################

def removeStar(x):
    global star
    if x in star:
        star.remove(x)
    else:
        print("No starID: ",x)

def main():
    dstar()

我打电话给dictStar(任何事) 他们将在dictStar中调用所有功能 所以,我试试

def: dictStar(x)
return
{                    
        1: drawStar(2,1,s),     
        2: drawStar(2,4,s),     
        3: drawStar(2,7,s)     
}

但它发生的事情与上面的T_T相同 我避免if-function因为它会花很多时间我猜 在C ++中我会写

switch(x)
    case 1:
        drawStar(2,1,s);
    case 2:
        drawStar(2,4,s);
    case 3:
        drawStar(2,7,s);

我相信C ++写这个很好但我必须用Python写 如果我问一个常见问题,我很抱歉,我真的不知道如何用Python写作

1 个答案:

答案 0 :(得分:3)

在字典中存储函数

函数是Python中的第一类对象,因此您可以将它们存储在字典中。例如,如果foobar是函数,而my_dict是字典,则可以按以下方式将函数存储在字典中:

my_dict = {'foo': foo, 'bar': bar}

请注意,值为foobar是函数对象,而foo()bar()是函数调用。

要致电foo,您可以my_dict['foo']()

使用默认参数存储函数

利用functools.partial()

partial()返回一个新函数,其行为与旧函数类似,但是传入的任何参数都已填充。以下是例如。 partial如何运作:

>>> import functools
>>> print_with_hello = functools.partial(print, "Hello")
>>> print_with_hello("World")
Hello World
>>> print_with_hello()
Hello

解决您的问题:

在您的情况下,dictStar将按以下方式定义:

dictStar = {
    1: functools.partial(drawStar, 2, 1),
    2: functools.partial(drawStar, 2, 4),
    3: functools.partial(drawStar, 2, 7)
}

现在,您可以将字典称为dictStar.get(1)(s)dictStar[1](s)

工作例如:

>>> import functools
>>> def drawStar(row,column,s):
...     print """row: %s, column: %s, s: %s """ % (row,column,s)
... 
>>> dictStar = {
...     1: functools.partial(drawStar, 2, 1),
...     2: functools.partial(drawStar, 2, 4),
...     3: functools.partial(drawStar, 2, 7)
... }
>>> 
>>> s=10
>>> dictStar.get(1)(s)
row: 2, column: 1, s: 10 
>>> dictStar[1](s)
row: 2, column: 1, s: 10 
>>> dictStar[2](s)
row: 2, column: 4, s: 10 
>>> dictStar[3](s)
row: 2, column: 7, s: 10 
>>>