Python的结构?

use*_*604 0 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
 -----------
Run Code Online (Sandbox Code Playgroud)

好吧,你明白了.拥有一个干净的主函数很好,因此很容易传递用户定义的变量等.

问题是我不知道在python中执行此操作的最佳方法.我已经阅读了所有堆栈交换如何从其他脚本调用python脚本是不好的,即使那时传递变量也很困难.另外,我不想有一些大型脚本,我在上面定义了很多python代码,然后在同一个脚本中调用它们.

如果这是非常模糊的道歉,但是python"应该"看起来的一般结构让我感到困惑

谢谢

Joe*_*ton 5

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

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

常见的高级代码结构


在matlab中(如果我没记错的话),你不能在同一个文件中使用"bare"语句.在python中你可以.但是,您无法在定义函数之前调用它.

换句话说,你可以这样做:

def foo():
    print 'bar'

foo()
Run Code Online (Sandbox Code Playgroud)

但不是:

foo()

def foo():
   print 'bar'  
Run Code Online (Sandbox Code Playgroud)

因此,因为您通常希望在文件顶部使用"大纲级别"代码,所以通常将其放入函数中,然后在定义其他函数后在底部调用该函数.通常情况下,您可以调用此功能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()
Run Code Online (Sandbox Code Playgroud)

最后一部分可能看起来有点令人困惑.所说的基本上是"只有在直接运行此文件时才执行此块中的代码.如果我们只是从中导入函数,请不要运行任何东西." (对此有很多解释,例如,如果__name__ =="__ main__":怎么办?)

如果你想,你可以这样做:

def main():
    ...

def other_things():
    ...

main()
Run Code Online (Sandbox Code Playgroud)

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

在其他文件中调用函数


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

与matlab不同,我们需要明确import这些文件.我不会在这里详细介绍,但是import基本上会尝试在"库"位置找到一个具有指定名称的文件或包(具有特定结构的目录),然后在与正在运行的文件相同的目录中(在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)
Run Code Online (Sandbox Code Playgroud)

请注意,我没有费心将这个包装成一个main函数.我们当然可以.我在这里没有这样做的原因是你可能不想从这个简短的"main.py"文件中导入一些东西.因此,我们不需要在if __name__ == '__main__':有条件的情况下运行.

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