5

ここでPython初心者、2.7を実行しています。

関数を使用してテキストを生成し、関数で生成されたテキストをファイルに出力するプログラムを作成しようとしています。

関数をPowerShellで印刷する場合(次のように:http://codepad.org/KftHaO6x 、次のように繰り返します。

def writecode (q, a, b, c):
    while b < q:
        b = b + 1
        print "v%d_%d_%d = pairwise (caps[%d],sals[%d],poss[%d],poss[%d],poss[%d],pos_range)" %(a,b,c,a,a,a,b,c)
        print "votes%d_%d.append(v%d_%d_%d)" % (b,c,a,b,c,)
        print "v%d_%d_%d = pairwise (caps[%d],sals[%d],poss[%d],poss[%d],poss[%d],pos_range)" %(a,c,b,a,a,a,c,b)
        print "votes%d_%d.append(v%d_%d_%d)" % (c,b,a,c,b)

writecode (5,1,0,4)

関数をファイル(http://codepad.org/8GJpp9QYのように)に出力しようとすると、1つの値しか与えられません。つまり、反復されません。

def writecode (q, a, b, c):
    while b < q:
        b = b + 1
        data_to_write = "v%d_%d_%d = pairwise (caps[%d],sals[%d],poss[%d],poss[%d],poss[%d],pos_range)" %(a,b,c,a,a,a,b,c)
        data_to_write_two = "votes%d_%d.append(v%d_%d_%d)" % (b,c,a,b,c,)
        data_to_write_three = "v%d_%d_%d = pairwise (caps[%d],sals[%d],poss[%d],poss[%d],poss[%d],pos_range)" %(a,c,b,a,a,a,c,b)
        data_to_write_four = "votes%d_%d.append(v%d_%d_%d)" % (c,b,a,c,b)
        return data_to_write
        return data_to_write_two
        return data_to_write_three
        return data_to_write_four

x = writecode (5,1,0,4)

out_file = open("code.txt", "a")
out_file.write(x)
out_file.close()

これはなぜですか。また、出力関数を(印刷の場合のように)反復させるにはどうすればよいですか?

4

4 に答える 4

5

あなたの問題はreturn、関数から一度しかできないことです:

def test():
    return 1
    return 2

x = test()
# x is now 1

値のタプルを使用yieldまたは返す必要があります。

def this_will_work():
    yield 1
    yield 2

x = list(this_will_work()) # See below for why we are using list
# x is now [1, 2]

def so_will_this:
    return 1, 2

x = so_will_this()
# x is now (1, 2)

を使用すると、関数は反復可能yieldな に変わります。すべての最終値のみに関心がある場合は、ジェネレーターを、ジェネレーターが生成するすべての値のリストに変換するために使用できます。または、 を使用してループすることもできます。generatorlistfor ... in

于 2012-08-01T20:20:15.643 に答える
2

ファイルの書き込みに使用しているバージョンでは、関数はループreturnの最初の繰り返しの後に (最初のステートメントを介して)戻ります。while持っているものに基づいて、次のようなものが必要になる場合があります。

def writecode (q, a, b, c):
    results = []
    while b < q:
        b = b + 1
        results.append("v%d_%d_%d = pairwise (caps[%d],sals[%d],poss[%d],poss[%d],poss[%d],pos_range)" % (a,b,c,a,a,a,b,c))
        results.append("votes%d_%d.append(v%d_%d_%d)" % (b,c,a,b,c,))
        results.append("v%d_%d_%d = pairwise (caps[%d],sals[%d],poss[%d],poss[%d],poss[%d],pos_range)" % (a,c,b,a,a,a,c,b))
        results.append("votes%d_%d.append(v%d_%d_%d)" % (c,b,a,c,b))
        results.append("")
    return "\n".join(results)

x = writecode (5,1,0,4)

out_file = open("code.txt", "a")
out_file.write(x)
out_file.close()

出力の各行をリストに蓄積し、すべての結果を改行と末尾の改行で結合した単一の文字列を返します。

于 2012-08-01T20:23:40.333 に答える
1

return関数はすぐに存在します。

return現在の関数呼び出しを、式リスト (またはNone) を戻り値として残します。

途中で文字列を作成する必要があります (または、パフォーマンスを向上させるために、最後listに値の を作成しますjoin)。

于 2012-08-01T20:19:49.167 に答える
0

わずかな違い。名前付きフィールドで新しいスタイルの文字列フォーマットを使用しました。これは読みやすいはずです。

いくつかの重複したブロックを生成していることに注意してください (すべてのケースで、出力に b==c が 2 回表示されます)。

from textwrap import dedent

codeblock = dedent("""\
    v{a}_{b}_{c} = pairwise (caps[{a}],sals[{a}],poss[{a}],poss[{b}],poss[{c}],pos_range)
    votes{b}_{c}.append(v{a}_{b}_{c})
    v{a}_{c}_{b} = pairwise (caps[{a}],sals[{a}],poss[{a}],poss[{c}],poss[{b}],pos_range)
    votes{c}_{b}.append(v{a}_{c}_{b})
""")

def get_code (q, a, b, c):
    return ''.join(codeblock.format(a=a, b=b, c=c) for b in xrange(b, q))

def main():
    with open('code.txt', 'a') as outf:
        outf.write(get_code(5,1,0,4))

if __name__=="__main__":
    main()
于 2012-08-01T20:55:23.097 に答える