2012-08-01 9 views
5

पाइथन नौसिखिया, 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) एक फ़ाइल में समारोह उत्पादन करने की कोशिश कर रहे हैं, यह iterates, मैं यह करना चाहते हैं के रूप में, यह केवल 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() 

ऐसा क्यों है, और मैं कैसे उत्पादन समारोह पुनरावृति कर सकते हैं (जैसे कि यह प्रिंट के साथ करता है)?

+5

'return' बयान ** समाप्त हो जाता है ** समारोह (जैसे सबसे (सभी) भाषाओं में?): Http://docs.python.org/reference/simple_stmts.html#the-return-statement –

+3

प्रश्न में वास्तविक कोड डालने के लिए हामिश को धन्यवाद ... –

+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

@ उपयोगकर्ता 1569317: आपका स्वागत है। एफडब्ल्यूआईडब्ल्यू आप जो कर रहे हैं उसे पूरा करने के लिए शायद आसान तरीके हैं या कम से कम इसे थोड़ा अधिक पठनीय बनाते हैं। मैंने जो कुछ किया है वह आपको प्राप्त करने के लिए एक अपेक्षाकृत सरल तरीका दिखा रहा था। – martineau

1

return तुरंत समारोह मौजूद है:

return छोड़ देता है अभिव्यक्ति सूची (या None) वापसी मान के रूप में के साथ वर्तमान समारोह कॉल।

आप स्ट्रिंग का निर्माण करने के रूप में तुम जाओ (या, बेहतर प्रदर्शन के लिए, मूल्यों की एक list और join अंत में बनाने) की जरूरत है।

def test(): 
    return 1 
    return 2 

x = test() 
# x is now 1 

आप या तो yield का उपयोग करें या मूल्यों की एक टपल वापस जाने के लिए चाहता हूँ:

5

आपका मुद्दा यह है कि आप केवल एक बार return एक समारोह से कर सकते हैं

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 बदल जाता है अपने generator में फ़ंक्शन करें जिसे पुन: सक्रिय किया जा सकता है - यदि आप केवल उन अंतिम मानों में रूचि रखते हैं जिन्हें आप list का उपयोग कर सकते हैं ताकि जेनरेटर आपके जेनरेटर उपज के सभी मूल्यों की सूची में बदल सके। वैकल्पिक रूप से आप for ... in का उपयोग कर इसे लूप कर सकते हैं।

0

थोड़ा सा बदलाव; मैंने नामित फ़ील्ड के साथ नई शैली वाली स्ट्रिंग स्वरूपण का उपयोग किया है, जिसे पढ़ने में आसान होना चाहिए।

ध्यान रखें कि आप कुछ डुप्लिकेट ब्लॉक उत्पन्न कर रहे हैं (प्रत्येक मामले जिसमें बी == सी आपके आउटपुट में दो बार दिखाई देता है)।

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() 
संबंधित मुद्दे