了解Python函数

了解Python函数,python,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('

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

*args转换为一个名为args的参数列表。self.data['labels']看起来是一个列表。append将项目添加到列表中。追加的项由最右边的部分replace返回的字符串返回。要解析什么字符串,从paren内部开始,然后找到解决方法。mapstr,args将所有arg转换为字符串并返回该列表。“|”。join获取map的输出并将其合并为一个字符串,该字符串采用常规模式elem1 | elem2 | elem3…,然后使用格式字符串“%s:|%s”。第一个%s被index的值替换,第二个被“|”输出的字符串替换。join。然后对该字符串调用replace,将所有出现的“None”替换为。然后返回self.parent。

在尝试理解它的功能之前,最好先更改格式:

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 
那么以下两个调用都有效:

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

这篇SO帖子也解释了这一点:

我假设误导性的线条是:

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
        )
    )
)

你不明白其中哪些部分?它是一个类方法,因此返回值self.parent在别处定义。否则,它将执行一些字符串操作并添加到列表中。@g.d.d.c对于Python新手来说,这并不明显,语法是Python特有的,并且有两个函数在Hello World示例中没有出现。@kgr谢谢,这是完全正确的,尽管我通常认为最好忽略trolls.PS,这令人困惑的部分原因是它的代码不好。外部str完全没有必要。无条件地对每个arg调用str,然后对连接的结果执行replace'None',而不是一开始就进行正确的转换,这是令人困惑的,并且是一个危险信号,表明有人还没有学会列表理解…。当然,无论如何你都需要学习如何阅读这样的代码,但值得知道的是,这是原代码编写者的错,而不是你自己的错,所以你不会对自己太失望。@abarnert这也是我的想法,看起来好像有人想炫耀一下,让别人知道他或她是多么的铁杆程序员,他或她忽略了代码的可读性和一些python指南。这是最好的答案,但缺少了对args如何工作的解释,用一个例子来说明这一点可能比试图描述它更容易。@abarnert你说得对,谢谢。我已经更新了我的答案。太好了,我很高兴我能帮上忙:@kgr所以对args如何工作的解释实际上让我解决了我遇到的原始问题,以及为什么我试图弄清楚这个函数最初在做什么。下面是我原始问题的链接,你也应该在那里添加你的答案,我会接受它作为该问题的答案@rollingstone没有注意到另一个问题:我添加了一个答案,其中显示了正确的调用语法,并链接到此答案以了解更多详细信息。这是一个很好的重写,但我认为您需要解释mapstr、args和生成器表达式是如何相互关联的。
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
        )
    )
)