4

实用炫酷!这样写Python代码四两拨千斤!

 3 years ago
source link: http://www.justdopython.com/2021/04/15/smartcode/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

判断一个程序员水平的高低,不能光看他的发量,也不能光看他的代码量,还要看他代码蕴含的思想,代码的质量。代码蕴含的思想主要体现在各种设计模式的运用上,而代码的质量就既要实现需求,又要保证代码的简洁优雅。保证代码质量是需要长期积累,养成良好的编程习惯,不断思考优化的。

今天就给大家介绍一种实用的保证代码简洁的武功—— Python 推导四式。

什么是推导式

推导式 comprehensions(又称解析式),是 python 的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列。

看定义很抽象,下面我们来看看具体的例子,通过例子来学习这四种推导式。

列表推导式

我们先来看一个需求:

快速创建一个包含元素1-9的平方的列表

面对这个需求,我们通常的实现方式是这样的:

lis = []
for i in range(1, 10):
    lis.append(i*i)
print(lis) # [1, 4, 9, 16, 25, 36, 49, 64, 81]

用列表推导式怎么实现呢?你只需要一行代码:

lis = [x * x for x in range(1, 10)]
print(list) # [1, 4, 9, 16, 25, 36, 49, 64, 81]

这就是推导式。我们可以看到列推导式的语法是这样的:

变量名 = [表达式 for 变量 in 列表]

再来一个复杂点的:

list = [x * y for x in range(1, 10) for y in range(1, 10)]
print(lis)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]

这个是多个变量的类型,因此我们可以扩展上面的语法:

变量名 = [表达式 for 变量 in 列表 for 变量 in xxx]

当然,还有一种带条件的列推导式,它的语法是这样的:

变量名 = [表达式 for 变量 in 列表 if 条件]

我们来看一个需求:快速创建一个包含1-10之间所有偶数的列表。

lis = [i for i in range(1, 11) if i % 2 == 0]
print(lis) # [2, 4, 6, 8, 10]

字典推导式

字典推导式的形式和列表推导式类似,语法也是类似的,只不过字典推导式返回的结果是字典。

变量名 = {key: value表达式}

我们来看一个例子:

dic = {x: x/2 for x in range(1,11) if x % 2 == 0}
print(dic) # {2: 1.0, 4: 2.0, 6: 3.0, 8: 4.0, 10: 5.0}

如果这里我写成下面这种方式,返回的结果是什么呢?

dic = {'half': x/2 for x in range(1,11) if x % 2 == 0}
print(dic) 

大家可以自己尝试运行一下,看跟你想的结果是不是一样的。

集合推导式

看了前面两个推导式,想必你已经知道集合推导式怎么写了。语法如下:

变量名 = {表达式 for 变量 in 列表 for 变量 in xxx}

变量名 = {表达式 for 变量 in 列表 if 条件}

来一个实际的例子:创建一个存储10个偶数的集合。

set1 = {x for x in range(10) if x % 2 == 0}
print(set1) # {0, 2, 4, 6, 8}

元组推导式

我们先来看一个例子:

tup=(x for x in range(1,10))
print(tup) # <generator object <genexpr> at 0x1101fade0>

看到这个结果打印是不是有点懵?

上面的代码返回的变量其实是一个生成器,并不是一个元组。其实没有真正的元组推导式,我们只能用一个类似的方法来生成元组,暂且叫做“伪元组推导式”吧。

上面的例子我们来改进一下:

tup=tuple(x for x in range(1,10))
print(tup) # (1, 2, 3, 4, 5, 6, 7, 8, 9)

在前面加上 tuple 来显式进行类型转换就行了。

这里介绍了四种 python 的推导式,主要是用来简化 循环的代码,生成不同的数据结构用的。当然,从这些基础的表达式语法出发,还可以运用到复杂的推导式,大家在写代码时留心使用就会发现它的强大之处。这种一行代码既简洁明了,又可以在新手面前炫技,用起来不要太爽!

示例代码:(https://github.com/JustDoPython/python-examples/tree/master/xianhuan/smartcode)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK