Python的结构?

时间:2014-08-26 20:49:16

标签: python matlab numpy

我是一个精通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中执行此操作的最佳方法。我已经读过堆栈交换,从其他脚本调用python脚本是不好的,即使那时传递变量也很困难。另外,我不想有一些大型脚本,我在上面定义了很多python代码,然后在同一个脚本中调用它们。

道歉,如果这是非常模糊的,但是python"应该如何"看起来令我困惑

由于

1 个答案:

答案 0 :(得分:5)

您的问题可能会因为偏离主题或过于宽泛而被关闭,但我认为这是一个很好的问题,如果将其改为" python相当于此代码"。

一般来说,这是很多来自matlab的人都会感到困惑的。在python中,事物被分成"命名空间"并且您需要从其他文件显式导入函数/变量/ etc。

代码的常见高级结构


在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()

最后一部分可能看起来有点令人困惑。所说的基本上是"只有在直接运行此文件时才执行此块中的代码。如果我们只是从中导入功能,那么就不要运行任何东西。" (对此有很多解释,例如What does if __name__ == "__main__": do?

如果你愿意,你可以这样做:

def main():
    ...

def other_things():
    ...

main()

如果您只是运行该文件,您将获得相同的结果。不同之处在于我们从其他地方导入此代码时会发生什么。 (在第一个示例中,main将不会被调用,而在第二个示例中,它将被调用。)

在其他文件中调用函数


随着事态的发展,您可能决定将其中的一部分拆分为单独的文件。例如,我们可能会将一些函数放在名为data.py的文件中,将其他函数放在名为model.py的文件中。然后我们可以将这些文件中的函数导入另一个文件,其中"管道"已建立起来(我们甚至可能称之为main.py,或者更具描述性。)

与matlab不同,我们需要明确import这些文件。我不打算在这里详细介绍,但是import基本上会尝试在" library"中找到具有指定名称的文件或包(具有特定结构的目录)。位置,然后在与正在运行的文件相同的目录中(在2.7中更改了首选项顺序 - 用于取代库文件的本地文件)。

在下面的示例中,import data将导入文件"data.py"中的函数和变量(import model也是如此)。该文件中的函数等位于"命名空间"称为data,因此我们需要以这种方式引用它们。 (请注意,您可以from data import *将它们带入全局命名空间,但除非您处于交互式shell中,否则您确实应该避免这种情况。)

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__':有条件的情况下运行。

希望这些例子有助于澄清一些事情。