2012-08-01 51 views
5

Python newbie here、running 2.7。関数はprintで返しますが、返り値は返しません。

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

だけで(次のように:http://codepad.org/KftHaO6x)PowerShellで関数を印刷する私はそれをしたいと、それは反復する、(このような:http://codepad.org/8GJpp9QY)ファイルに出力する機能をしようとすると

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) 

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() 

なぜこれがある、と(それは印刷していように)どのように私は、出力機能の反復処理を行うことができます。それだけ反復しない、すなわち、1つの値を与えますか?

+5

'return'声明**は**機能(?のように、ほとんどの(すべての)言語で)終了します –

+3

質問に実際のコードを載せてくれたHamishに感謝します... –

+2

少し前に戻って、あなたはコード生成を使用しているようです。なぜコードを直接実行しないのですか?あなたのより大きな仕事について何か言いますか? –

答えて

2

ファイルを書き込むために使用しているバージョンでは、この関数は、whileループの最初の繰り返し後に(最初のreturnステートメントを介して)返します。リストに出力の各行を蓄積することで動作し、すべての結果は、改行や末尾の改行で接合して単一の文字列を返し

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() 

:あなたはこのような何かをしたいかもしれない持っているものに基づいています。

+0

ありがとう、あなたが提供したコードは、私が必要としていたものとまったく同じです。とても有難い! – user1569317

+0

@ user1569317:ようこそ。 FWIWには、おそらくあなたがやっていることを達成するための簡単なやり方があります。私がしたことは、あなたが働いていたものを得るための比較的簡単な方法を示すことでした。 – martineau

1

returnは直ちに関数が存在する:

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

は、あなたが行く(または、パフォーマンスを向上させるため、最後の値のlistjoinを作成する)などの文字列を構築する必要があります。

5

あなたの問題はあなただけreturn一度関数からできることです。

def test(): 
    return 1 
    return 2 

x = test() 
# x is now 1 

あなたはyieldを使用するか、値のタプルを返すようにいずれかをお勧めします: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) 

はあなたをオン関数を反復処理できるgeneratorに変換します。最後の値だけに興味がある場合は、listを使用してジェネレータをジェネレータのすべての値のリストに変換します。あるいは、for ... inを使用してループすることもできます。

0

僅かです。私は新しいスタイルの文字列書式を名前付きフィールドで使用しましたが、これは読みやすくする必要があります。

重複ブロックを生成していることに注意してください(b == cが出力に2回出現するたびに)。 http://docs.python.org/reference/simple_stmts.html#the-return-statement:

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() 
関連する問題