2012-04-16 68 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

嘗試運行代碼。你的CPU時間比我們的價值低。如果這是家庭作業,也標記爲家庭作業。 – Shep 2012-04-16 06:25:13

+0

我確實運行過它。它就好像定義不在那裏一樣。沒有錯誤。 – 2012-04-16 06:38:44

+0

對不起,明顯的,但是......你運行上面的代碼?沒有額外的東西?你有沒有呼喚你的功能? – Veky 2016-08-07 16:39:10

回答

3

現在我想添加參數transform,一個函數,它接受一個字符串作爲其參數,並根據用戶指定的轉換返回一個字符串。如果函數調用中省略了變換,則輸入文件中的行將被寫入未更改。

這聽起來很簡單:你應該接受一個叫做transform的函數參數,如果它提供了,你可以調用它。如果沒有提供,則不要調用它,要不然就調用一個簡單的函數,使其輸入保持不變。

我建議您使用默認參數None作爲transform。然後檢查是否transform is None。如果不是,則嘗試調用它,傳遞當前行,並將輸出收集爲新的當前行。如果transform is None那麼你只是不改變當前行。

或者,你可以聲明這個簡單的功能:

def nop(x): 
    return x 

並指定爲參數transform默認爲功能nop。哪個更好,測試None並且什麼都不調用,或者有一個合理的無操作默認功能並且總是調用它?我認爲這主要是個人喜好的問題。 None的測試避免了函數調用的開銷,所以它可能稍微快一點,但這可能不是什麼大不了的。

沒有理由聲明一個名爲transform的私有函數,通過這樣做,您無法檢查參數transform是什麼。

+1

你從我口中說出了這些話。稍微優雅一些​​,但效率較低,可能是將transform的默認值設置爲'transform = lambda x:x',這樣您就可以始終調用transform而不是檢查它是否爲None。你肯定暗示了這個想法,只是認爲我會更明確地提到它。 – 2012-04-16 06:40:17

+0

我通常傾向於使用'nop()'命名函數,並按名稱指定它們,而不是像你所顯示的那樣使用'lambda',任何一個都可以。另一個例子幾乎歸結爲個人品味。 – steveha 2012-04-16 06:42:19

+0

有趣。我的教授專門提出了另一個功能,但我想我會以另一種方式做。謝謝。 – 2012-04-16 06:48:56