理解Python函数

时间:2012-10-24 21:46:52

标签: python

我正在学习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 

3 个答案:

答案 0 :(得分: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(...))结合的所有其他参数,因此会产生类似'{{1}的内容}}“
  • 上面字符串中a|b|None|c的每个出现都被替换为空字符串,并将其附加到列表中

修改

正如@abarnert所指出的那样,解释None的含义以及为什么以后将其用作*args可能会更好,所以就这样了。

args(星号+任意名称)表示“*args列表中可进一步提供的任意数量的匿名参数”。也可以使用args - 注意两个用于接受密钥参数的星号,即以**kwargs形式传递给函数的参数,其中foo = bar是参数的名称,{ {1}}是它的价值,而不仅仅是foo

如上所述barbar是任意的,也可以使用argskwargs,但使用*potatoes**potatoes是Python中的约定(有时人们也使用args而不是kwargs,但意思是相同的 - 分别是任意数量的匿名和任意数量的关键参数。)

如果事先不知道函数/方法应该接受的参数的数量,则使用两者 - 例如考虑一个处理聚会客人名称的函数,可能不知道可能有多少,所以定义一个以下功能是有道理的:

**kw

然后下面的两个电话都有效:

**kwargs

此SO帖子中也解释了这一点:https://stackoverflow.com/a/287101/680238

答案 1 :(得分: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
        )
    )
)

答案 2 :(得分:1)

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