您还未登录! 登录 | 注册 | 帮助  

您的位置: 首页 > 软件开发专栏 > 开发技术 > 正文

13个Python超实用的编程技巧,越早知道越好

发表于:2020-07-16 作者:异步社区 来源:今日头条

写代码是最后的手段

作为一名软件工程师,你在工作时应尽量少写代码。碰到问题时,你首先想到的不应该是“我怎么解决这个问题”,而是“其他人是不是已经解决了这个问题,我能使用他们的方案吗?”如果你自己去解决一个常见的问题,很有可能别人已经有了解决方案。先在网上检索解决办法,只有在确定没人解决过该问题之后,才开始自己动手解决。

DRY

DRY是不要重复自己(Dont’t Repeat Yourself)的简称,指的是不要在程序中编写重复的或是基本相同的代码。正确的做法是将代码封装至函数中,后续可重复使用。

正交性

正交性(Orthogonality)是《The Pragmatic Programmer》中提倡并普及的另一个重要编程原则。亨特和托马斯认为,“该术语已经被用来表示某种独立性或解耦化。如果两个或多个事物之间的变化不会相互影响,那么它们之间就存在正交性。在设计优良的系统中,数据库代码与用户界面之间是正交的;调整用户界面不会影响数据库,替换数据库也不会改变用户界面。”实践中请牢记,“A不应该影响B”。假设我们有两个模块module_a和module_b,module_a不应对module_b中的内容进行修改,反之亦然。如果设计的系统中A会影响到B,而B又影响C,很快就会失去控制,系统将变得无法管理。

每个数据都只应保存在一处

假设手上有一个数据,我们只需要将其存储在一个地方。例如,我们正在开发用来处理手机号码的软件,其中有两个函数要使用地区编号的列表,这里要确保程序中只有一个地区编号列表,而不是为每个函数重复创建。正确的做法是创建一个保存地区编号的全局变量。更好的解决方案则是将信息保存在文件或数据库中。

函数只做一件事

我们写的每个函数应该只做一件事。如果发现函数太长,请检查其是否在完成多个任务。将函数限制为只完成一个任务有很多好处。首先,代码可读性增强,因为函数名称可以直接说明其功能。如果代码出错,调试也将更加方便,因为每个函数只负责一个特定的任务,我们可以快速隔离并调试问题函数。用许多知名程序员的话来说:“软件的复杂性大多源自试图两件事当一件事做。”

若耗费时间过长,你的做法很可能就是错的

如果你不是在处理非常复杂的问题,比如处理大数据,但是程序却要花很长时间才能加载,这时可以认为你的做法很有可能错了。

第一次就要用最佳的方法完成

在编程时你可能会这样想:“我知道有一个更好的做法,但是我已经开始编码了,不想回头重写。”那我建议你停止编码,改用更好的方法来完成。

遵循惯例

学习新编程语言的惯例,能够提升阅读用该语言编写的代码的速度。PEP8 是一系列编写Python代码的指南,强烈建议阅读,可前往https://www.python.org/dev/peps/ pep-0008/查看。

使用强大的IDE

到目前为止,我们一直使用的是Python自带的IDE——IDLE来编码。但是IDLE只是众多可选IDE中的一个,而且我也不推荐长期使用它,因为其功能有限。例如,如果使用更强大的IDE打开Python项目,每个Python文件都会有不同的选项卡。在IDLE中则是每个文件新开一个窗口,操作烦琐且文件之间来回切换困难。

笔者使用JetBrains公司开发的一款名为PyCharm的IDE。他们提供了免费版和专业版两个版本,这款IDE有如下特性能够帮助我们节省时间。

1.如果想查看某个变量、函数或对象的定义,PyCharm提供了一个快捷方式,可以跳转到定义变量、函数或对象的地方(即使是另外一个文件)。PyCharm还提供了跳回开始页面的快捷方式。

2.PyCharm有保存本地历史的特性,可以极大提升工作效率。PyCharm会在每次项目出现变动时保存一份,因此可以不推送到代码库,就能将PyCharm当做一个本地版的版本管理系统。用户不需要做任何操作,IDE将自动保存。在我了解该特性之前,我经常会在解决问题后,想要换一种方案,但是不久后又希望回滚到原方案。如果我不把原方案推送到Github,很可能早就遗失了,不得不重新编写。但是有了这个特性,我们就能回滚到10分钟前,然后重新载入当时的项目状态。如果又改变主意,也可以随意地在不同方案之前来回切换。

3.在日常工作过程中,很可能要经常复制粘贴代码。在PyCharm中,不需要复制粘贴,在当前界面上直接移动代码即可。

4.PyCharm支持Git和SVN等版本控制系统。无须使用命令行,即可直接在PyCharm中使用Git。在IDE和命令行之间切换次数越少,工作效率越高。

5.PyCharm提供了内置的命令行和Python Shell。

