当前位置: 首页 > 编程日记 > 正文

为什么Python没有main函数?


作者 | 豌豆花下猫

来源 | 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 filedef 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”参数结合使用。

推荐阅读

  • 认知智能,AI的下一个十年 | AI Procon 202

  • 台积电9月14日断供华为:中国“芯”的坎坷之路

  • 2020 美国大选在即,又到了 AI 花式打击假新闻的季节

  • 业界首发|云原生领域首本架构白皮书重磅发布

  • 观点 | 以太坊客户端多样性问题从何而来?

点分享点点赞点在看

相关文章:

HTTP访问服务的相关解释

一、访问网站的基本流程第一步:客户端用户在浏览器输入www.51cto.com网站,回车后,系统首先会查找系统本地的DNS缓存及hosts文件信息,确定是否存在www.51cto.com余名对应的IP解析记录,如果有就直接获取IP地址&#xff0…

关于ASP.Net中的时间处理

作者: 飞刀 www.ASPCool.com 时间:2001-8-8 这里我想谈谈ASP.Net中对时间的处理 在ASP.Net中,M$为我们提供一种名为DateTime的对象,我们用这个对象来取得当前的时间。比如: DateTime dtDateTime.Now; 在上面…

还缺30万人!程序员2020年要过好日子了……

最近,程序员届有一个重大好消息,可能很多人还不知道,那就是:国内某些城市已经开始程序员人才补贴了!对于人工智能公司的项目开发、人才引进、科技研发,最高按照国拨经费的30%给予配套支持,单个项…

淘宝海量数据库之二:一致性选择

众所周知,一致性是数据最关键的属性之一。2000年,Eric Brewer教授在ACM分布式计算年会上指出了著名的CAP理论: Brewer, E. A. 2000. Towards robust distributed systems. In Proceedings of the 19th Annual ACM Symposium on Principles of…

Linux 小记录!

rmdir与 rm -r 的不同处前者这能删除目录 后者目录和文件都可以删除cp 和echo 都会覆盖原有的内容ctrl + c 强制中断这条命令/前后是没有空格的快捷键:TAB 命令 路径补全符号:; 多个命令的分隔符/ 根或者路径的分隔符。> 标准输出重定向…

Session 详解

作者: heallven www.ASPCool.com 时间:2004-8-28 阅读本文章之前的准备 阅读本文章前,需要读者对以下知识有所了解。否则,阅读过程中会在相应的内容上遇到不同程度的问题。 懂得ASP/ASP.NET编程 了解ASP/ASP.NET的S…

实现一个模拟CMD.exe命令编辑模式执行与显示的Delphi控件

cmd.exe这个东西是Windows系统自带的执行Dos的一个灰常好的人机命令交互的执行方式,现在很多脚本语言也都带有这种即时解释的人机模式。当下由于工程的需要,也要做一个类似命令解释显示的编辑器,基本上完全模拟Cmd.exe的这种交互模式&#xf…

谷歌这波大动作,暴露了什么信号?

我们都知道谷歌爸爸收购了Cask Data一家公司。长期以来,谷歌致力于推动围绕 GoogleCloud 的企业业务,但在这方面一直被亚马逊和微软吊打,这次的收购正是为了弥补自身的短板。被收购的 Cask Data 是一家专门提供基于Hadoop的大型数据分析服务解…

OSChina 周一乱弹 ——喝不到放心奶

2019独角兽企业重金招聘Python工程师标准>>> 【今日歌曲推荐】 陈李雨声 : 梦想还是要有的 万一实现了呢。《secret base》 《secret base》- 茅野愛衣 / 戸松遥 / 早見沙織 手机党少年们想听歌,请使劲儿戳(这里). 紫King : 这个大…

Assembly学习心得

http://blog.csdn.net/etmonitor/Assembly学习心得说明:最近开始准备把学到的.NET知识重新整理一遍,眼过千遍不如手过一遍,所以我准备记下我的学习心得,已备参考。J各位都是大虾了,如果有哪些错误或者不完整的地方&…

Oracle profile 用户资源限制 说明

一. 官网说明CREATE PROFILEhttp://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_6010.htm#SQLRF01310Oracle recommends that you use the Database Resource Manager rather than this SQL statement to establish resource limits. The Database Re…

刚发布!2020年AI人才发展报告,这三个暗示程序员一定要知道!

最近,程序员届有一个重大好消息,可能很多人还不知道,那就是:国内某些城市已经开始程序员人才补贴了!对于人工智能公司的项目开发、人才引进、科技研发,最高按照国拨经费的30%给予配套支持,单个项…

阿里巴巴开源技术汇总:115个软件(一)

阿里巴巴开源技术汇总:115个软件 摘要: 云栖社区近期策划了多期和开源产品相关的内容,如GitHub最流行的开源机器学习、大数据等项目,揭秘阿里Weex项目,Hilo开源分析等。深入挖掘,发现开源中国已经收集了数年…

Globalization Resources

http://blog.csdn.net/etmonitor/.NET系统学习----Globalization & Resources l 前言l 了解资源文件l 创建资源文件l 在程序中使用资源文件l 资源文件的命名和部署l 参考前言:在学习如何使用.NET资源文件…

用 Python 可以实现侧脸转正脸?我也要试一下!

