Python结构是什么?
我对MATLAB有点了解,但现在想把这些技能转到Python上,希望能为将来的工作机会打下基础。比如,在做机器学习的时候,我喜欢MATLAB,因为我可以把我的函数写得很整洁,像下面这样:
main.m
------------
prescreen_fn(directory,threshold) %a prescreen function that is run
plot_prescreen_hits(directory) %plot and print prescreen hits
extract_features(directory,fft_size) %extract features from prescreen hit locations
generate_train_test(directory) %parse training and testing data
SVM_train_test(directory) %perform SVM training and testing
-----------
你明白我的意思了吧。能有一个整洁的主函数,方便传递用户定义的变量等等,这样很好。
问题是,我不知道在Python中怎么做到这一点。我在Stack Exchange上看到很多人说,从一个Python脚本调用另一个脚本是不好的做法,而且传递变量也很麻烦。另外,我也不想写一个很大的脚本,把很多Python代码都放在上面,然后再在下面调用它们。
抱歉如果我说得很模糊,但我对Python的整体结构感到困惑。
谢谢!
1 个回答
你的问题可能会被认为不太相关或者范围太广,但如果把它改成“这段代码在Python中怎么写”,我觉得还是个好问题。
一般来说,很多从Matlab转过来的人会对这个感到困惑。在Python中,代码是分成“命名空间”的,你需要明确地从其他文件中导入函数、变量等。
代码的常见高层结构
在Matlab中(如果我没记错的话),你不能在同一个文件里有“裸露”的语句和函数。而在Python中是可以的。不过,你不能在函数定义之前调用它。
换句话说,你可以这样做:
def foo():
print 'bar'
foo()
但不能这样:
foo()
def foo():
print 'bar'
因此,因为你通常希望“轮廓级别”的代码在文件的顶部,所以通常会把它放到一个函数里,然后在其他函数定义完之后在底部调用这个函数。通常,你会把这个函数叫做 main
,但你可以随意命名。
举个简单的例子:
def main():
directory = load_data()
threshold, fft_size = 10, 1000
prescreen_fn(directory,threshold)
plot_prescreen_hits(directory)
extract_features(directory,fft_size)
generate_train_test(directory)
SVM_train_test(directory)
def prescreen_fn(directory, threshold):
"""A prescreen function that is run. Ideally this would be a
more informative docstring."""
pass
def plot_prescreen_hits(directory):
pass
def extract_features(directory,fft_size):
pass
def generate_train_test(directory):
pass
def SVM_train_test(directory):
pass
def load_data():
pass
if __name__ == '__main__':
main()
最后一部分可能看起来有点 confusing。它的意思基本上是“只有当这个文件直接运行时,才执行这个代码块。如果我们只是从中导入函数,就不要运行任何东西。”(关于这个有很多解释,比如if __name__ == "__main__": 是干什么的?)
如果你愿意,你可以直接这样做:
def main():
...
def other_things():
...
main()
如果你直接运行这个文件,你会得到相同的结果。不同的是,当我们从其他地方导入这段代码时会有不同的表现。(在第一个例子中,main
不会被调用,而在第二个例子中会被调用。)
调用其他文件中的函数
随着项目的扩大,你可能会决定把一些代码分到不同的文件里。例如,我们可以把一些函数放在一个叫 data.py
的文件里,把其他的放在一个叫 model.py
的文件里。然后我们可以把这些文件中的函数导入到另一个文件中,在那里构建“管道”(我们甚至可以把这个文件叫做 main.py
,或者取个更描述性的名字)。
与Matlab不同,我们需要明确地 import
这些文件。我这里不详细讲解,但导入基本上是先在“库”位置寻找指定名称的文件或包(有特定结构的目录),然后再在运行的文件所在的目录中寻找(在2.7版本中,优先顺序有所改变——本地文件会优先于库文件)。
在下面的例子中,import data
会导入 "data.py"
文件中的函数和变量(import model
也是如此)。那个文件中的函数等在一个叫 data
的“命名空间”里,所以我们需要用这种方式来引用它们。(注意,你可以用 from data import *
把它们导入到全局命名空间,但除非你在交互式环境中,真的应该避免这样做。)
import data
import model
directory = data.load_data()
threshold, fft_size = 10, 1000
data.prescreen_fn(directory, threshold)
data.plot_prescreen_hits(directory)
data.extract_features(directory, fft_size)
model.generate_train_test(directory)
model.SVM_train_test(directory)
注意我没有把这个包裹在 main
函数里。我们当然可以这样做。我之所以不这样做,是因为你大概不会想从这个简短的“main.py”文件中导入任何东西。因此我们不需要在 if __name__ == '__main__':
条件下运行代码。
希望这些例子能帮助你更清楚一些。