繁体   English   中英

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

[英]Can I use dictionary for calling same function but different parameters?

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

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

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

请注意,值是foobar ,它们是函数对象,NOT 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 
>>> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM