2016-02-17 3 views
2

Во время работы над курсом Intro to data analysis на Udacity я наткнулся на следующее. При написании функции ниже я не понимал, что я назвал вспомогательную функцию 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), имя «стандартизировать» разрешается локально определенной функции (вторая), потому что локальная область поиска выполняется до просмотра внешних областей.

Смежные вопросы