Python结构是什么?

0 投票
1 回答
832 浏览
提问于 2025-04-18 18:38

我对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 个回答

5

你的问题可能会被认为不太相关或者范围太广,但如果把它改成“这段代码在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__': 条件下运行代码。

希望这些例子能帮助你更清楚一些。

撰写回答