如何在相当大的项目中使用Python/NumPy?

如何在相当大的项目中使用Python/NumPy?,python,matlab,numpy,Python,Matlab,Numpy,到目前为止,我一直在编写单脚本Python程序,主要用于文本处理和数据分析 现在,我想将我的一个旧Matlab仿真项目引入Python/NumPy。在那个项目中,我有一个主程序(在一个.m文件中)和几十个函数(每个函数在一个单独的.m文件中)。所有函数都使用全局变量,因此我不必将它们作为每个函数的参数输入。但是我不能在不运行主程序的情况下运行/测试单个函数,因为全局变量将被取消定义,或者调用另一个文件中的另一个函数。再加上文件组织混乱。添加新函数、更改现有函数(尤其是主程序)是一件痛苦的事情 这

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

现在,我想将我的一个旧Matlab仿真项目引入Python/NumPy。在那个项目中,我有一个主程序(在一个
.m
文件中)和几十个函数(每个函数在一个单独的
.m
文件中)。所有函数都使用全局变量,因此我不必将它们作为每个函数的参数输入。但是我不能在不运行主程序的情况下运行/测试单个函数,因为全局变量将被取消定义,或者调用另一个文件中的另一个函数。再加上文件组织混乱。添加新函数、更改现有函数(尤其是主程序)是一件痛苦的事情

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

我相信一定有一些标准的方法来做这件事,但我不知道


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

当您有一组共享相同全局状态的函数时:

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

至于交互式pythonshell:如果您想在Python中以交互方式工作,那么它非常有用


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

我想我找到了我要找的部分内容,这是本文的要求。可以将内容组织在模块(
.py
文件)和包(包含
\uuuu init\uuuu.py
文件的文件夹)中。通过这种方式,我可以将一组函数组合成一个模块,并将项目的所有模块放在一个包中


我仍然需要了解全局变量的

python-I script.py
将在运行脚本后的交互式提示下离开您。我不知道
Ipython
,但我敢打赌它的行为是一样的。取决于IDE,
Spyder
确实有
变量资源管理器,您可以在其中查看变量,尽管我不认为您可以像在matlab中那样保存工作空间。但是,我发现使用
print
pprint
查看变量最方便。@mgilson-IPython的行为方式与此相同。:)@塔尔瓦林--该死--我应该找个人来打赌。我本来可以从中赚点钱的。全局状态将在主函数中定义。那么在
\uuuu init\uuuu
部分,我可以写
self.foo=foo
其中
foo
是在主函数中定义的吗?@LWZ--我是说不应该在主函数中定义全局状态。你应该把它放进课堂。如果
foo
是全局状态,那么您可以将其作为
\uuuuu init\uuuuu
的参数——例如
def\uuuu init\uuuuu(self,foo):self.foo=foo
。。。然后您可以在创建类时传递它:
simulation=NoGlobal(foo)
请原谅,我真的很困惑。你的
NoGlobal
课程是做什么的?这似乎是我定义一系列函数的地方,对吗?
foo
是仅在这些函数中使用还是由所有函数共享?我不想把
foo
当作一个论据,因为我有太多的论据。我需要先阅读
class
一文…@LWZ——该类不再需要全局数据。基本上,您拥有的全局数据被传递到函数中,因此您不必显式地传递它。这就是当你调用一个方法时,类所发生的事情——你也传递了一堆状态。这里的区别是,你可以有一堆不同的类,每个类都有自己的状态,而你以前没有这样的状态。