毫无疑问,Python中没有所谓的 main 入口函数,但在网上经常有文章提到“Python中的main函数”和“建议编写main函数”等。

他们的目的可能是模仿真实的 main 函数,但是经常有很多人被误导(或误解)并编写非常繁琐的代码。

在开始本文之前,让我们回答以下两个问题:

  • 所谓“ main 函数”是什么意思?
  • 为什么有些编程语言需要强制编写一个 main 函数?

一些编程语言使用 main 函数作为程序的执行入口,如C/C++、C语言、java、GO、RIST等,这些语言具有特定的含义:

  • 这个 main 函数名是必需的,这意味着必须有一个 main 函数。
  • 最多只能有一个 main 函数,这意味着程序的条目是唯一的。
  • 语法格式有特定要求,带有相对固定的模板。

为什么要强制使用 main 入口函数?

这些语言是编译语言,需要将代码编译成可执行的二进制文件,以便操作系统引导加载程序找到程序的开头,因此需要定义这一个函数。

简单地说,有一个重要的开始需要定义在一大堆可以用于执行的代码中。

不难看出,main 函数是这些语言不可或缺的有机组成部分。

但是,当我们再次审视Python时,情况就完全不同了。

  • Python是一种解释语言,即脚本语言。运行过程是自上而下,逐行进行的,这意味着它的起点是已知的。
  • py 文件是一个可执行文件,可以作为整个程序的入口文件,这意味着程序的入口是灵活的,不必遵循任何约定
  • 有时候,我们运行Python项目时,没有指定入口文件(命令行比较常见,如“python -m http.server 8000”),可能是 main.py 文件,它在包中作为“文件”执行。

总之,这意味着脚本语言 Python 与编译语言不同。无论是在单个模块级别(即.py文件),还是在由多个模块组成的包级别,它都可以选择灵活的执行方法,这与其他没有定义良好的条目就无法实现的语言不同。

换句话说,Python不需要规定程序员必须在语法级别定义一个统一的条目(无论它是函数、类还是什么)。

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

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

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

不是!

除了函数名是“ main”之外,它与我们之前介绍的正统main函数没有半分的关系,既不是强制的,也不一定决定程序执行的顺序。没有它,也不会引起任何语法问题。

有些人想命名“main”函数的原因实际上是为了强调其“main”地位,想将其安排为人为执行的第一个函数。

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

他们之所以要编写__name__ =='__main__'的原因,可能是想表明main()仅在直接执行当前脚本时才运行,而在将其导入其他模块时不希望运行。

但是,我个人不推荐这种书写方式。

最明显的例子是:只有几十行代码或者只是一个脚本文件实现了一个简单的功能(一个小爬虫,用乌龟画一幅画等等),而且它们都是用与过去相同的样式来编写的。

建议不要在 name__ =='__main' 时写入:

  • 首先,如果只有一个文件,因为没有导出的可能。
  • 其次,如果有多个文件,强烈建议不要在入口文件(main.py)中写这句话。从理论上讲,因为它是起点,所以不应导出其内容以供其他模块使用。
  • 最后,也不建议在具有多个文件的非进入文件中写入此判断,因为最多可以做的就是编写其中一些测试代码。尽管如此,测试代码仍应分开并写在专用目录或文件中。

每当我不经意间看到这些繁琐的代码时,都会感到不舒服。为什么要写这个 if 语句?如果可能的话,你应该拆分 main 函数,甚至不要把它包装成一个函数!

总结

  • 打破惯性思维,写出真实的代码。main 入口函数对于某些语言是唯一的,但是不应该在Python中进行使用。你应该了解脚本语言的特点,写出简单优雅的代码风格。
  • 使用 main.py 而不是 main()。因为Python的程序执行单元是一个脚本文件,而不是函数或类,因此建议命名入口文件 main.py,并根据需要确定内部函数。
  • 如果可能,使用 main.py 作为入口文件。该文件可以直接与命令行上的“-m”参数结合使用。

--END--

PS.本文是豌豆花下猫的文章,他的公众号是:Python猫(python_cat),大家可以去关注这个Python大牛哈~

喜欢本文的同学记得转发+点赞~

