在关于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)
答案 0 :(得分:3)
回答"口译员如何知道要使用哪个版本的标准化功能......",它基于该语言的范围规则。
在大多数语言中,名称(函数的标识符,变量等)首先从本地范围解析,如果没有找到,则进入下一个外层等等。
在这种情况下,您对"标准化"有两个定义。 function - 第一个是在解释器的全局范围内定义的,第二个是在第一个范围内定义的。当您致电df.apply(standardize)
时,名称"标准化"解析为本地定义的函数(第二个),因为在查看外部作用域之前搜索了本地作用域。