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

作者:闲欢
来源:Python 技术
判断一个程序员水平的高低 , 不能光看他的发量 , 也不能光看他的代码量 , 还要看他代码蕴含的思想 , 代码的质量 。代码蕴含的思想主要体现在各种设计模式的运用上 , 而代码的质量就既要实现需求 , 又要保证代码的简洁优雅 。保证代码质量是需要长期积累 , 养成良好的编程习惯 , 不断思考优化的 。
今天就给大家介绍一种实用的保证代码简洁的武功—— 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}如果这里我写成下面这种方式 , 返回的结果是什么呢?
【实用炫酷!这样写Python代码四两拨千斤】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 的推导式 , 主要是用来简化 循环的代码 , 生成不同的数据结构用的 。当然 , 从这些基础的表达式语法出发 , 还可以运用到复杂的推导式 , 大家在写代码时留心使用就会发现它的强大之处 。这种一行代码既简洁明了 , 又可以在新手面前炫技 , 用起来不要太爽!




推荐阅读