作者 | 豌豆花下猫

来源 | Python猫(ID:python_cat)

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

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

在本文中,我们来讨论一下为什么Python没有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”参数结合使用。

python没有main函数的概念吗_为什么Python没有main函数?相关推荐

  1. python数据可视化从入门到实战_《Python编程从入门到实践》json数据可视化练习详解...

    <Python编程从入门到实践>16.2中,计算收盘价均值的程序有些不易看懂,结合我自己的理解进行一些说明. 使用的数据集:join格式的数据, 数据集是由多个字典为元素组成的列表.每个字 ...

  2. python中高阶函数和装饰器_三.Python高阶函数和装饰器

    1高阶函数 1.1 数学概念回顾下数学知识: y=f(x) 这是最开始接触的普通函数 y=g(f(x)) 这个就是我们接触到的高阶函数 在数学和计算机科学中,高阶函数至少应当是满足下面一个条件的函数: ...

  3. python函数赋值给对象_【Python核心编程笔记】一、Python中一切皆对象

    Python中一切皆对象本章节首先对比静态语言以及动态语言,然后介绍 python 中最底层也是面向对象最重要的几个概念-object.type和class之间的关系,以此来引出在python如何做到 ...

  4. python中main.py是什么意思_关于python:什么是__main__.py?

    __main__.py文件是用来做什么的,我应该把什么类型的代码放进去,什么时候应该有一个? 通常,通过在命令行中命名.py文件来运行python程序: $ python my_program.py ...

  5. python中format函数用法简书_从Python安装到语法基础,这才是初学者都能懂的爬虫教程...

    Python和PyCharm的安装:学会Python和PyCharm的安装方法 变量和字符串:学会使用变量和字符串的基本用法 函数与控制语句:学会Python循环.判断语句.循环语句和函数的使用 Py ...

  6. python 函数作用于矩阵_图解NumPy:常用函数的内在机制

    原标题:图解NumPy:常用函数的内在机制 来源: 机器之心 支持大量多维数组和矩阵运算的 NumPy 软件库是许多机器学习开发者和研究者的必备工具,本文将通过直观易懂的图示解析常用的 NumPy 功 ...

  7. 在python中定义类时、运算符重载_自定义 Python 类中的运算符和函数重载(上)...

    如果你对 Python 中的str对象使用过 + 或 * 运算符,你一定注意到了它的操作与 int 或 float 类型的区别: 你可能想知道同一内置运算符或函数如何对不同类对象进行不同操作的.这分别 ...

  8. python函数的使用方法_百度资讯搜索_python函数的使用方法

    金生水起程序猿 2020年11月22日 11:23函数语法格式及调用参数:默认值.元组和字典可变参数的使用全局变量和局部变量作用域,局部变量如何升级为全局变量函数是可重复使用的,实现单一功能的代码块. ...

  9. java min 函数的使用方法_【Python】Java程序员学习Python(五)— 函数的定义和使用...

    不想做一个待宰的羔羊!!!!要自己变得强大.... 函数的定义和使用放在最前边还是有原因的,现在语言趋于通用,基本类型基本都是那些,重点还是学习对象的使用方法,而最根本的还是方法的使用,因此优先介绍, ...

最新文章

  1. [轉]子窗口和父窗口的函数或对象能否相互访问
  2. Winform打砖块游戏制作step by step第5节---重构代码,利用继承多态
  3. 3Com发布新MSR路由器 为企业提供视频播客支持
  4. C++ 运算符优先级
  5. 前端学习(2918):v-on的补充
  6. uart口图片_uart 加强了的串口调试助手,可以自动记录传输数据,并且显示图片,示波器等功能 Com Port 编程 267万源代码下载- www.pudn.com...
  7. 第一章节 ASP.NET Web应用程序基础(一)
  8. CryptoJS 加解密类库的简单用法
  9. 哪一款信用卡累计兑换航空里程最划算?
  10. 计算机网络的对学生的利弊英语作文,关于电脑利弊的英语作文
  11. 粉笔公考——错题集——申论
  12. lol排位服务器维护赢了没加分,LOL最新排位制裁,“挂机退游戏会被限制加分,力度将逐次叠加”...
  13. 前端配置prettier工具格式化代码
  14. Pandas_规整数据_转换数据_melt()
  15. 冶金、水泥、化工行业自动化通信产品介绍
  16. RadiAnt DICOM Viewer Crack by Xacker
  17. TCP/IP详解之环回接口(loopback interface)
  18. Android P中的AVB校验(二)
  19. 西邮ctf2020 web之文件包含解析
  20. pdf.js 实现阅读pdf文件

热门文章

  1. RHEL5.8系统裁减(内含做小Linux前的准备工作)
  2. 循环 计算数值的整数次幂
  3. SAP FICO面试题目+答案
  4. 中审咨询政府行业远程接入解决方案
  5. CUDA编译器nvcc的用法用例与问题简答
  6. 常用简单的sql语句
  7. Git基本介绍(三大分区及核心内部构造)
  8. Android:获取最近打开app列表
  9. 静态检查------SourceMonitor的学习和使用
  10. window server2012服务器上如何安装nginx并启动