2012-08-01 4 views
5

Python newbie burada, 2.7 çalışıyor.İşlev, yazdırma ile yinelenir, ancak geri dönülmez

Metin oluşturmak için bir işlev kullanan ve ardından işlev tarafından oluşturulan metni bir dosyaya gönderen bir program oluşturmaya çalışıyorum.

sadece (bunun gibi: http://codepad.org/KftHaO6x) powershell işlevini baskı

,:

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 böyle) bir dosyaya çıkışa işlevi çalışırken, bu dolaşır ben bunu istediğiniz gibi

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

Bu neden olduğunu ve (o baskı ile yaptığı gibi) nasıl çıktı fonksiyonu iterate yapabilirsiniz: sadece yani yineleme değil, 1 değerini verir?

+5

'return' deyimi ** ** fonksiyonu (? gibi en (tümü) dilde) sonlandırır –

+3

Hamish'e buradaki asıl kodu sorduğunuz için teşekkürler ... –

+2

Biraz geri adım atıyorsunuz, kod oluşturma kullanıyorsunuz. Neden kodu doğrudan çalıştırmıyorsunuz?Ya da daha büyük göreviniz hakkında bir şey söyleyin? –

cevap

2

Dosyayı yazmak için kullandığınız sürümde, işlev while döngüsünün ilk yinelemesinden sonra (ilk return bildirimi aracılığıyla) döner. Eğer böyle bir şey isteyebilirsiniz ne dayalı olarak:

bir liste halinde çıktısının her satırı biriken çalışır ve daha sonra tüm sonuçlar satırbaşıyla ve bir eğik yeni satır ile bir araya tek bir dize döndürür
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

Teşekkür ederiz, sağladığınız kod tam olarak ihtiyacım olanı uyuyor. Çok takdir! – user1569317

+0

@ user1569317: Rica ederim. FWIW, yaptığınız şeyi başarmanın ya da en azından biraz daha okunabilir hale getirmenin muhtemelen daha kolay yolları vardır. Tek yaptığım, çalıştığınız şeyi elde etmenin nispeten basit bir yolunu göstermekti. – martineau

1

return hemen işlevi vardır:

return dönüş değeri olarak ifade listesinin (veya None) mevcut işlev çağrısını bırakır.

Gidecek (veya, daha iyi performans için, sonunda değerlerin list ve join oluşturun) olarak dizesini oluşturmak gerekir.

def test(): 
    return 1 
    return 2 

x = test() 
# x is now 1 

Sen yield kullanabilir veya bir değerler tuple döndürmek ya isteyeceksiniz:

5

Sorununuz sadece return kez işlevinden olmasıdır yield döner

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) 

aracın kullanılmasıyla Yinelenebilecek generator fonksiyonuna - eğer tüm son değerlerle ilgileniyorsanız, jeneratörü jeneratörünüzün ürettiği tüm değerlerin listesine dönüştürmek için list kullanabilirsiniz. Alternatif olarak, for ... in'u kullanarak döngü yapabilirsiniz.

0

Hafif bir varyasyon; Okunması daha kolay olması gereken, adlandırılmış alanlarla yeni stil dizesi biçimlendirme kullandım.

Çoğaltılmış bloklar oluşturduğunuzu unutmayın (her durumda b == c çıktınızda iki kez görünür). 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()