0

コードを変更するように求められる割り当てがあります。元の関数は次のとおりです。

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を省略した場合、入力ファイルの行は変更されずに書き込まれます。

これが私がこれまでに持っているものです:

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

ここからどこに進むべきかわかりません。入力ファイルの行を読み取ることになっていると思いますが、変換された行を書き込みます...または何か?

4

1 に答える 1

3

ここで、パラメータ変換を追加するとします。これは、パラメータとして文字列を受け取り、ユーザーが指定した変換に従って文字列を返す関数です。関数呼び出しからtransformを省略した場合、入力ファイルの行は変更されずに書き込まれます。

それは私には非常に単純に聞こえます。あなたはtransform、と呼ばれる関数の引数を受け入れることになっています。それが提供されている場合は、それを呼び出します。提供されていない場合は、呼び出さないか、入力を変更せずに返す簡単な関数を呼び出します。

Noneforのデフォルト引数を使用することをお勧めしますtransform。次に、かどうかを確認しますtransform is None。そうでない場合は、それを呼び出して、現在の行を渡し、出力を新しい現在の行として収集してみてください。その場合transform is Noneは、現在の行を変更せずに書き込むだけです。

または、次の簡単な関数を宣言することもできます。

def nop(x):
    return x

次に、引数のデフォルトtransformが関数であることを指定しますnop。テストしNoneて何も呼び出さないのか、賢明な無操作のデフォルト関数を持って常に呼び出すのか、どちらが良いですか?これは主に個人的な好みの問題だと思います。のテストNoneは関数呼び出しのオーバーヘッドを回避するため、おそらくわずかに高速ですが、どちらにしても大したことではないでしょう。

、という名前のプライベート関数を宣言する理由はありません。transformそうすることで、引数が何であるかを確認できなくなりますtransform

于 2012-04-16T06:37:52.280 に答える