2012-04-16 3 views
0

У меня есть задание, в котором меня просят изменить код. Исходная функция заключается в следующем:Использование lambdas в функции внутри функции

def selectivelyCopy(inputFile,outputFile,predicate): 
    linesCopied = 0 
    for line in inputFile: 
    if predicate(line):#test the line with the predicate 
     outputFile.write(line) 
     linesCopied+=1 
inputFile.close() 
return linesCopied 

Теперь я предполагаю, чтобы добавить параметр преобразования, функцию, которая принимает в качестве параметра строку, а возвращает строку в соответствии с преобразованием указанного пользователем. Если в вызове функции исключено преобразование, строки из входного файла записываются без изменений.

Вот то, что я до сих пор:

def selectivelyCopy2(inputFile,outputFile,predicate, transform): 
    def transform(x = lambda x: x): 
     return(x) 

    linesCopied = 0 
    for line in inputFile: 
     if predicate(line): #test the line with the predicate 
      outputFile.write(line) 
      linesCopied+=1 
    inputFile.close() 
    return linesCopied 

Я не уверен, куда двигаться дальше. Я думаю, что я должен прочитать строку входных файлов, но написать преобразованную строку ... или что-то еще?

+2

Попробуйте запустить код. Время процессорного времени стоит меньше, чем у нас. Также пометьте как домашнюю работу, если это домашнее задание. – Shep

+0

Я его запустил. Он просто работает, как будто определения не было. Нет ошибок. –

+0

Извините за то, что вы указали очевидное, но ... вы запускаете код выше? Ничего лишнего? Вы _call_ свою функцию? – Veky

ответ

3

Теперь я могу добавить параметр transform, функцию, которая принимает в качестве параметра строку, и возвращает строку в соответствии с преобразованием, указанным пользователем. Если в вызове функции пропущено преобразование, строки из входного файла записываются без изменений.

Это звучит очень просто: предполагается, что вы принимаете аргумент функции transform, и если он предоставляется, вы вызываете его. Если он не указан, вы либо не вызываете его, либо вызываете тривиальную функцию, которая возвращает свой вход без изменений.

Предлагаю вам использовать аргумент по умолчанию None для transform. Затем проверьте, есть ли transform is None. Если это не так, попробуйте назвать его, передав текущую строку и собирая вывод как новую текущую строку. Если transform is None, вы просто записываете текущую строку без изменений.

В качестве альтернативы, вы могли бы объявить эту тривиальную функцию:

def nop(x): 
    return x 

А затем указать, что по умолчанию для аргумента transform функция nop. Что лучше, чтобы проверить на None и ничего не называть, или иметь разумную функцию по умолчанию без операции и всегда вызывать ее? Я думаю, что это в основном вопрос личных предпочтений. Тест для None позволяет избежать накладных расходов на вызов функции, поэтому он, вероятно, немного быстрее, но, вероятно, это не так уж и важно.

Нет причин объявлять закрытую функцию с именем transform, и, делая это, вы не можете проверить, что такое аргумент transform.

+1

Ты взял слова прямо изо рта. Чуть более элегантным, но и менее неэффективным может быть установка по умолчанию трансформации 'transform = lambda x: x', чтобы вы могли всегда вызывать преобразование вместо проверки, является ли это' None'. Ты определенно намекнул на эту идею, просто подумал, что я буду упоминать ее более явно. –

+0

Обычно я обычно называю такие функции, как 'nop()', и указываю их по имени, а скорее использую 'lambda', как вы показали, либо один из них в порядке. Другой пример, который в значительной степени сводится к личным вкусам. – steveha

+0

Интересно. Мой профессор специально заявил, чтобы сделать еще одну функцию, но я думаю, я просто сделаю это по-другому. Благодарю. –

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