为什么 Python 没有 main 函数?
创始人
2025-05-28 09:32:21
0

众所周知,Python中没有所谓的main函数,但是网上经常有文章提到“ Python的main函数”和“建议编写main函数”。

其实,可能他们是想模仿真正的main函数,但是许多人都被误导(或误解),然后编写了非常笨拙的代码。

在开始讨论之前,我们先来回答以下两个问题:

  • 所谓的“main函数”究竟是什么意思?

  • 为什么有些编程语言必须编写main函数?

一些编程语言将main函数作为程序的执行入口,比如C/C++、C#、Java、Go、Rust等等,这个函数具有特定的含义:

  • main函数名是必须的,这意味着必须有一个主函数。

  • 最多只能有一个main函数,这意味着程序的入口是唯一的。

  • 语法格式有特定要求,书写形式也相对固定。

为什么必须强制main函数作为入口?

这些语言都是编译语言,需要将代码编译成可执行的二进制文件。为了让操作系统/引导程序找到程序的开头,需要定义这样一个函数。

简而言之,需要在大量可执行的代码中定义一个至关重要的的开头。

不难看出,对于这些语言来说,main函数是不可或缺的组成部分。

但是,当我们把目光转向Python时,就会发现情况大不相同。

  • Python是一种解释语言,即脚本语言。运行过程是从上到下,逐行进行的,这意味着它的起点是已知的。

  • 每个.py文件都是一个可执行文件,可作为整个程序的入口文件,意味着该程序的入口很灵活,而且无需遵循任何约定。

  • 有时运行Python项目时不需要有指定入口文件(命令行比较常见,例如“ python -m http.server 8000”),可能是因为该项目中有main.py文件,在软件包中作为“文件”来执行。

总而言之,Python作为脚本语言不同于编译语言。无论是单个模块(即.py文件),还是由多个模块组成的软件包,Python都可以选择一种灵活的执行方法,这完全不像其他语言那样必须定义入口。

换句话说,Python不需要规定程序员必须在语法上定义一个统一的入口(无论是函数、类还是其他东西)。

有些学生可能会感到困惑,因为他们经常看到或编写以下代码:

# main file  
def main():      ……  if __name__ == '__main__':      main()  

这不就是Python的main函数吗?相信很多人都这么认为!

不,并不是。

除了函数名是“main”之外,这段代码与我们前面介绍的main函数没有半点关系,这个函数既不是必须的,也不能确定程序的执行顺序。即便没有上面这样的main函数,也不会有任何的语法问题。

人们想编写一个main函数的主要原因其实是为了强调这是一个主函数,希望人为地将其设置成第一个执行的函数。

他们可能认为这个名字的函数更容易记住。

他们之所以要编写name ==‘main’,可能是因为想表明main()只在直接执行当前脚本时才运行,而在将其导入到其他模块时不要运行。

但是,我个人不推荐这种写法。

举一个简单的例子,假设只有几十行代码,或者一个脚本文件实现了一个简单的功能(一个爬虫,或画一只乌龟,等等),但都是按照前面的方式编写的。

不推荐if name == 'main’的写法,因为:

  • 首先,如果只有一个文件的话,那么这个文件不可能被导出。

  • 其次,如果有多个文件,强烈建议不要将这个语句写在入口文件(main.py)中。从理论上讲,它的内容不应该导出供其他模块使用,因为它是起点。

  • 最后,在多个文件的情况下,也不建议在非入口的文件中写入这条语句,因为这条语句能做的最多也就是编写一些测试代码。即便如此,测试代码也应分开写到专用目录或文件中。

每次看到这些笨拙的代码时,我都会感到不适。为什么要写这样的if语句?你压根不应该将这段代码包装成一个函数!

总结

  • 打破惯性思维,编写真实的代码。main函数是某些语言的唯一入口,但不应在Python中使用。你应该了解脚本语言的特征,并学习简单而优雅的风格。

  • 你可以使用main.py,而不是编写main函数。由于Python程序的执行单元是脚本文件,而不是函数或类,因此建议将入口文件命名为main.py,并根据需要决定内部的函数。

  • 将main.py作为入口文件。该文件可直接与命令行的“-m”参数结合使用。

