Python newbie here, running 2.7.
I am trying to create a program that uses a function to generate text, and then outputs the function-generated text to a file.
When just printing the function in powershell (like this: http://codepad.org/KftHaO6x), it iterates, as I want it to:
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)
When trying to output the function into a file (like this: http://codepad.org/8GJpp9QY), it only gives 1 value, i.e. does not iterate:
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()
Why is this, and how can I make the output function iterate (like it does with print)?
Your issue is that you can only return once from a function:
def test():
    return 1
    return 2
x = test()
# x is now 1
You'll want to either use yield or return a tuple of values:
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)
Using yield turns your function into a generator that can be iterated over - if you are only interested in all the final values you can use list to turn the generator into a list of all the values your generator yields.  Alternately you can loop over it using for ... in.
In the version you're using to write the file, the function returns (via the first return statement) after the first iteration of the while loop. Based on what you have you might want something like this:
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()
Which works by accumulating each line of output into a list and then returns the single string with all the results joined together with newlines and a trailing newline.
return immediately exists the function:
returnleaves the current function call with the expression list (orNone) as return value.
You need to build the string as you go (or, for better performance, create a list of values and join at the end).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With