成为编码艺术家?听说过Python“一行流”吗

共 3551字,需浏览 8分钟

 ·

2021-10-21 09:42

所谓一行流,就是把一个功能用一行代码去实现。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 thisThe 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个平方数的列表,并把它打印到命令行。但如果使用更佳的单行解决方案,就能以一种更易读和简明的方式做到同样的事情:

# AFTERprint([i**2 for i in range(10)])# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

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

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

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


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

你也许会受某些信念所限,比如大多数程序员理解源码的速度比你理解的快得多,或者你与前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语言中哪个特性,将精选出3条最佳评论各获得本图书一本。

浏览 34
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报