3

到目前为止,我一直在编写单脚本Python 程序,主要用于文本处理和数据分析。

现在我想把我的一个旧的 Matlab 模拟项目带到 Python/NumPy。在那个项目中,我有一个主程序(在一个.m文件中),其中有几十个函数(每个函数都在一个单独的.m文件中)。所有函数都使用了全局变量,因此我不必将它们作为每个函数的参数输入。但是如果不运行主程序,我就无法运行/测试单个函数,因为全局变量将是未定义的,或者它会调用另一个文件中的另一个函数。再加上文件组织是一团糟。添加新功能,更改现有功能,尤其是主程序是很痛苦的。

这次我想把事情做好。我希望程序有一个适当的架构,如果它是正确的词。首先,我需要知道如何组织所有这些功能。我不认为每个小功能都有自己的文件是一个好主意。我想也许我可以将这些功能分成几组,每组可以是一个文件?它是.py文件还是其他类型的文件?其次,我希望它易于扩展,我可以轻松添加新功能。

我相信必须有一些标准的方法来做到这一点,但我不知道。

还有一个问题:当我运行一个 Matlab 程序时,它完成后,我仍然拥有工作区中的所有变量,所以我仍然可以检查数字,制作绘图等。但是当我通过 IPython shell 运行我的 python 脚本时,它之后清除所有内容。有没有和工作区类似的东西?

4

3 回答 3

5

任何时候你有一堆函数共享相同的全局状态:

foo = 1
def do_something1():
    print foo

def do_something2():
    global foo
    foo += 1

你最好定义一个类:

class NoGlobal(object):
     """docstring -- Pick a better name for your class please :)"""

     def __init__(self):
          self.foo = 1

     def do_something1(self):
          print self.foo

     def do_something2(self):
          self.foo += 1

现在您没有共享全局状态,您可以随心所欲地运行您的“模拟”,而无需处理您的全局变量——只需实例化一个新的类实例,您就可以开始新的模拟了。

至于离开它以便您可以在脚本终止后玩弄一些东西,这就是该-i选项的用途:

python -i yourscript.py
于 2013-02-13T02:15:16.803 回答
2

至于交互式 Python shell:如果您想在 Python 中交互式工作, IPython非常有用。

以 pylab 模式启动:ipython --pylab为您提供具有类似 Matlab 功能的交互式 python shell(包numpymatplotlib中的名称已导入范围。)您还可以保存会话或加载存储的会话和任意 python 程序。

于 2013-02-13T06:51:47.077 回答
1

我想我找到了我正在寻找的部分内容,这是在这个问题中提出的。可以将事物组织在模块(.py文件)和包(带有__init__.py文件的文件夹)中。这样,我可以将一堆函数组合成一个模块,并将项目的所有模块放在一个中。

我仍然需要了解class全局变量。

于 2013-02-13T23:31:44.827 回答