5

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

为什么会这样,我怎样才能使输出函数迭代(就像打印一样)?

4

4 回答 4

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)

Usingyield将你的函数变成一个generator可以迭代的函数——如果你只对所有最终值感兴趣,你可以使用它list来将生成器变成你的生成器产生的所有值的列表。或者,您可以使用for ... in.

于 2012-08-01T20:20:15.643 回答
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()

它的工作原理是将每一行输出累积到一个列表中,然后返回单个字符串,其中所有结果与换行符和尾随换行符连接在一起。

于 2012-08-01T20:23:40.333 回答
1

return立即存在函数:

return将当前函数调用与表达式列表(或None)作为返回值。

您需要随时构建字符串(或者,为了获得更好的性能,在最后创建一个listjoin)。

于 2012-08-01T20:19:49.167 回答
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()
于 2012-08-01T20:55:23.097 回答