2016-02-17 115 views
2

雖然在Udacity的Intro to data analysis課程上工作,但我偶然發現了以下情況。在編寫下面的函數時,我沒有意識到我將輔助函數standardize(series)命名爲主函數standardize(df)。令我驚訝的是,該功能運行良好。與主功能名稱相同的助手功能?

當我在df.apply(standardize)中使用它時,解釋器如何知道使用哪個版本的標準化函數?它與參數類(系列vs 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) 
+5

嵌套函數會遮蔽它嵌套的函數。它會正常工作,但似乎不必要的混淆。 – jonrsharpe

+0

作爲建議,您可以改爲命名內部函數_standardize。這是我的正常習慣。 –

回答

3

要回答「解釋程序如何知道使用哪種版本的標準化函數...」,它基於語言中的範圍規則。

在大多數語言中,名稱(標識符函數,變量等),從局部範圍內先解決,然後如果沒有找到,發展到下一個外部水平等

在這種情況下,你對「標準化」函數有兩個定義 - 第一個定義在全局範圍的解釋器中,第二個定義在第一個範圍內。當您致電df.apply(standardize)時,名稱「標準化」將解析爲本地定義的函數(第二個),因爲在查看外部作用域之前先搜索本地作用域。