写入从同一文件中的函数计算的多个数据

时间:2011-08-03 08:44:50

标签: python

我正在尝试将从此函数计算的数据写入文件中。但该函数被称为次数。假设另一个文件中有9个数字,此函数将计算这9个数字中的每个数字的根。来自此函数的这9个根应该写在同一个文件中。但我在这里完成它的方式将在文件中写入计算的根,但下一个将在文件中替换它。在调用此函数之前,还会为这9个数字中的每一个执行其他数学函数,因此这些函数会一次又一次地被调用。是否可以将它们全部写在同一个文件中?谢谢。

def Newton(poly, start):
    """ Newton's method for finding the roots of a polynomial."""
    x = start 
    poly_diff = poly_differentiate(poly)
    n = 1
    counter = 0
    r_i = 0

    cFile = open("curve.dat", "w")   
    while True:
        if (n >= 0) and (n < 1):
            break

        x_n = x - (float(poly_substitute(poly, x)) / poly_substitute(poly_diff, x))

        if x_n == x:
            break

        x = x_n # this is the u value corresponding to the given time

        n -= 1
        counter += 1
        x = str(x)
        cFile.write('\n' + x + '\n')

    if r_i:
        print "t(u) = ", (x, counter)

    else:
        print "t(u) = ", x


    cFile.close 

按照我的建议后,我将代码更改为以下内容:

def Newton(poly, start):
    """ Newton's method for finding the roots of a polynomial."""
    x = start 
    poly_diff = poly_differentiate(poly)
    n = 1
    counter = 0

    while True:
        if (n >= 0) and (n < 1):
            break

        x_n = x - (float(poly_substitute(poly, x)) / poly_substitute(poly_diff, x))

        if x_n == x:
            break

        x = x_n # this is the u value corresponding to the given time

        n -= 1
        counter += 1
        yield x 

    Bezier(x)

def Bezier(u_value) :
    """ Calculating sampling points using rational bezier curve equation"""
    u = u_value

    p_u = math.pow(1 - u, 3) * 0.7 + 3 * u * math.pow(1 - u, 2) * 0.23 \
        + 3 * (1 - u) * math.pow(u, 2) * 0.1 + math.pow(u, 3) * 0.52

    p_u = p_u * w

    d = math.pow(1 - u, 3) * w + 3 * u * w * math.pow(1 - u, 2) + 3 * (1 - u) *\ 
        w * math.pow(u, 2) + math.pow(u, 3) * w

    p_u = p_u / d

    yield p_u

    plist = list (p_u)
    print plist

我在Bezier()函数中执行了相同的操作,但是没有创建plist,因为它不会打印任何内容。请帮忙。谢谢。

3 个答案:

答案 0 :(得分:2)

你的函数两件事:它计算多项式的根,并将结果写入输出文件。功能理想情况下应该一件事

因此,尝试将其分解为接收多项式的函数并返回包含根的列表,然后只需一步就将该列表写入文件。

修改函数的最简单方法是替换行

x = str(x)
cFile.write('\n' + x + '\n')

yield x

然后你可以这样调用你的函数:

roots = list(Newton(polynomial, start))

要理解这一点,请阅读generators。要将结果列表写入文件,可以使用以下代码:

with open("curve.dat", "w") as output_file:
    output_file.write("\n".join(str(x) for x in roots)

答案 1 :(得分:1)

虽然我不完全理解你在问什么,但我认为答案可归结为:

以追加模式打开文件,而不是写入模式。而不是

cFile = open("curve.dat", "w") 

DO

cFile = open("curve.dat", "a") 

答案 2 :(得分:0)

为什么在Bezier中使用yield,它不会返回多个值,因此您可以更改:

yield p_u
plist = list (p_u)
print plist

为:

print list(p_u)
return p_u