相关内容

热门资讯

深圳百亿地块命运反转,华发股份... 房地产市场深度调整之际,深圳再度出手托底。 7月28日,华发股份公告称,全资子公司深圳融华置地投资有...
IPO严监管下,年内74家企业... 今年以来,IPO市场风起云涌,据统计,已有74家企业选择撤回或终止其上市申请。这一动态背后,监管层对...
文峰股份:股东郑素贞所持全部公... 文峰股份公告,近日,公司收到青岛中院《拍卖通知书(变卖)》,公司持股5%以上股东郑素贞持有的公司12...
美亚科技IPO进行时:票务业务... 广东美亚旅游科技集团股份有限公司(美亚科技)近日向北交所提交了第三轮问询回复,继续推进其IPO进程。...
权威发布丨25条新政出台!我市... 7月29日,烟台市人民政府新闻办公室举行新闻发布会。烟台市住房和城乡建设局党组书记、局长孙玉荣介绍加...
AI成民营银行下一个十年的 关... [ 2024年民营银行整体业绩承压明显。19家银行合计净利润187.76亿元,同比下滑8.14%。 ...
丰林集团股价微跌0.87% 子... 丰林集团股价报2.29元,较前一交易日下跌0.02元,跌幅0.87%。盘中波动区间为2.25元至2....
长安汽车:中国长安汽车集团合计... 长安汽车 视觉中国 资料图 中国长安汽车集团有限公司(下称“中国长安汽车集团”)成立后,A股上市公司...
机构席位卖出456.92万 北... 每经讯,2025年7月29日,北交所上市公司天润科技(430564,收盘价:27.16元)登上龙虎榜...
小麦集中收购即将过半 政策收储... 夏粮小麦集中收购期即将过半,小麦市场供需博弈依旧僵持。当前,政策稳价、稳市意愿仍然较强,但面粉消费需...
珠江啤酒高层变动,“华南王”何... 升任董事长一个月后,黄文胜辞去了珠江啤酒总经理一职。 近日,珠江啤酒披露公告,称因工作调整,黄文胜申...
苹果在美开“制造学院”,AI、... IT之家 7 月 29 日消息,苹果公司宣布,将在底特律开设全新的苹果制造学院(Apple Manu...
首家民营银行半年报,民商银行净... 近日,温州民商银行股份有限公司(下称民商银行)发布了2025年半年度报告,这也是首家发布半年业绩的民...
美股盘前暴跌28%!诺和诺德任... 29日周二,丹麦制药巨头诺和诺德在减肥药销售放缓导致利润预警后,提拔国际业务负责人Maziar Mi...
【广发•早间速递】聚焦再平衡,... 来源:广发证券研究 注:音频如有歧义以研究报告内容为准 研究精选 宏观:6月中游制造行业利润分化 ...
理想汽车,突然直线大跌!中概新... 今晚(7月29日),美股高开后有所回落,截至发稿,道指飘绿,纳指与标普500指数飘红。 个股方面,美...
宝安科创“兽”群图鉴更新!一医... 宝安制造业沃土再添科创标杆!近日,在深圳市工业和信息化局、深圳市中小企业服务局指导举办的2025中国...
轩竹生物:研发人数锐减,融资近... 轩竹生物科技股份有限公司(简称“轩竹生物”),这家专注于消化、肿瘤及非酒精性脂肪肝炎等重大疾病领域的...
爱柯迪涨5.52%,西南证券二... 今日爱柯迪(600933)涨5.52%,收盘报17.0元。 2025年5月2日,西南证券研究员郑连声...
中原高速连跌5天,南方基金旗下... 7月29日,中原高速连续5个交易日下跌,区间累计跌幅-6.76%。河南中原高速公路股份有限公司是经河...