更多内容,欢迎大家关注我们的公众号:为AI呐喊(weainahan)

python强制结束函数_为什么Python没有 main 函数?终于有人给出了正确答案!相关推荐

  1. python 强制结束线程_在python中实现强制关闭线程的示例

    Python 如何强制关闭线程过去只可以用来回忆,别沉迷在阴影中,否则永远看不清前面的路. Python用sleep停止一个线程的运行,而不影响主线程的运行,案例代码如下: from threadin ...

  2. python强制暂停线程_关于python:使用ThreadPoolExecutor强制线程超时

    我正在升级我的代码以使用ThreadPoolExecuter,并希望能够超时需要超过几秒钟处理的任何线程. 是否可以在作为线程池一部分的线程上强制超时? 我正在使用的代码如下. 1 2 3 4 5 6 ...

  3. python四大高阶函数_详谈Python高阶函数与函数装饰器(推荐)

    一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首 ...

  4. python deepcopy函数_用Python解数独[6]:递归获得最终答案

    目录 用Python解数独[0] 用Python解数独[1]:求每个单元格的行值域 用Python解数独[2]:求列值域和九宫格值域 用Python解数独[3]:求总值域 用Python解数独[4]: ...

  5. python整数转换字符串_使用Python中的str()函数将整数值转换为字符串

    python整数转换字符串 Given an integer value and we have to convert the value to the string using str() func ...

  6. python isalnum函数_探究Python中isalnum()方法的使用

    探究Python中isalnum()方法的使用 isalnum()方法检查判断字符串是否包含字母数字字符. 语法 以下是isalnum()方法的语法: str.isa1num() 参数 NA 返回值 ...

  7. assert函数_悉数Python函数传参的语法糖

    TIOBE排行榜是程序开发语言的流行使用程度的有效指标,对世界范围内开发语言的走势具有重要参考意义.随着数据挖掘.机器学习和人工智能相关概念的风行,Python一举收获2018年年度语言,这也是Pyt ...

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

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

  9. python字符串的内部函数_「Python」字符串操作内置函数

    目录: capitalize casefold center count encode decode endswith expandtabs find format format_map index ...

最新文章

  1. 初步判断内存泄漏方法
  2. MySQL事务的四种隔离级别,mysql中的不可重复读和幻读的区别,Repeatable read可重复读隔离级别下怎么不存在幻读问题?
  3. Qt Creator将QML模块与插件一起使用
  4. MySQL5.6 Performance_schema
  5. JS ES6中export和import详解
  6. iOS基础-高级视图-UITableView--静态单元格
  7. 计算机应用基础案例教程总结,计算机应用基础案例教程
  8. android确认密码代码,Android手机卫士之确认密码对话框
  9. OpenShift 4 之获取OpenShif的最新开发进度
  10. 周鸿祎:做产品体验先把自己切换到二傻子模式
  11. WordPress使用360CDN替换google服务,解决WordPress打开速度变慢问题
  12. 一文详细理解计算机网络 - 物理层(考试和面试必备)
  13. 多台路由器堆叠_h3c路由器堆叠配置命令
  14. python三维图形等高线_python等高线
  15. 查看计算机CPU核心数和线程数
  16. 读了100多本书只向你推荐这6本(豆瓣评分8.0以上)
  17. 线性代数之——正定矩阵
  18. 网站采集器,网站采集工具(图文教程)
  19. linux串口操作及设置
  20. java 计算行驶里程,js根据经纬度换算行驶里程

热门文章

  1. java 开发人员工具_Java开发人员应该知道的5种错误跟踪工具
  2. zookeeper 负载_ZooKeeper,策展人以及微服务负载平衡的工作方式
  3. 针对JDK 14提议的另外六个JEP
  4. java8 base64_Java 8中的Base64 –加入乐趣为时不晚
  5. java 将光标移至行首_Java:将条件移至消息文件
  6. spring 事务 会话_测试Spring的“会话”范围
  7. 如何使用Spring设置安全的REST API
  8. JDK 9 @不建议使用的注释增强功能
  9. 使用Java查询DynamoDB项
  10. bird 报表_轻松完成Birt报告