-1

我正在学习 Python,想看看是否有人可以帮助分解并逐步了解此函数的作用?

def label(self, index, *args): 
    """ 
    Label each axes one at a time 
    args are of the form <label 1>,...,<label n> 
    APIPARAM: chxl 
    """ 
    self.data['labels'].append( 
    str('%s:|%s'%(index, '|'.join(map(str,args)) )).replace('None','') 
    ) 
    return self.parent 
4

3 回答 3

3

在尝试了解它的作用之前更改格式是个好主意:

def label(self, index, *args): 
    """ 
    Label each axes one at a time 
    args are of the form <label 1>,...,<label n> 
    APIPARAM: chxl 
    """ 
    self.data['labels'].append( 
        str( '%s:|%s' % \ 
            ( index, '|'.join( map( str,args ) ) ) 
        ).replace( 'None', '' ) 
    ) 
    return self.parent 

所以:

它在列表中附加了一些东西self.data[ 'labels' ]。我们知道这是因为append()它是list object的一种方法。

这是一个字符串,例如:

  • 字符串的形式是xxx:|yyy
  • xxx替换为参数的值index
  • yyy被转换为字符串 () 的所有其他参数替换map(str,args)并与|字符 ( join(...)) 连接,因此导致类似 ' a|b|None|c'
  • 上面字符串中的每次出现都None被替换为空字符串,并将其附加到列表中

编辑:

正如@abarnert 指出的那样,解释一下它*args的含义以及为什么稍后将其用作可能会很好args,所以就在这里。

*args(这是一个星号 + 一个任意名称)表示“列表中进一步可用的任意数量的匿名参数args”。也可以使用**kwargs- 注意两个星号,用于接受关键字参数,即以foo = barwherefoo是参数的名称并且bar是它的值而不仅仅是. 的形式传递给函数的bar

如上所述argsandkwargs是任意的,也可以使用*potatoesor**potatoes但使用argsandkwargs是 Python 中的一种约定(有时人们也使用**kw而不是**kwargs,但含义是相同的——分别为任意数量的匿名参数和任意数量的关键字参数)。

如果事先不知道函数/方法应接受的参数数量,则使用两者 - 例如,考虑一个处理派对客人姓名的函数,人们可能不知道可能有多少,因此定义以下函数使得感觉:

def add_party_quests( *quests ):
    for guest in quests:
        do_some_processing( guest )

那么下面的两个调用都是有效的:

add_party_guests( 'John' )
add_party_guests( 'Beth', 'Tim', 'Fred' )

这也在此 SO 帖子中进行了解释:https ://stackoverflow.com/a/287101/680238

于 2012-10-24T21:55:48.917 回答
2

我认为误导性的行是:

self.data['labels'].append( 
str('%s:|%s'%(index, '|'.join(map(str,args)) )).replace('None','') 
)

这些可以更清晰地格式化以帮助阅读:

self.data['labels'].append( 
    str('%s:|%s' % (
        index,
        '|'.join(map(str, args))
    )).replace('None', '') 
)

但可以更好地重写为:

self.data['labels'].append(  # append to the list at `self.data['labels']`
    '%s:|%s' % (             # a string of the format X:|Y
        index,               # where X is the index
        '|'.join(            # and Y is a list joined with '|'s
            str(arg) if arg is not None else  # with each item in the list
            '' for arg in args                # being it's string representation
        )
    )
)
于 2012-10-24T21:56:17.613 回答
1

*args变成一个名为 args 的参数列表。 self.data['labels']看起来是一个列表。.append 将一个项目添加到列表中。附加的项目由最右边返回的字符串返回,replace。要解析是什么字符串,请从括号内开始并找出解决方法。 map(str,args)将所有参数转换为字符串并返回该列表。 '|'.join(获取 map 的输出并将其连接成一般模式的单个字符串,elem1|elem2|elem3...然后使用格式 string '%s:|%s'。第一个%s被 index 的值替换,第二个被输出的字符串替换'|'.join。然后它在这个字符串上调用 replace ,替换所有出现的'None'with ''。然后它返回 self.parent。

于 2012-10-24T21:54:43.437 回答