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

问题描述 投票:1回答:1

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

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

python dictionary
1个回答
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 
>>> 
© www.soinside.com 2019 - 2024. All rights reserved.