这篇文章主要介绍Python中的两个非常好用的语法糖,解析式 和 生成器,如果运用熟练的话,可以极大的减少代码的书写量
列表解析式
语法:
- [返回值 for 元素 in 可迭代对象 if 条件]
- 使用中括号[],内部是for循环,if条件语句可选
- 返回一个新的列表
其实语法很简单,主要看例子来了解如何书写一些解析式
例子1:生成一个列表,元素0~9,对每一个元素自增1后求平方返回新列表
如果按照常规的for..in语句的话,它是这样的
>>> l1 = list(range(10))
>>> l2 = []
>>> for i in l1:
l2.append((i+1)**2)
>>> print(l2)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
但是如果换成 解析式来写的话,代码回极大化的减少,它看起来是这样的
>>> l1 = list(range(10))
>>> l2 = [(i+1)**2 for i in l1]
>>> print(l2)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
怎么理解呢?你可以这样想,首先,按照语法规则,表达式是[]加内层套for..in的结构是一种解析式, [(i+1)**2 for i in l1] 这种解析分两步,第一步,for i in l1,做for..in遍历,把得到的每一个 i 值,传递给表达式 (i+1)**2,然后生成的数据,再加入 [] 列表结构中,最后把 [] 列表赋值给 l2
再看一个例子
例子2:获取10以内的偶数
首先常规for..in写法:
>>> even = []
>>> for x in range(10):
if x % 2 == 0:
even.append(x)
解析式写法
>>> even = [x for x in range(10) if x % 2 == 0]
这种例子呢,是带条件判断的解析式,我们也来拆,首先把 for x in range(10) if x % 2 == 0 拆出来,其实这就是一个判断偶数的for..in循环 类似于常规的写法:
for x in range(10):
if x % 2 == 0
只不过 for x in range(10) if x % 2 == 0 表达式会把,满足条件的 x 逐个返回,所以:
>>> even = [x for x in range(10) if x % 2 == 0]
>>> even
[0, 2, 4, 6, 8]
多条件判断的解析式: [expr for item in iterable if cond1 if cond2]
例子3:20以内,既能被2整除又能被3整除的数
>>> ret = [i for i in range(20) if i%2==0 and i%3==0]
或者
>>> ret = [i for i in range(20) if i%2==0 if i%3==0]
双层for..in 语句的解析式:[expr for i in iterable1 for j in iterable2 ]
例: [(x, y) for x in 'abcde' for y in range(3)