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