在python上导出打印数据

时间:2017-01-12 18:57:25

标签: python algorithm file export

我的代码是一种运行用户输入的数学算法,但算法中有一个随机因素。用户可以选择导出算法给出的数据,但由于随机因素,.txt文件中导出的数据不同。有没有办法让GUI上显示的打印数据导出到文件中?感谢。

import random
import os.path
def main ():
    print ("1.input numbers")
    print ("2.run formula")
    print ("3.export data")
    maininput = int(input("Enter:"))
    if maininput == 1:
        number ()
    if maininput == 2:
        formula ()
    if maininput == 3:
        export ()

def number ():
    number.one = int(input("first number"))
    number.two = int(input("second number"))
    number.repeat = int(input("times to be repeated"))
    main ()

def formula ():
    one = number.one
    two = number.two
    for x in range(1,number.repeat , +1):
        print ("sequence:",x)
        answer = one * two
        factor = random.uniform (0.8 ,0.5)
        final= answer * factor
        print ("before random:",round (answer))
        print ("after random:",round (final))
        one = final
    main ()

def export ():
    one = number.one
    two = number.two
    filename = input ("file name?")
    file = open (filename, "w")
    for x in range (1,number.repeat , +1):
        file.write ("sequence:" + str(x) + ":" + '\n')
        answer = number.one * number.two
        factor = random.uniform (0.8 ,0.5)
        final= answer * factor
        exanswer = round (answer)
        exfinal = round (final)
        file.write ("before random:" + str (exanswer) + '\n')
        file.write ("after random:" + str (exfinal) + '\n')
        number.one = exfinal
    file.close()
    main ()

main()

这简化为我可以编写代码并仍然提供对我的意图的理解。

1 个答案:

答案 0 :(得分:0)

根据你的例子,我有几点要说你应该考虑纠正,但首先是你的主要问题:

为什么导出公式时数字不同?:

您获得的结果会有所不同,因为您正在重新计算结果。从随机库中获取随机数每次都会有所不同,因此当您重新计算将其打印到文件的答案时,会生成一个新的不同随机因子,从而改变计算。

有两种相对简单的方法可以解决这个问题。 A)保存所有输出并且不重新计算,或者B)强制随机数发生器使用相同的序列两次。

我会让你弄清楚如何做第一个,但至于B)你要做的是确保在每次你想要它之前给随机数生成器相同的“种子”吐出相同的序列。在您的示例中,如果我们更改number()函数中输入的数字,我们只希望输出更改,因此我们将提出“随机”种子。对于非基于安全性的任务,通常认为“足够好”可以将当前时间用于此目的:

from time import time

def number ():
    number.one = int(input("first number"))
    number.two = int(input("second number"))
    number.repeat = int(input("times to be repeated"))
    number.seed = time() #save this seed for each time we need to compute
    main ()

然后准备rng输出相同的序列,你需要在每个for循环之前将这个种子作为起点:

random.seed(number.seed)

这将确保您每次都可以同时调用formula()export()并进行相同的数学计算。

现在简短的咆哮(幽默我)

在您的示例中,您使用number.onenumber.two等作为全局变量..这本身确实有效,但您可以在这里非常快地遇到麻烦。你所做的是为你的数字函数赋值,它将你的变量存储在包含数字函数本身的对象中。将随机属性分配给任何旧对象都不适用于所有内容(如果您的变量属于“int”类型,则无法执行此操作等。)并且特别是预先存在的对象类型(在您的案例函数中)可能会开始奇怪地行为你不小心修改了错误的属性。有两种普遍接受的“正确”方法可以使用全局变量,希望能够防止这些问题。

第一个是在函数中使用global关键字,你想要定义将在该函数范围之外使用的全局变量:

def number ():
    global one #make these variables accessable in global context
    global two
    global repeat
    global seed
    one = int(input("first number"))
    two = int(input("second number"))
    repeat = int(input("times to be repeated"))
    seed = time()
    main ()

def formula ():
    ONE = one #make local private copy of global variable 
    TWO = two 
    REPEAT = repeat 
    random.seed(seed)
    for x in range(1, REPEAT, +1):
        print ("sequence:",x)
        answer = ONE * TWO
        factor = random.uniform (0.8 ,0.5)
        final= answer * factor
        print ("before random:",round (answer))
        print ("after random:",round (final))
        ONE = final
    main ()

执行全局变量的另一种方法实际上与使用number.xx的方式类似,但是以更加可控的方式。您可以做的是创建一个空对象作为所有全局变量的容器。为此,我们将创建一个继承自python的object类:

的简单类
class globalcontext(object):
    pass #we don't actually need this class to do anything fancy
globvars = globalcontext()

def number ():
    globvars.one = int(input("first number"))
    globvars.two = int(input("second number"))
    globvars.repeat = int(input("times to be repeated"))
    globvars.seed = time()
    main ()

def formula ():
    ONE = globvars.one #make local private copy of global variable 
    TWO = globvars.two 
    REPEAT = globvars.repeat 
    random.seed(globvars.seed)
    for x in range(1, REPEAT, +1):
        print ("sequence:",x)
        answer = ONE * TWO
        factor = random.uniform (0.8 ,0.5)
        final= answer * factor
        print ("before random:",round (answer))
        print ("after random:",round (final))
        ONE = final
    main ()