在python上导出打印数据

在python上导出打印数据,python,algorithm,file,export,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 =

我的代码是一个数学算法,它使用用户的输入,但算法中有一个随机因素。用户可以选择导出算法中给出的数据,但由于随机因素,.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 ()
主要()


我尽可能地简化了代码的编写过程,并且仍然能够理解我的意图。

基于您的示例,我有几件事要说,您应该考虑更正,但首先是您的主要问题:

为什么导出和运行公式时的数字不同 您得到的结果将不同,因为您正在重新计算结果。从随机库中获取随机数每次都会不同,因此当您重新计算答案以将其打印到文件时,您会生成一个新的不同随机因子,从而更改计算

有两种相对简单的方法来解决这个问题。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.one
number.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的
对象
类:

class globalcontext(object):
    pass #we don't actually need this class to do anything fancy

我们还需要一点帮助你。。你能提供一个简单的例子来说明你遇到了什么问题,或者是重现问题所需的代码的最小部分吗?我会快速编写一个简化的版本。你可以将数据打印到GUI中,难道你不能将这些值也写到文件中吗
f.write(GUI\u数据)
,不确定随机因素会出现什么问题,应该可以正常工作same@Aaron我已经包括了一个简化版的代码非常感谢,我才刚刚开始学习python,这是我第一个大项目的一部分,所以非常感谢您的建议。很抱歉在您的帖子上留下一本书,但是,如果你有任何问题,请随意询问有关全局变量的问题,如果你给
number.func_code
赋值,这会毁了你的一天。。。一旦你进入了一些非常高级的python Tom傻瓜程序,能够修改函数对象属性是一件非常强大的事情,但这不是一件可以掉以轻心的事情,尤其是对于用户输入,因为如果你不总是提供输入的人,这可能会导致恶意代码执行。@Josh如果这对你有帮助,我希望得到投票或接受答复。(如果你认为这是垃圾,我想你也可以投反对票……)
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 ()