代码简洁之道:一行Python代码解决问题是时尚还是玄学

Posted 博文视点

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码简洁之道:一行Python代码解决问题是时尚还是玄学相关的知识,希望对你有一定的参考价值。

所谓一行流,就是把一个功能用一行代码去实现。Python的一行流既保证了代码的简洁,又不会牺牲很大的可读性。但一个看似如此简单的事情,如果不彻底掌握这门编程语言,是很难做到的。

我认为,Python 一行流能够帮助你提高编码技能,值得去学习,其原因还有下面五个。

◎ 首先,通过提升你对 Python 核心技术的认知,可以克服许多一直在拖你后腿的编程弱点。没有对基础知识的深入理解,很难取得进步。单行代码是所有程序的基础构件,彻底理解这些基本构件之后,你才有能力驾驭高阶的复杂程序,而不会感到不知所措。

◎ 其次,你会学到如何利用当今正疯狂流行的热门 Python 库,比如数据科学和机器学习用到的那些库。本书由五个介绍单行技术的章节组成,每个都涉及 Python 的不同领域,从正则表达式到机器学习。这种方式会让你对你可以构建的 Python 应用有一个概览,同时也会教你如何使用这些强大的库。

◎ 第三,你会学到怎样写出更加“Pythonic”的代码。Python 初学者,尤其是从其他编程语言过来的人,经常会用不 Pythonic 的方式去编写代码。我们会涵盖 Python 特有的一些概念,诸如列表解析、多重赋值、切片等,所有这些都会帮你写出可读性高、便于跟相同领域的程序员共享的代码。

◎ 第四,学习 Python 单行技术,会迫使你用简洁、清晰的方式去思考。若你不得不把每个代码字符都利用到极致,就没有空间去容纳那些稀稀拉拉、不明重点的代码了。

◎ 第五,你的单行代码新技能使你能够看穿那些设计过于复杂的 Python 代码库,并让你的朋友和面试官留下深刻印象。你可能会发现,用一行代码解决具有挑战性的编程问题,既好玩,效果又令人满意。而且你不是一个人:一个活跃的 Python 极客社群一直在竞争谁能写出最简短、最 Pythonic 的代码来解决各种各样的实际(或不太实际的)问题。

Python一行流的例子

学习 Python 单行技术既是理解更高级代码库的基础,也是提升自身技能的绝佳工具。在理解几千行代码组成的代码库到底写了些什么之前,必须先了解一行代码的含义。

让我们先来快速看一眼 Python 一行流。

q = lambda l: q(u[x for x in l[1:] if x <= l[0]]) + [l[0]] + q([x for x in l if x > l[0]]) if l else []

这个单行程序对著名的快速排序算法做了优美而简洁的压缩,不过对于很多初级或中级的 Python 使用者来说,其具体含义可能还难以掌握。

Python 单行程序经常是在已有基础上搭建而成的,所以在后面中出现的单行程序,复杂度会逐渐增加。我们将从简单的单行程序开始,这些简单的语句将成为之后更加复杂的程序的基础。比如说,前面的一行流快速排序基于列表解析,但看起来又长又难。下面是一个比较简单的列表解析,用于创建一个平方数的列表。

lst = [x**2 for x in range(10)]
我们还可以把这个单行程序分解成更简单的单行,用于介绍重要的 Python 基础知识,如变量赋值、数学运算符、数据结构、for循环,成员运算符,以及 range() 函数——所有这些都出现在一行简单的 Python 程序中!

要知道,基础,并不意味着琐碎或不重要。我们即将见到的所有单行程序都很有用,而且每章会针对计算机科学中的一个独立学科或领域,让你从一个宽阔的视野全面了解 Python 的力量。

关于可读性的说明

《Python 之禅》(The Zen of Python)中包含了 Python 编程语言的19条指导原则。可以通过在 Python 命令行里输入 import this 来阅读它:

import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense. Readability counts.
–下略–

如《Python之禅》所言,“可读性很重要(Readability counts)”,单行程序是解决问题的最小化方案,在很多情况下,将一段代码改写为 Python 单行程序会提升可读性,并使得代码更加 Pythonic。例如使用列表解析将创建列表的代码缩短到只有一行。请看下面的例子:

BEFORE

squares = []

for i in range(10):
squares.append(i**2)

print(squares)

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

在这个代码片段中,我们需要五行代码来生成头10个平方数的列表,并把它打印到命令行。但如果使用更佳的单行解决方案,就能以一种更易读和简明的方式做到同样的事情:

AFTER

print([i**2 for i in range(10)])

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

输出是完全一样的,但单行程序是基于更加 Pythonic 的概念列表解析来构建的,可读性更高,也更简洁。

然而,Python一行流也可能写得难以理解。在有些情况下,编写单行程序的解决方案,并不会让程序更加可读。但是,正如象棋大师会在动棋之前了解所有可能的行动方案,并决定何为最佳,你也需要了解所有可以表达你的想法的编码方式,如此才能从中选择最好的方式。追求最优美的解决方案不是一件低优先级的事情,而是 Python 生态系统的核心。正如《Python 之禅》所教导的:“优美胜于丑陋。”

