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()
为什么会这样,以及如何使输出函数迭代(就像打印一样)?
答案 0 :(得分: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
将您的函数转换为可以迭代的generator
- 如果您只对所有最终值感兴趣,可以使用list
将生成器转换为列表你的发电机产生的所有价值。或者,您可以使用for ... in
循环覆盖它。
答案 1 :(得分: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()
通过将每行输出累积到一个列表中然后返回单个字符串,其中所有结果与换行符和尾随换行符连接起来。
答案 2 :(得分:1)
答案 3 :(得分:0)
略有变化;我使用了带有命名字段的新式字符串格式,这应该更容易阅读。
请注意,您正在生成一些重复的块(每种情况下b == c在输出中出现两次)。
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()