你有没有存在过类似的这种经历?
就是刚刚参加工作, 接手了别人的代码工作, 然后把编辑器打开来仔细一看, 那个程序的文件内容里面竟然是空空的, 连一个标点符号都没有存在。你坐在电脑前面, 用眼睛一直死死地盯着屏幕画面看了长达半个小时的时间, 可是还是没有办法搞明白这段代码它到底正在做一件什么样的事情。
我就拨打了电话去询问一下之前共事过的同事, 对方是这样回答的, 说是他在当初编写的那会儿确实清楚具体的含义是怎么回事, 但是如今已经到了这个时间点, 他也已经忘记得差不多了。
这就是你选择不撰写任何程序说明文档所会直接面对的最终结果。
今天的这个话题, 我们主要是来聊聊关于代码里面注释这一块的内容。虽然大家表面上看起来会觉得这东西挺简单的, 但是, 实际上在其内部却是隐藏着一个秘密的, 这个秘密连那些工作了很长时间的资深专业开发人员都不一定知道。
那个东西叫做注释, 它实际上就是些什么呢。
这句话的意思是, 代码里的注释就是给程序文本加的备注, 再加上必要的解释。
打个比方说呢, 就是你做了某一道菜, 然后因为害怕在下次制作的时候忘记具体放了多大的那个盐的量, 于是就在旁边那本菜谱的边上写了一行字, 内容就是盐放了两勺, 并且下次可以少放一点。
这行字并不会直接帮你进行烹饪炒菜的这些动作, 但是它能够帮助你自己, 或者是那个接手来看这一份菜谱的人, 去清楚并且明白这道菜到底是这么回事。
代码里的注释也是一样的状况, 它并不参与实际的运行过程, 只是起着负责让人明白其中的意思这样的作用。
在这个方面, 注释被划分成了三种类型, 它们分别是单行注释、多行注释以及文件编码注释。接下来, 我们针对这三种情况, 进行逐一的详细说明和解释。
第一种方式被叫做单行注释, 这种东西给人的印象是非常老实的, 它就像是一个便利贴。
单行注释是特别简单的, 它仅仅只需要使用一个符号, 那就是#这个井号。
# name是张三的名字name = "张三"
# age是张三的年龄
age = 25
# weight是张三的体重,单位是千克
weight = 70
对于位于符号井号之后的那些文字内容, 系统的处理机制是直接将其予以忽略不计的, 无论你选择去书写什么样的东西, 比如创作一首诗歌, 反正它都不会去看。
有一处细微的场合需要引起重视, 那就是根据官方提供的推荐做法, 应当在井号符号以及随后的注释文字中间, 添加一个空格符号。
# 这是规范的写法(井号后面有空格)#这是不规范的写法(井号后面没空格)
你可能在心里头会这么想, 觉得这件事做得也太过于挑剔了吧。
千万别慌, 目前市面上大多数编辑软件里都含有格式调整这一项功能, 在文字完成书写之后只需要轻点一下相应的快捷按键, 系统将会自动替你把整个文档的排版工作妥善安排妥当, 你所需要做的事情仅有专注写作本身而已, 至于具体的布局排列等事项, 完全可以全权交给现成的辅助工具来代劳处理。
注释的这部分内容, 是可以直接写在代码行后面的位置处去的, 这种写法被叫做"行尾注释":
name = "张三" # name是张三的名字这样操作就可以实现一步到位,让源代码与文字说明同时得到妥善的安排, 互不干扰。
但是你要记清楚一个原则: 单行的那段注释它是不允许换到下一行去的。 如果你想在第二行接着去写东西的话, 那做法就是再按一次那个井号键也就是那个#号就可以了。
第二种方法, 也就是多行注释, 这地方要重点关注一下, 实际上它是个冒牌货。
编写多行注释的时候, 使用的方法就是让三个引号连在一起, 至于选择的是单引号还是双引号, 这两者都是可以使用的:
'''下面是一些常量
idle_age是法定的年龄
months_in_year是一年中的几个月
max_users是最大同时在线人数
'''
看起来挺正常的, 对? 但是, 我就是要跟你说一说那个真实的狀況。
根本就没有去设计出那个叫做多行注释的东西, 这个功能是不存在的。
这确实是真实的情况, 你并没有出现听错的问题。
上面那段被三引号给包裹起来的东西, 说白了吧, 它本质上就是一个字符串, 只是说呢这个字符串没有被赋值分配给任何一个变量, 同时也没有被打印输出出来那么解释器在执行的时候一看呢会说: "这字符串没有人要去用它啊"然后就直接把它忽略掉了。
请你仔细地、好好地去体会一下这种情况, 具体情况是有代码被写了出来, 然后别人也看见了这些代码, 但是在实际执行的时候却被忽略了, 那么这岂不是在起到一个注释那样的作用吗?
因此它并不被视为一种注释形式, 而仅仅被认定为是一种未被使用的字符串类型, 可是由于它的具体存在状态, 它在功能效果上恰巧达到了与传统注释相同的作用。
这种情况是跟Java完全不一样的, Java是在里面真正设计出了多行注释这种语法形式, 也就是那些个/*和*/符号, 它家那个多行注释的东西跟字符串是扯不上任何关系的? 关于这个部分是没有的啦, 人们只能拿着字符串这个东西来勉强替代一下用。
再来说说一个更加关键的情况吧, 如果你把这个特定的字符串内容直接赋值给一个变量。
message = '''下面是一些常量
idle_age是法定的年龄
'''
这个时候, 它就不再是注释了。因为解释器会把它看得很严肃。它会去创建一个叫做“的变量”的东西。它会在内存里面开辟出一块空间来。然后再把这段字符串给存进去。
同一个用三个引号包起来的内容, 你给它赋值那就是变量, 你不给它赋值那就是注释。这就好比同一张纸, 如果你把它贴在墙上那它就是便签, 你要是拿在手里那它就是文件, 它的身份是由所在位置来决定的。
因此, 在未来的某个时候, 假如有人向你提出问题询问是否存在多行注释这一功能选项, 那么你就可以采取一种故作姿态的表现方式来给予答复, 声称从非常严格的专业角度来进行定义和判断的话, 这个特性实际上是不存在的。
还有一个情况值得注意, 那就是唯独这三种引号的格式能够进行换行操作, 若是采用单行注释所使用的井号, 则是无法执行换行的。假设你想要编写多行的注释内容, 在这种情况下, 需要采取的应对策略有两种, 其一是使用三引号的形式, 其二是针对每一行单独的注释语句都添加一个井号符号。
关于第三种状况, 也就是文件编码的注释部分, 在当前这个基本的范围之内, 人们基本不需要去管它。
把这种注释写在文件的最开头,这样做的主要目的, 是为了清楚地指定出这个文件所使用的字符编码方式。
格式长这样:
# coding=utf-8需要留意一个容易被忽略的地方, 就是在符号#与后面的内容之间是不包含空格的, 这种情况和我们通常所看到的普通单行注释并不相同, 因此需要作为特殊情况来单独记忆。
UTF-8到底是什么样的存在呢? 你可以把它这样去理解, 它就是所谓的“万国码”, 这个编码系统能够支持世界上几乎所有的文字材料, 当然了,这里面也明确包括了中文内容。
要是你把编码写错的话, 打个比方, 把它改成# =-1这种不支持中文的编码形式, 那么你代码内容里面包含的所有中文字符全部都变成乱码了, “张三”这两个字就变成了是一串串的问号或者就像是鬼画符一般的奇怪符号, 连你自己都看不明白了。
然而一个令人感到欣慰的情况出现了, 当你正在使用的版本确确实实就是3的时候, 之前所讨论的那些内容完全不需要进行编写。
因为3默认的情况是UTF-8那样的编码格式, 而如今绝大多数的项目都在使用3这样的东西, 所以关于文件编码的注释内容, 基本上就已经退出历史舞台了。
还有一个顺序方面需要说明: 如果你打算既要编写文档字符串, 又要编写文件编码的注释内容的话, 那么关于文件编码的注释, 是必须被安排在文本的最前面位置, 也就是说它一定要被放置在该文件的第一个行这一位置之中。
有三种注释, 只用一张表就可以解决。
注释类型
写法
一句话特点
单行注释
# 内容
最常用,不能换行,#后加空格
多行注释
'''内容'''
"""内容"""
其实质情况是一个字符串内容, 并不是真正起到注释作用的文本。
文件编码注释
# =utf-8
#和无空格, 数字3需要省略。
在最后呢, 再来讲这么几句。
这件写注释的事情, 虽然乍一看上去并不起眼, 实际上它就是用来划分“业余”与“专业”的第一道分水岭。
代码这种东西, 它主要是写给机器去执行运行的, 但是注释这部分内容呢, 则是明确地写给人来阅读的, 这里面所涵盖的人群, 自然也包括那个在三个月之后再去回看这段代码的你自己本人。
你在今日的时候, 心里面觉得这段代码自己是绝对不会忘记的, 等到三个月以后再打开同一个文件, 自己就会很感激那个当初专门写了注释的自己。
你要记住的就这三句话, 这已经足够了。
单行的那种注释符号要用那个井号也就是#, 并且在写的时候记得要留下空格。多行注释这种东西, 其实是拿字符串的东西来冒充的, 所以对于它的重要性不要看得太重。在第3点的情况里, 是不需要去写关于文件编码方面的注释成分的。
注释, 它并不是那种属于多余的、需要去背负的负担, 而是为那个在时间未来才会出现的自己, 所特意留下的、可以让人回去查看的一条退路或者后路。