作者 | 李秋键责编 | Carol封图 | CSDN 下载自视觉中国近几年来GAN图像生成应用越来越广泛,其中主要得益于GAN 在博弈下不断提高建模能力,最终实现以假乱真的图像生成。GAN 由两个神经网络组成,一个生成器和一个判别器组成,其中生…

Hive SQL 监控系统 - Hive Falcon

1.概述 在开发工作当中,提交 Hadoop 任务,任务的运行详情,这是我们所关心的,当业务并不复杂的时候,我们可以使用 Hadoop 提供的命令工具去管理 YARN 中的任务。在编写 Hive SQL 的时候,需要在 Hive 终端&am…

System commands can run from cmd

gpedit.msc-----组策略 sndrec32-------录音机 Nslookup-------IP地址侦测器 explorer-------打开资源管理器 logoff---------注销命令 tsshutdn-------60秒倒计时关机命令 lusrmgr.msc----本机用户和组 services.msc---本地服务设置 oobe/msoobe /a----检查XP是否激活 notepad…

做 Java 工程师,挺!好!

很多想要入行编程圈的人问到我该学哪一种语言,我都毫不犹豫的说Java。首先我们先看个排行榜,来自权威开发语言排行榜TIOBE的数据(截止到2020年4月),可以看到Java语言依然在语言排行榜霸占第一的位置!看到这…

使用tmpfs缓存文件提高性能

[ZT]使用tmpfs缓存文件提高性能 - 夜隼 - 博客园使用tmpfs缓存文件提高性能tmpfs是一种虚拟内存文件系统,它最大的特点就是它的存储空间在VM(virtual memory)里面。Linux系统中VM主要由RM(Real Memory)和swap组成,因此tmpfs最大的…

【转】RelativeLayout和LinearLayout及FrameLayout性能分析

原文:http://blog.csdn.net/hejjunlin/article/details/51159419 工作一段时间后,经常会被领导说,你这个进入速度太慢了,竞品的进入速度很快,你搞下优化吧?每当这时,你会怎么办?功能…

SQL Tips

出自:http://blog.csdn.net/etmonitor/一.怎样删除一个表中某个字段重复的列呀,举个例子表[table1]id name1 aa2 bb3 cc1 aa2 bb3 cc我想最后的表是这样的id name1 aa2 bb3 cc回答:将记录存到临时表#t中,重复的记录只存一条,然后将临时…

98年“后浪”科学家,首次挑战图片翻转不变性假设,一作拿下CVPR最佳论文提名​...

出品 | AI科技大本营(ID:rgznai100)刚刚结束的CVPR大会,总共收到6424篇论文中,仅有26篇获得最佳论文提名,占0.4%的比例。其中,康奈尔大学大四学生林之秋,以第一作者身份提交的“Visual Chiralit…

MySQL导入导出数据和结构

1. mysql导出数据和结构使用mysqldump命令1.1 导出全库连带数据mysqldump -u root -p app_test > app_test.sql1.2 导出指定的表,table1连带数据mysqldump -u root -p app_test table1 > app_test_table1.sql1.3 导出多张表,table1,tab…

图表君聊docker-仓库

图表君聊docker-仓库 今天我们来继续聊docker,上篇文章我们介绍了docker里的Container.今天来继续三大概念中的最后一个--仓库(Repository)。 当我做好了一个Image,我该怎么和其他人分享呢?答案很简单,把他push到一个仓…

正则表达式经典教程

作者:ET Dreams http://blog.csdn.net/etmonitor/Regular Expressions (1) ---- What is Regular Expressions?正则表达式是常见常忘,所以还是记下来比较保险,于是就有了这篇笔记。希望对大家会有所帮助。J1.什么是正则表达式...…

发布了!2020年AI人才发展报告,最高补助1000万!

最近,程序员届有一个重大好消息,可能很多人还不知道,那就是:国内某些城市已经开始程序员人才补贴了!对于人工智能公司的项目开发、人才引进、科技研发,最高按照国拨经费的30%给予配套支持,单个项…

C++资源之不完全导引(上)

发信人: NULLNULL (空空), 信区: VC标 题: C资源之不完全导引(转载)发信站: 武汉白云黄鹤站 (2005年05月05日01:42:54 星期四), 站内信件C资源之不完全导引(完整版)来源:www.csdn.net-----------------------------------------------------…

HDU 4467 分块

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid4467 题意:给定n个点m条边的无向图,点被染色(黑0/白1),边带边权。然后q个询问。询问分为两种: Change u:把点u的颜色反转(黑变白,白变黑),…

ASP.NET重用代码技术 - 代码绑定技术

作者: 苏红超 导读 代码绑定是ASP.NET提供的一个重要的新技术。本文将会为您展示如何利用代码绑定技术来实现Web页面表示层和商业逻辑代码的分离,并建议您使用代码绑定技术实现代码的可重用。在接下来的另外一篇文章当中,我们会给出另外…

【ZooKeeper Notes 3】ZooKeeper Java API 使用样例

查看PDF版本 转载请注明:ni掌柜 nileadergmail.com ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务框架,包含一组简单的原语集合。通过这些原语言的组合使用,能够帮助我们解决更高层次的分布式问题,关于Zo…