辅助功能与主要功能同名?

时间:2016-02-17 20:28:40

标签: python recursion scope

在关于Udacity的Intro to data analysis课程中,我偶然发现了以下情况。在编写下面的函数时,我没有意识到我将辅助函数standardize(series)命名为与主函数standardize(df)相同。令我惊讶的是,这个功能运行良好。

当我在df.apply(standardize)中使用它时,解释器如何知道要使用哪个版本的标准化函数?它与参数类(系列与df)有什么关系吗?为什么它不尝试使用递归?或者如果确实如此,我似乎无法概念化它是如何逐步发挥作用的。

grades_df = pd.DataFrame(
    data={'exam1': [43, 81, 78, 75, 89, 70, 91, 65, 98, 87],
          'exam2': [24, 63, 56, 56, 67, 51, 79, 46, 72, 60]},
    index=['Andre', 'Barry', 'Chris', 'Dan', 'Emilio', 
           'Fred', 'Greta', 'Humbert', 'Ivan', 'James']
)
def standardize(df):
    '''
    Fill in this function to standardize each column of the given
    DataFrame. To standardize a variable, convert each value to the
    number of standard deviations it is above or below the mean.
    '''
    def standardize(series):
        return (series - series.mean())/series.std(ddof = 0)
    return df.apply(standardize)

standardize(grades_df)

1 个答案:

答案 0 :(得分:3)

回答"口译员如何知道要使用哪个版本的标准化功能......",它基于该语言的范围规则。

在大多数语言中,名称(函数的标识符,变量等)首先从本地范围解析,如果没有找到,则进入下一个外层等等。

在这种情况下,您对"标准化"有两个定义。 function - 第一个是在解释器的全局范围内定义的,第二个是在第一个范围内定义的。当您致电df.apply(standardize)时,名称"标准化"解析为本地定义的函数(第二个),因为在查看外部作用域之前搜索了本地作用域。