pythonista_我所理解的Pythonista

前言

Python有很多语法糖,这些语法糖可以让我们通过简短的代码实现相应的功能。

我曾经痴迷于使用各种各样的语法糖,力求以最简短的代码实现相应的功能(代码量最少),这让我觉得自己很Geek,很Pythonista,但现在我觉得这是一种错误的做法。

浮于表面的「简短」

下面代码可以实现完全相同的功能,你会喜欢那种写法?# 写法一:利用列表生成式

result = [(x, y) for x in range(5) for y in range(10) if x * y > 20]

# 写法二:简单的多层循环

# 正确示例

result = []

for x in range(5):

for y in range(10):

if x * y > 20:

result.append((x, y))

曾经的我会毫不犹豫的选择写法一,觉得这种写法很Geek,可以凸显出我对Python的熟练运用,但写法一的代码在可读性方面并不友好,这种简短是浮于表面的。

真正的简短应该建立在程序语义明确的基础上,要让阅读你代码的人可以一眼就明白你想通过这段代码表达什么。

在语义明确的基础上,再去简化代码,去除冗余,将绕弯子的逻辑删除,力求最简单的方式表达自己的思想。

真正的简短是思维层面的优化,而不是利用各种花哨的语法糖将其代码量缩短。王垠博客对这种现象给出了一个非常形象的描述:「就像是整理一团电线,并不是把它们揉成一团然后塞进一个盒子里就好。这样的做法只会给你以后的工作带来更大的麻烦,而且还有安全隐患。」

表面简短的代码除了让人不好理解外,编写的人也容易写出bug而不自知,此外也让人难以debug,从而导致需要花费更多的时间才能定位报错原因。

记住一个原则:「阅读者的体验 > 编程者的体验 > 机器的体验」

在开发项目的过程中,真正写代码的时间要远小于阅读代码与debug的时间,所以将代码写的语义清晰才是最重要的,其次才是在此基础上的优化。

大多数时候使用大量的语法糖只是为了炫技,这可能是每个年轻程序员都会经历的「编程幼稚期」。当然,有些老油条为了增加自己的“不可替代性”特意将代码写的让人难以理解,这就另说了。

有意义的变量名

有意义的变量名是让程序语义清晰的重要前提。

100行代码里面全是a,b,c,d这样的变量,会让人看吐,而100行代码中,其变量命名全都是具有意义的,那么看起来就会很轻松,此时变量名本身就带有一定的信息量,从而帮助我们更好更快的理解代码。

适度使用Python黑魔法

Python动态语言的特性让其具有很多「骚气」的写法,这些写法可能在Java这类语言中是难以实现的,而在Python中却可以轻松写出,这些黑魔法是一柄双刃剑,要适度使用(当然Java也有很多骚写法,同样要适度使用)。

怎么样算适度?

阅读多个Python开源库,就可以发现,Python中很多高级用法只会用于底层架构实现上(比如元类、具有复杂逻辑的装饰器),通过对底层逻辑的封装,避免这些难以理解的代码直接暴露于应用层接口中。

这样既保持了底层代码的干净又避免应用层代码让人难以理解。

作为普通程序员,最常接触的就是应用层层面的各种业务逻辑开发,此时就要避免使用Python高级语法,力求做到代码语义清晰,让人一眼就明白。

底层框架的设计大道相同,实现方式也类似,底层就算利用Python高级语法,也可以理解。而业务逻辑不同,不同的业务其对应的代码千差万别,如果大量的使用语法糖会让人难以理解、出现问题、难以debug,此时最好通过最朴素的写法来完成相应的业务逻辑,保证语义上的清晰。

结尾

最近在阅读公司Python项目的代码,有感而发。

希望大家早日脱离靠语法糖炫技的日子,找到其他可以证明自己价值、证明自己不可被轻易代替的方法。

如果觉得对你有帮助、有价值,请点击「在看」,支持二两。

参考:程序语言的常见设计错误(1) - 片面追求短小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值