如何在相当大的项目中使用Python/NumPy?
到目前为止,我一直在编写单脚本Python程序,主要用于文本处理和数据分析 现在,我想将我的一个旧Matlab仿真项目引入Python/NumPy。在那个项目中,我有一个主程序(在一个如何在相当大的项目中使用Python/NumPy?,python,matlab,numpy,Python,Matlab,Numpy,到目前为止,我一直在编写单脚本Python程序,主要用于文本处理和数据分析 现在,我想将我的一个旧Matlab仿真项目引入Python/NumPy。在那个项目中,我有一个主程序(在一个.m文件中)和几十个函数(每个函数在一个单独的.m文件中)。所有函数都使用全局变量,因此我不必将它们作为每个函数的参数输入。但是我不能在不运行主程序的情况下运行/测试单个函数,因为全局变量将被取消定义,或者调用另一个文件中的另一个函数。再加上文件组织混乱。添加新函数、更改现有函数(尤其是主程序)是一件痛苦的事情 这
.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——该类不再需要全局数据。基本上,您拥有的全局数据被传递到函数中,因此您不必显式地传递它。这就是当你调用一个方法时,类所发生的事情——你也传递了一堆状态。这里的区别是,你可以有一堆不同的类,每个类都有自己的状态,而你以前没有这样的状态。