在函数内的函数中使用lambdas

时间:2012-04-16 06:22:42

标签: python python-3.x

我有一项任务,要求我修改一些代码。原来的功能是:

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

现在我想添加参数 transform ,这是一个以字符串形式作为参数的函数,并根据用户指定的转换返回一个字符串。如果函数调用中省略了 transform ,则输入文件中的行将保持不变。

这是我到目前为止所做的:

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

我不知道从哪里开始。我想我想读取输入文件行,但写下转换后的行...或者什么?

1 个答案:

答案 0 :(得分:3)

现在我想添加参数transform,一个以字符串形式作为参数的函数,并根据用户指定的转换返回一个字符串。如果函数调用中省略了transform,则输入文件中的行将保持不变。

这听起来很简单:你应该接受一个名为transform的函数参数,如果它被提供,你就可以调用它。如果没有提供,你要么不要调用它,否则你调用一个简单的函数来返回它的输入。

我建议您为None使用transform的默认参数。然后检查是否transform is None。如果不是,则尝试调用它,传递当前行,并将输出收集为新的当前行。如果transform is None那么你只需要保持当前行不变。

或者,您可以声明这个简单的函数:

def nop(x):
    return x

然后指定参数transform的默认值是函数nop。哪个更好,测试None并且不调用任何东西,或者有一个明智的无操作默认函数并且总是调用它?我认为这主要取决于个人偏好。对None的测试避免了函数调用的开销,所以它可能稍微快一点,但无论如何它可能都不是什么大问题。

没有理由声明一个名为transform的私有函数,通过这样做,你无法检查参数transform是什么。