13个Python最佳编程技巧,越早知道越好

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: “写代码时,每次都要告诉自己:最后负责维护代码的,会是一个知道你住在哪的变态暴力狂。”——约翰·伍德(John Woods)生产代码(production code)是用户使用的产品中的代码。将软件部署到生产环境(production)后,就意味着用户可以公开访问了。
“写代码时,每次都要告诉自己:最后负责维护代码的,会是一个知道你住在哪的变态暴力狂。”——约翰·伍德(John Woods)

生产代码(production code)是用户使用的产品中的代码。将软件部署到生产环境(production)后,就意味着用户可以公开访问了。本文将介绍13个最佳的编程原则,有助于大家编写可部署于生产环境的代码。这些原则来源于《Python编程无师自通》,读完这本书后我的代码质量大幅提升。

7ea0773ff0170534221be866940bf0d1efc479af

作者:[美] 科里•奥尔索夫(Cory Althoff)

《Python编程无师自通——专业程序员的养成》

01 13个最佳编程技巧

写代码是最后的手段

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

DRY

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

正交性

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

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

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

函数只做一件事

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

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

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

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

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

遵循惯例

学习新编程语言的惯例,能够提升阅读用该语言编写的代码的速度。PEP8 是一系列编写Python代码的指南,强烈建议阅读,可前往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:一个编程原则,“不要重复自己”的英文简称。

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

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

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

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

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

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

02《Python编程无师自通》

在美国亚马逊,有一本书的影响力超高的Python入门书,Kindle版本在美国亚马逊网站的计算机软件、软件开发分类中排行均为第一,超越了众多实力派Python书,众多五星好评。也许你有所耳闻,这本书就是《Python编程无师自通——专业程序员的养成》

feec04314ac23348b4eef231d9cdb244adcec991

0db4bae217807ede5b3edb50ec412f4c4315e781

《Python编程无师自通——专业程序员的养成》作者是一名自学成才的程序员,作为一名文科生他通过自学编程,掌握了编程技能并在eBay找到了一份软件工程师的工作。这本书是作者结合个人经验写作而成,旨在帮助读者从外行成长为一名专业的Python程序员。

这本书可以满足几乎所有想要学习编程的初学者。本书适合高中、大学阶段想要自学编程的学生,以及其他行业想入门编程的人,同时也适合作为编程入门的培训教材。

《Python编程无师自通——专业程序员的养成》 每章结尾处都有术语表和挑战练习,让你更好地学习Python 3。


目录一览

第1章 概述

第2章 起步

第3章 编程概论

第4章 函数

第5章 容器

第6章 字符串操作

第7章 循环

第8章 模块

第9章 文件

第10章 综合练习

第11章 练习

第二部分 面对对象编程简介

第12章 编程范式

第13章 面向对象编程的四大支柱

第14章 深入面向对象编程

第15章 综合练习

第三部分 编程工具简介

第16章 Bash

第17章 正则表达式

第18章 包管理器

第19章 版本控制

第20章 融会贯通

第四部分 计算机科学简介

第21章 数据结构

第22章 算法

第五部分 找到工作

第23章 最佳编程实践

第24章 第一份编程工作

第25章 团队协作

第26章 更多学习资料

第27章 下一步


书单推荐

f8e7a110f62f2e4ace0f1f5ba4c6982595db19ed

作者:【美】Al Sweigart(斯维加特)

Python编程快速上手——让繁琐工作自动化

1523b6ae5fbfa02673e71459072cf70a01600f45

作者:[美] 泽德 A. 肖(Zed A. Shaw)

“笨办法”学Python 3

5c85b4adf2eb3b814c801ea18593022c5d26911a

作者:【美】Kenneth A. Lambert(兰伯特)

数据结构(Python语言描述)

f1045b02bf961ffe590aac051f0972b1e2b5423f
作者:【美】Wesley Chun(卫斯理 春)

Python核心编程(第3版)

f11ae119d52ce46efc30711f747c34cc4248852e

作者:叶维忠

Python编程从入门到精通


- END -

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
19天前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
19天前
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
7天前
|
Python
[oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅
本文回顾了从模块导入变量和函数的方法,并通过一个求和程序实例,讲解了Python中输入处理、类型转换及异常处理的应用。重点分析了“明了胜于晦涩”(Explicit is better than implicit)的Python之禅理念,强调代码应清晰明确。最后总结了加法运算程序的实现过程,并预告后续内容将深入探讨变量类型的隐式与显式问题。附有相关资源链接供进一步学习。
19 4
|
19天前
|
设计模式 机器学习/深度学习 前端开发
Python 高级编程与实战:深入理解设计模式与软件架构
本文深入探讨了Python中的设计模式与软件架构,涵盖单例、工厂、观察者模式及MVC、微服务架构,并通过实战项目如插件系统和Web应用帮助读者掌握这些技术。文章提供了代码示例,便于理解和实践。最后推荐了进一步学习的资源,助力提升Python编程技能。
|
21天前
|
数据采集 搜索推荐 C语言
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化和调试技巧,涵盖使用内置函数、列表推导式、生成器、`cProfile`、`numpy`等优化手段,以及`print`、`assert`、`pdb`和`logging`等调试方法。通过实战项目如优化排序算法和日志记录的Web爬虫,帮助你编写高效稳定的Python程序。
|
9天前
|
Java API Docker
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
以上内容是一个简单的实现在Java后端中通过DockerClient操作Docker生成python环境并执行代码,最后销毁的案例全过程,也是实现一个简单的在线编程后端API的完整流程,你可以在此基础上添加额外的辅助功能,比如上传文件、编辑文件、查阅文件、自定义安装等功能。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
|
18天前
|
机器学习/深度学习 设计模式 API
Python 高级编程与实战:构建 RESTful API
本文深入探讨了使用 Python 构建 RESTful API 的方法,涵盖 Flask、Django REST Framework 和 FastAPI 三个主流框架。通过实战项目示例,详细讲解了如何处理 GET、POST 请求,并返回相应数据。学习这些技术将帮助你掌握构建高效、可靠的 Web API。
|
18天前
|
机器学习/深度学习 设计模式 测试技术
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。
|
21天前
|
数据采集 人工智能 数据挖掘
Python 编程基础与实战:从入门到精通
本文介绍Python编程语言,涵盖基础语法、进阶特性及实战项目。从变量、数据类型、运算符、控制结构到函数、列表、字典等基础知识,再到列表推导式、生成器、装饰器和面向对象编程等高级特性,逐步深入。同时,通过简单计算器和Web爬虫两个实战项目,帮助读者掌握Python的应用技巧。最后,提供进一步学习资源,助你在Python编程领域不断进步。
|
21天前
|
Python
Python 高级编程与实战:深入理解面向对象与并发编程
本文深入探讨Python的高级特性,涵盖面向对象编程(继承、多态、特殊方法、类与实例属性)、异常处理(try-except、finally)和并发编程(多线程、多进程、异步编程)。通过实战项目如聊天服务器和异步文件下载器,帮助读者掌握这些技术,编写更复杂高效的Python程序。