Python 为什么用 # 号作注释符?
关于编程语言中的注释,其重要性基本上已为大家所共识。
然而关于注释的规范,这个话题就像我们之前聊过的缩进、终止符和命名方式一样,众口难调。
注释符通常可分为两种,即行注释与块注释(inline/block),它们在不同的编程语言中的符号可谓让人眼花缭乱。
比如行注释符,它至少有以下的 17 种之多(出自维基百科):
其中两个最大的阵营分别是“//”与“#”号:
- // 注释符:ActionScript, C (C99), C++, C#, D, F#, Go, Java, JavaScript, Kotlin, Object Pascal (Delphi), Objective-C, PHP, Rust, Scala, SASS, Swift, Xojo
- # 注释符:Bourne shell and other UNIX shells, Cobra, Perl, Python, Ruby, Seed7, Windows PowerShell, PHP, R, Make, Maple, Elixir, Nim
那么,**Python 为什么用“#”号作注释符,而不是“//”呢? **
这个问题恐怕没办法从解析的效率、符号的辨识度和输入的便利性等方面回答,因为它们基本上没有区别。
我没有找到官方的解释,但是从这些注释符的阵营中,已经不难得出一个较为合理的解释:
// 注释符基本上被 C 语言家族所用
# 注释符则基本上是被 Shell 和其它脚本语言所用
Python 在创造之初,从 C 和 Shell 语言中借鉴了不少东西,但它是一种脚本语言,因此在注释符这个最为基础的语言要素上,就偏向了脚本语言的传统。
在某些“类脚本语言”中,比如 yaml、conf 和 ini 等格式的配置文件,它们大多也是采用脚本语言的“#”号作为注释符。
所以,Python 行内注释符的选择,大概可以归结为一种历史原因,即借鉴了 Shell 脚本语言的写法。
相比于行注释符的多样,块注释符更加是让人眼花缭乱:
大多数写法是我从未见过的,有些甚至是难以忍受的,槽点太多!
在这份表格里,我们看不到 Python,因为从严格意义上讲,Python 并没有块注释符!
一般而言,我们在连续的每行内容前面加“#”号,达到块注释的效果。块注释被看作是多个行注释。
PEP-8 中是这么建议的:
Each line of a block comment starts with a
#
and a single space (unless it is indented text inside the comment).
有人曾在 Twitter 上发问,为什么 Python 没有块注释符?
Guido 回复称,可以将多行字符串用作块注释:
Python 的多行字符串用三对单引号或双引号表示,它还可以用作文档字符串(即Documentation Strings,简写docstrings)。
但是,将它当做多行注释符使用,在语义上则有点怪怪的——它表示的是一段字符串,虽然没有赋值给变量,不会生成代码,但是它并非语义上的注释。
由于脚本语言的特性,它允许我们写一段“无根的字符串”,在语法上没有问题,也没有负作用(negative effects),但是,如果把它作为注释使用,这就是一种副作用(side effects)了。
从这点上考虑,我虽然不反对有人把多行字符串写法用作块注释,但是我会更推荐大家使用“#”号作注释。
另外,对于无用的代码,最好的做法就是直接删除,如果后续发现有需要,再回退修改。详细的多行注释尽量放在文档字符串中,这样在核心代码中就会很少出现多行注释的情况了。
对于 Python 的注释符用法,大家是怎么想的呢?欢迎留言交流。
如果你觉得本文分析得不错,那你应该会喜欢这些文章:
4、Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
6、Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
7、Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?
写在最后:本文属于“Python为什么”系列(Python猫出品),该系列主要关注 Python 的语法、设计和发展等话题,以一个个“为什么”式的问题为切入点,试着展现 Python 的迷人魅力。若你有其它感兴趣的话题,欢迎填在《Python的十万个为什么? 》里的调查问卷中。部分话题会推出视频版,请在 B 站收看,观看地址:视频地址
公众号【Python猫】, 本号连载优质的系列文章,有Python为什么系列、喵星哲学猫系列、Python进阶系列、好书推荐系列、技术写作、优质英文推荐与翻译等等,欢迎关注哦。
Python 为什么用 # 号作注释符?的更多相关文章
- Python 为什么不用分号作终止符?
一般而言,编程语言中使用分号";"来实现两种目的: 作为语句分隔符:使用分号来分隔语句(statement),这样就能在一行代码中书写多条语句(一行多句) 作为语句终止符:使用分号 ...
- Python学习2——Python单行注释、整段注释使用方法
Python中的注释有多种,有单行注释,多行注释,批量注释,中文注释也是常用的. python注释也有自己的规范,在文章中会介绍到. 注释可以起到一个备注的作用,团队合作的时候,个人编写的代码经常会被 ...
- 为MYSQL加注释--mysql注释符
上午插入记录的时候一直没有成功,郁闷不知道为什么.因为是很多条记录一起插入,中间一些不用的数据就用"--"来注释了,结果没有效果. 没有办法,在网上找了找,才发现注释符" ...
- SQL注入注释符(#、-- 、/**/)使用条件及其他注释方式的探索
以MySQL为例,首先我们知道mysql注释符有#.-- (后面有空格)./**/三种,在SQL注入中经常用到,但是不一定都适用.笔者在sqlilabs通关过程中就遇到不同场景用的注释符不同,这让我很 ...
- MySQL注释符
mysql注释符有三种:1.#...(注释至行末,推荐)2.-- ...(两条短线之后又一个空格)3./*...*/(多行注释) 1.
- java基础 (记事本编写hello world,path,classpath,java的注释符)
一:java的基本信息 jre 是指java运行环境,jdk 是指 java 开发工具集(并且里面是自带有jre运行环境的) jvm是指java的虚拟机 java的源代码的后缀名是 .java (例如 ...
- ASP中双引号单引号和&连接符使用技巧
ASP中双引号单引号和&连接符使用技巧 一.ASP中处在双引号中的可以是任意的字符.字符串,HTML代码 1.<%response.write ("I am here" ...
- Python微信公众号开发—小白篇
本文面向想通过Python学习公众号开发的同学.一站式解决新手开发微信公众号遇到的所有问题. 为了防止我的文章被到处转载,贴一下我的公众号[智能制造专栏],欢迎大家关注. github仓库地址http ...
- sqli-labs(十)(过滤注释符)
第二十三关: 这关还是一个GET型.字符串.单引符号.的有报错的sql注入,输入?id=1' ,页面会报错 我们继续按照之前的套路来,先输入?id=1' or '1'='1 页面正常显示,说明这个地 ...
随机推荐
- 为什么用抓包工具看HTTPS包是明文的
测试或者开发调试的过程中,经常会进行抓包分析,并且装上抓包工具的证书就能抓取 HTTPS 的数据包并显示.由此就产生了一个疑问,为什么抓包工具装上证书后就能抓到 HTTPS 的包并显示呢?不是说 HT ...
- Java CRC16 MODBUS校验算法实现
/** * CRC校验算法工具类 */ public class CRCUtil { public static String getCRC(String data) { data = data.re ...
- JavaWeb网上图书商城完整项目--day02-2.regist页面输入框得到焦点隐藏label
实现当光标输入在输入输入框的时候,将后面的内容隐藏,例如在用户名称输入信息的时候,后面的用户名不能为空隐藏 我们来看看regist.js的代码: //该函数在html文档加载完成之后会调用 $(fun ...
- web安全之跨站脚本漏洞(XSS)
XSS(跨站脚本)概述以及pikachu上的实验操作 Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS. XSS ...
- keras训练实例-python实现
用keras训练模型并实时显示loss/acc曲线,(重要的事情说三遍:实时!实时!实时!)实时导出loss/acc数值(导出的方法就是实时把loss/acc等写到一个文本文件中,其他模块如前端调用时 ...
- 浅谈tkinter模块
目录 tkinter模块 tkinter模块简单使用 主窗口 Button按钮 Label标签 Text编辑框 Entry输入框 ListBox列表 RadioButton单选框 CheckButto ...
- Python3-在windows快速运行一个简单的本地 HTTP 服务器
1.打开控制台2.python -m http.server
- 利用Cython对python代码进行加密
利用Cython对python代码进行加密 Cython是属于PYTHON的超集,他首先会将PYTHON代码转化成C语言代码,然后通过c编译器生成可执行文件.优势:资源丰富,适合快速开发.翻译成C后速 ...
- 03-springboot整合elasticsearch-源码初识
前面两个小节已经知道了spring boot怎么整合es,以及es的简单使用,但是springboot中是怎么和es服务器交互的.我们可以简单了解一下.要看一下源码 在看源码的同时,先要对sp ...
- 虚拟机 - 桥接模式下,虚拟网卡没有 ip
背景 Linux 虚拟机,用桥接模式,敲 ifconfig命令,ens33 没有 ip 即没有红色圈住那部分 解决方案 修改配置文件 vim /etc/sysconfig/network-script ...