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

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为什么”系列文章(Python猫出品),该系列主要关注 Python 的语法、设计和发展等话题,以一个个“为什么”式的问题为切入点,试着展现 Python 的迷人魅力。部分话题会推出视频版,请在 B 站收看,观看地址:视频地址

公众号【Python猫】, 本号连载优质的系列文章,有Python为什么系列、喵星哲学猫系列、Python进阶系列、好书推荐系列、技术写作、优质英文推荐与翻译等等,欢迎关注哦。

python一定要有主函数_Python 为什么没有 main 函数?为什么我不推荐写 main 函数?...相关推荐

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

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

  2. python 常用内置函数_Python小白必备的8个最常用的内置函数(推荐)

    Python给我们内置了大量功能函数,官方文档上列出了69个,有些是我们是平时开发中经常遇到的,也有一些函数很少被用到,这里列举被开发者使用最频繁的8个函数以及他们的详细用法 print() prin ...

  3. python拷贝文件函数_python笔记2小数据池,深浅copy,文件操作及函数初级

    小数据池就是在内存中已经开辟了一些特定的数据,经一些变量名直接指向这个内存,多个变量间公用一个内存的数据. int: -5 ~ 256 范围之内 str: 满足一定得规则的字符串. 小数据池: 1,节 ...

  4. python获取系统时间函数_Python常用时间操作总结【取得当前时间、时间函数、应用等】...

    本文实例讲述了Python常用时间操作.分享给大家供大家参考,具体如下: 我们先导入必须用到的一个module >>> import time 设置一个时间的格式,下面会用到 > ...

  5. python字典的内置函数_python – 用于字典转换的特殊方法名称的内置函数

    我一直在深入研究Python类中的运算符重载和特殊方法,并且我注意到许多内置函数具有等效的特殊方法名称: > int(x)调用x .__ int __() > next(x)在Python ...

  6. python获取代码当前行数_Python实验室一段日志代码,获取当前调用的函数名和行号...

    代码如下: #............. class CrawlerLog(object): def __init__(self, logName=None): #............ self. ...

  7. 利用python做一个游戏主播_Python爬取2000万直播数据——看20万游戏主播能否月入100万...

    作者 | 朱小五and王小九 来源 | 凹凸数读 她那时候还太年轻,不知道命运赠送的礼物,早已暗中标好了价格. --茨威格 社会在发展,时代在进步.伴随着未曾停息的拥护声和反对声,电竞行业逐渐被接受, ...

  8. python字符串的定界符不能是_Python|字符串str的构造、操作(操作符、函数、方法)...

    s = 'a' #使用单引号定义一个单字符 s0 = "hi,python" #直接通过定义描述构造字符串(双引号) print(s,'\n',s0) list1 = [1,1,2 ...

  9. python怎么把程序封装成函数_PYTHON中如何把固定格式代码,封装成一个函数?

    图片压缩的太厉害了,看不清楚,代码如下: with open('movies.csv', 'r') as f: reader = csv.reader(f) texts = list(reader) ...

  10. python3 转码的函数_python基础3之文件操作、字符编码解码、函数介绍

    内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: 1 #/usr/bin/e ...

最新文章

  1. python病毒扫描器_基于Python的病毒扫描机制
  2. 2012 iis php mysql_Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建wordpress博客教程
  3. 混合运算lcd显示_各界巨头寄予厚望 MicroLED靠什么成为显示屏的未来
  4. HDU1058 Humble Numbers
  5. 工业机器人入门实用教程_机器学习实用入门
  6. ssl1333-地鼠的困境【二分图,最大匹配,图论】
  7. 《MySQL——如何解决一主多从的读写分离的过期读问题》
  8. 计算机多媒体设计徽章,酷毙了:Hackaday将会议徽章设计成一台可编程的电脑
  9. java 正则表达式 table_Java 使用正则表达式
  10. 电子计算机工程学,电子计算机工程学荣誉工学士资料.ppt
  11. 具备这些特征,轻松进入互联网大厂成为web前端工程师
  12. 计算机职业英语一级,计算机职业英语一级
  13. Python SimpleHTTPServer – Python HTTP服务器
  14. Git常用指令的使用
  15. Python开发制作酷狗和QQ音乐下载器
  16. 论自律对成长的重要性
  17. Hive中自定义函数详解
  18. Android--DES加密解密
  19. 从源码分析Android的Glide库的图片加载流程及特点
  20. 牛客小白月赛58 B(暴力)C(思维)D(dp滚动数组优化)

热门文章

  1. Hadoop学习笔记(二):MapReduce的进度和状态
  2. Selectsort Tournamentsort Heapsort
  3. 5.hbase表新增数据同步之add_peer
  4. 解决Ubuntu下Sublime Text 3无法输入中文
  5. 3 Git服务器搭建
  6. 【译】BMP格式与JPG格式之间的区别
  7. (转)UML类图与类的关系详解
  8. 想活得开心,请放下这7样:烦恼、自卑、懒惰、消极、抱怨、犹豫、狭隘
  9. 讲座资源:ASP.NET AJAX 体验
  10. 【学堂在线数据挖掘:理论方法笔记】第五天(3.29)