6.PyCharm内置了调试器(debugger)。调试器是支持中断代码执行,逐行查看代码效果的程序。通过调试器,我们可以查看不同代码中变量的值。

记录日志

记录日志(logging)指的是在软件运行时记录数据的做法。我们可通过日志来协助程序调试,更好地了解程序运行时的状态。Python自带了一个logging日志模块,支持在控制台或文件中记录日志。

程序出错时,我们不希望没有感知——我们应该记录下相关信息,方便以后核查。记录日志也有助于收集和分析信息。例如,可以搭建一个Web服务器来记录数据,包括每次收到请求的日期和时间。我们可以将所有的日志记录在数据库中,编写程序分析其中的数据,并生成图表展示访问网站的人次。

博客作者亨瑞克·沃纳(Henrik Warne)在博客中写过这样一段话:“伟大程序员与平庸程序员的区别之一,就是伟大的程序员会做日志记录,使得出错时的调试变得更简单。”

测试

程序测试指的是检查程序是否“达到了设计和开发要求,对各类输入返回正确的结果,功能执行耗时在可接受范围,可用性足够高,可在目标环境下安装和运行,并且实现了相关利益方所期待的效果。”为了进行程序测试,程序员要额外编写程序。

在生产环境中,测试是必须完成的。对于计划部署在生产环境的程序,我们应当认为在没有编写测试之前都是不完整的。但是,如果是一个不会再使用的临时程序,测试可能有些浪费时间。如果编写的是其他人也将使用的程序,则应该编写测试。很多知名程序员都曾说过:“未经测试的代码就是漏洞百出的代码。”

代码审查

在代码审查(code review)时,同事会阅读你的代码并提供反馈。建议尽可能多地进行代码审查,尤其对于自学成才的程序员来说。即使你遵守了本章中所列的所有最佳实践,也有可能存在错误的做法。你需要有经验的程序员对你的代码进行检查,指出所犯的错误,这样才有可能解决。

Code Review是一个专注于代码审查的程序员社区。任何人都可以登入该网站,提交代码。社区的其他成员会审查代码,并反馈做得好的地方以及可以改进的地方。

安全

对于自学的程序员来说,安全是一个很容易忽视的问题。在面试时也很少会被问到安全问题,在学习编程时我们也不会去考虑安全问题。但是,在实际工作中,我们需要对自己代码的安全性负直接责任。本节将给出几个提高代码安全性的建议。

我们在本书中已经学习了使用sudo命令以根用户的身份执行命令。非必要情况下,务必不要在命令行使用sudo执行命令,因为如果有黑客侵入程序的话,将会获得根访问权限。如果你是服务器管理员,还应该禁止根用户登录。每个黑客都会盯着根账号,在攻击系统时是首要选择的目标。

另外,总是假设用户的输入是恶意的。部分恶意攻击的发生,就是利用了可接受用户输入的程序漏洞,因此我们要假设所有的用户输入都是恶意的,并以此为依据进行编码。

另一个提高代码安全性的策略,是最小化你的攻击面积(attack surface),即黑客可从程序中提取数据或攻击系统的相关区域。通过最小化攻击面积,可以减少程序出现漏洞的可能性。最小化攻击面积的几种常见做法包括:避免保存敏感信息,赋予用户最低的访问权限,尽可能少用第三方库(代码量越小、漏洞越少),剔除不再使用的功能代码(代码量越小、漏洞越少)等。

避免以根用户身份登录系统,不要信任用户输入,以及最小化攻击面积,是确保程序安全性的几个重要手段。但这还只是提升安全性的一小部分。我们应该试着从黑客的角度进行思考。他们会如何利用你的代码?这样可以帮助我们找到之前可能忽略的漏洞。有关安全的话题非常大,不是本书所能涵盖的,因此建议大家时刻思考并学习如何提升安全性。布鲁斯·舒奈尔(Bruce Schneier)对此的总结十分精辟:“安全是一种思维状态。”

术语表

生产代码:某个产品中被用户使用的代码。

生产:将软件投入生产,指的是对外正式发布。

DRY:一个编程原则,“不要重复自己”的英文简称。

正交性:该术语已经被用来表示某种独立性或解耦化。如果两个或多个事物之间的变化不会相互影响,那么它们之间就存在正交性。在设计优良的系统中,数据库代码与用户界面之间是正交的;调整用户界面不会影响数据库,替换数据库也不会改变用户界面。

调试器:调试器是支持中断代码执行,可逐行查看代码效果的程序。通过调试器,我们可以查看不同代码中变量的值。

日志记录:指的是在软件运行时记录数据的做法。

测试:检查程序是否“达到了设计和开发要求,对各类输入返回正确的结果,功能执行耗时在可接受范围,可用性足够高,可在目标环境下安装和运行,且实现了相关利益方所期待的效果。”

代码审查:他人阅读你的代码并给予反馈的过程。

攻击面积:黑客可从程序中提取数据或攻击系统的相关区域。