编码能力卡住了?这本书获取可以帮助到你。

你是一位初级到中级的 Python 编码者吗?跟很多处于同样位置的人一样,你也许在编码能力进展上有点卡住了。你已经读了很多在线编程教程,也编写过自己的源代码,并成功地交付了一些小项目。你已经完成了一门基础编程课程,并且学过一两本编程教材。也许你还在大学里修过一门程序技术课程,在那里已学到了计算机科学与编程的基础知识。

你也许会受某些信念所限,比如大多数程序员理解源码的速度比你理解的快得多,或者你与前10% 的程序员差距太大。如果你希望达到高级编码水平,加入顶尖编码专家的行列,那么需要学习新的适应性技能。

小编很有同感,因为十年前刚开始学习计算机科学的时候,也觉得自己在编程上一无所知,并为此苦恼。而与此同时,我所有的同僚看起来都精通编程,且颇具经验。

借助本书,希望帮助你们克服这些限制自我的想法,让你们朝着成为 Python 专家的方向更进一步。

你会学到什么?

下面是你会学到的内容的概述。

1 Python温故知新 介绍 Python 的基础知识,让你重新检视自己的 Python 知识。

2 Python技巧 包括10个一行流技巧,帮助你熟练掌握基本知识,例如列表解析、文件输入、lambda函数、map()和zip()、all()量词、切片,以及基础的列表运算。你还会学到如何引入和操作各种数据结构,利用它们来解决各种各样的日常问题。

3 数据科学 包含了数据科学方面的10个一行流程序,全部基于 NumPy 库构建。NumPy 处于 Python 强大的机器学习和数据科学能力的核心,你将会学到基本的 NumPy 知识,如数组、形状、轴、类型、广播、高级索引、切片、排序、搜索、聚合与统计。

4 机器学习 涵盖了使用 Python 的 scikit-learn 库进行机器学习的10个一行流程序,会涉及值预测的回归算法,这些算法的例子包括线性回归、K-近邻算法和神经网络。你也会学到分类算法,比如逻辑回归、决策树学习、支持向量机和随机森林。此外,还会学习如何计算多维数据阵列的基本统计数据,以及用于无监督学习的 K-Means 算法,这些都是机器学习领域最为重要的算法与范式。

5 正则表达式 包含10个一行流程序,帮助你用正则表达式实现更多的目标。你会学到各种基本的正则表达式,并把它们组合(然后再组合)以创建更加高级的正则表达式,还会学习如何使用分组和命名组、反向查找、转义字符、空白字符、字符集(以及反向字符集)和贪婪/非贪婪运算符。

6 算法 包含了10个一行流算法程序,涉及广泛的计算机科学主题,包括拟合、回文、超集、换元、阶乘、质数、斐波那契数列、混淆、搜索和基于算法的排序。其中许多内容将构成更高级算法的基础,是进入全面系统的算法学习的良好导引。

后记 总结全书,让你带着升级后的全新 Python 编程技能,去面对真实世界的考验。

▊《Python一行流:像专家一样写代码》

关于作者
克里斯蒂安·迈耶(Christian Mayer)是一位计算机科学博士,也是知名 Python 网站finxter(网址见链接列表“文前3”条目)创始人和维护者。该网站非常活跃,内容订阅人数已经超过2万且仍在持续增长。他的网站不仅发展迅速,也帮助数以万计的学习者提升了编码技能和优化在线业务。克里斯蒂安同时也是《Python咖啡时间》(Coffee Break Python)系列自出版图书的作者。

关于译者
苏丹,网上id一般为su27,2009年毕业于北京师范大学数学系,主要从事后端编程工作,也曾从事前端与客户端开发工作。在Python的“黄埔军校”豆瓣团队中成长,目前为豆瓣用户产品后端负责人,日常跟Python打交道较多。

关于本书

《Python一行流》会教你阅读和编写一行流程序,系统性拆分和理解任意一行Python代码,像专家一样得心应手地编写强壮、紧凑的Python程序。本书有5个章节,覆盖了编程技巧、正则表达式、机器学习、数据科学的核心课题,以及许多有用的算法。通过对单行程序范例的详细介绍,本书解释了计算机科学的关键概念,并可用来提升编码与分析的重要技能。你会学到Python的进阶功能,例如列表解析、切片、lambda函数、正则表达式、map和reduce函数,以及切片赋值等。

以上是关于代码简洁之道:一行Python代码解决问题是时尚还是玄学的主要内容,如果未能解决你的问题,请参考以下文章

代码简洁之道

代码简洁之道 判断篇

代码简洁之道(判断篇)

JS代码简洁之道--函数

PHP代码简洁之道——SOLID原则

PHP 代码简洁之道( PHP Clean Code)