毫无疑问 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 里是某些主体代码

def main():

……

if __name__ == '__main__':

main()

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

非也!非也!

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

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

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

对于这些“知情人”,他们有一定的道理。

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

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

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

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

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

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

可以的话,使用__main__.py作为入口文件。这个文件结合命令行的“-m”参数使用,非常好用。推荐阅读:为什么是 Python -m

不推荐写if __name__ == '__main__'。首先,如果只有一个文件的话,因为不存在导出的可能,不建议写。其次,存在多文件时,入口文件(main.py)中极不推荐写这一句,此文件的代码逻辑应该精炼,理论上其内容不该被导出到其它模块使用,因为它是起点!最后,多文件的非入口文件也不建议写,因为在非入口文件中写这个判断,最大的作用就是写一些测试代码,但是测试代码应该分离出来,写到专门的目录或文件中。

小结:本文首先解释了什么是 main 入口函数,以及为什么某些语言会强制要求写 main 函数;接着,解释了为什么 Python 不需要写 main 函数;最后则是针对某些人存在的惯性误区,分享了我个人的四点编程经验。

以上就是Python 没有main函数的原因的详细内容,更多关于Python main函数的资料请关注我们其它相关文章!

本文标题: Python 没有main函数的原因

本文地址: http://www.cppcns.com/jiaoben/python/324930.html

python程序一定要有主函数_Python 没有main函数的原因相关推荐

  1. c++语言程序中,要调用的函数必须在main()函数中定义,惠州学院C++考试复习题

    惠州学院C++复习题 一.选择题 1.C++的源文件的扩展名是_____C____. A.h B.obj C.cpp D.exe 2.下列选项能够作为C++变量名的是___C____. A.false ...

  2. 【Linux 内核】进程管理 ( 进程状态 | 进程创建 | 进程终止 | 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 )

    文章目录 一.进程状态 二.进程创建 三.进程终止 ( 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 ) 一.进程状态 Linux 进 ...

  3. Linux-C基础知识学习:C语言作业-将5个学生成绩保存在一个数组中,单独实现一个计算平均成绩的average函数, 在main函数中获取该函数返回的平均值,并打印。

    Linux基础知识学习 C语言作业:将5个学生成绩保存在一个数组中,单独实现一个计算平均成绩的average函数, 在main函数中获取该函数返回的平均值,并打印. #include <stdi ...

  4. python主函数的作用_python中main函数的用法

    原博文 2020-03-27 20:25 − **什么场景下会有main函数?** 当该python脚本被作为模块(module)引入(import)时,其中的main()函数将不会被执行. **ma ...

  5. python程序语言的提示符是什么_Python基础之语言简介

    python是什么 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言,其设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特 ...

  6. python程序设计基础教程骆焦煌_Python程序设计基础教程

    本书依据全国计算机等级考试二级Python语言程序设计考试大纲撰写,同时根据实际需要增加图形用户界面和网络爬虫与数据分析内容.本书以Python 3.6和Anaconda3版本为背景,介绍Python ...

  7. python程序怎么保存到u盘_Python 骚操作,自动拷贝U盘

    阅读文本大概需要 6 分钟. Python 这门语言有非常多有趣的内容,比如给微信好友自动发消息.查看微信好友撤回的消息.通过微信控制电脑等等.在我公众号上也分享过很多有趣的程序,近期我会去搜集一些骚 ...

  8. python编程函数_python编程中函数和参数你必须知道的

    今天我们先聊少一点,就聊聊函数是什么和函数的参数,以及对这两个东西的思考 起源于抽象 在程序员写代码的时候,通常都会提到一个词叫抽象, 很多人都知道在面向对象中,将一个对象抽象为一个类,其实这就是我们 ...

  9. python中main的含义及用法_python中main函数的用法

    Python Python开发 Python语言 python中main函数的用法 什么场景下会有main函数? 当该python脚本被作为模块(module)引入(import)时,其中的main( ...

最新文章

  1. python合并路径_python url合并与分离
  2. Little Sub and Sequence
  3. C++之invalid initialization of non-const reference of type ‘int’ from an rvalue of type ‘int’
  4. 世界粮农组织五大健康食品_粮农组织的完整形式是什么?
  5. 安装PowerDesigner造成Office2007鼠标无法正常使用
  6. C/C++学习笔记:C语言实现任意进制转换,代码全解析!
  7. 振动系统零频率和重频率问题探讨
  8. 接口里面能有构造器吗?_家用弱电箱里空空如也,装修时应该怎么在里面接线呢?能拆掉吗?...
  9. Java常量池学习总结-1
  10. 卷组删除pv_CentOS下删除一个卷组(VG)
  11. 从语音识别到语义识别,中间还有多长的路要走?-模拟/电源-与非网
  12. java 删除list_Java 删除List元素的正确方式
  13. ASTER文字识别详解
  14. Android源码提取系统签名
  15. 【Scratch案例实操】Scratch小狗散步 scratch编程案例教学 scratch创意编程 少儿编程教案
  16. 知识图谱在推荐系统中的应用全面调研
  17. VMware搭建KMS服务器(VLMCSD)
  18. [编程题]山寨金闪闪 (面试题)
  19. Macbook 开机黑屏
  20. win7注册表关闭防火墙服务器,win10怎么关闭防火墙服务?注册表方法关闭防火墙方法...

热门文章

  1. 按群计数10以内_大班数学活动:按群计数
  2. systemctl与mysql多实例_mysql mariadb 多版本多实例 开机启动
  3. js中setTimeout的用法和JS计时器setTimeout与setInterval方法的区别和confirm方法
  4. completablefuture 线程池_SpringBoot中如何优雅的使用多线程
  5. 中央财经大学计算机专业排名,中央财经大学怎么样 2021年全国排名多少
  6. c语言中缺少link文件夹,c – Cmake找不到使用“link_directories”的库
  7. 【uni-app】swiper 实现纵向轮播,且支持鼠标滚轮滚动翻页
  8. nginx: [warn] the “ssl“ directive is deprecated, use the “listen ... ssl“ directive instead in
  9. windows SVN服务器软件
  10. java 铺地板问题_铺木地板的5大注意事项,我家接连踩坑接近“崩溃”,大家别再犯...