python不需要main_Python 为什么没有 main 函数? 为什么我不推荐写 main 函数?

Python 为什么没有 main 函数? 为什么我不推荐写 main 函数?

毫无疑问 Python 中没有所谓的 main 入口函数, 但是网上经常看到一些文章提 "Python 的 main 函数","建议写 main 函数"......

有些人是知情的, 他的意图可能是模仿那些正宗的 main 函数, 但还有不少人明显是被误导了(或自己误解了), 就写出来很累赘的代码.

本期 "Python 为什么" 栏目来聊聊 Python 为什么没有 main 函数?

在开始正题之前, 先要来回答这两个问题: 所谓的 "main 函数" 是指什么? 为什么有些编程语言需要强制写一个 main 函数?

某些编程语言以 main 函数作为程序的执行入口, 例如 C/C++,C#, Java,Go 和 Rust 等, 它们具有特定的含义:

main 函数名是强制的, 也就是要求必须有一个 main 函数

main 函数最多只能有一个, 也就是说程序的入口是唯一的

语法格式有一定的要求, 具有相对固定的模板

为什么要强制一个 main 入口函数呢?

这些语言是编译型语言, 需要把代码编译成可执行的二进制文件, 为了让操作系统 / 启动器找到程序的起点, 所以要约定这一个函数. 简单地说, 就是在一大堆代码里, 需要定义一个显著的可用于执行的开头.

不难看出, main 函数是那些语言中重要而不可缺的有机组成部分.

然而, 我们再来看看 Python, 情况就大不相同了.

Python 是解释型语言, 即脚本语言, 运行过程是从上往下, 逐行解析运行, 也就是说它的起点是可知的

每个 .py 文件就是一个可执行文件, 都可作为整个程序的入口文件, 也就是说程序的入口是灵活可变的, 没有必须遵守的约定

有时候运行 Python 项目, 并没有指定入口文件(命令行中较常见, 例如 "python -m http.server 8000"), 那可能是存在 __main__.py 文件, 它所在的包被当成一个 "文件" 来执行了

归结起来, 意思是说 Python 这种脚本语言跟编译型语言不同, 它不管是在单个模块层面(即一个 .py 文件), 还是在由多个模块组成的包层面, 都可选择灵活的执行方式, 不像其它语言缺了约定好的入口就没法执行.

也就是说, Python 没有必要在语法层面规定程序员必须定义出一个统一的入口(不管是函数还是类还是什么东西).

有些同学可能会有疑惑, 因为他们经常看到或者自己写出下面这样的代码:# main 里是某些主体代码

defmain():

......

if__name__=='__main__':

main()

难道这不就是 Python 的 main 函数么? 相信有不少同学会这么想!

非也! 非也!

除了函数名是 "main" 以外, 它跟我们前面介绍的正统的 main 函数没有半毛钱关系, 既没有强制性, 也没有必然决定程序执行顺序的作用. 缺少它, 也不会导致什么语法问题.

之所以有些知情人要命名出一个 "main" 函数, 其实是想强调它的 "主要" 地位, 想要人为地安排它作为第一个执行的函数. 他们可能认为这样命名的函数, 比较容易记忆.

之所以有些知情人要写 if __name__ == '__main__' , 可能想表明 main() 只有在当前脚本被直接执行时才运行, 不希望被导入其它模块时运行.

对于这些 "知情人", 他们有一定的道理.

但是, 我个人并不推荐这种写法, 甚至有时候会非常反感!

最明显的例子: 明明只有几十行代码, 或者仅有一个脚本文件, 实现一个简单的功能(一小段爬虫, 用 turtle 画张图等等), 但是它们都按前面的样式写了.

我每次看到这种不假思索的累赘代码, 就觉得难受. 为什么要写那行 if 语句呢? 可能的话, 应该拆分 main 函数, 甚至不必封装成一个函数啊!

我个人总结出以下的经验:

打破惯性思维, 写出地道的代码. main 入口函数是某些语言特有的, 不该在 Python 中 "照猫画虎", 应该了解脚本语言的特点, 写出简洁优雅的风格

使用 main.py 而非 main(). 因为 Python 的程序执行单位其实是脚本文件, 而非某个函数或者类, 所以建议把入口文件命名为 main.py, 内部的函数按需求而定

来源: https://www.cnblogs.com/pythonista/p/13040342.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值