1-Python - 解析式与三元表达式

前言

再来看些简单的东东.....

一行代码解决的事儿

列表解析(推导/生成)式
之前,我们是这样的生成列表的。

l = []
for i in range(10):
    l.append(i)
print(l)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

但这明显有点麻烦,现在学习一种简单便捷的方法:

l = [i for i in range(10)]
print(l)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

如上例所示,这种创建列表的方式叫做列表推导式,或称列表解析式,格式是中括号内用for语句来创建列表,后面也可跟语句用作判断,满足条件的元素传到for语句前面用于构建这个列表。

列表解析式的一般形式:

variable = [expression for value in iterable if condition]    
  变量        表达式       收集器              条件    

列表解析式可以应用于任何可迭代对象,来生成列表,if条件是可选的。
再来看个示例,收集1~20中的偶数:

l = [i for i in range(1, 21) if i % 2 == 0]
print(l)  # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

或者这样的:

l = [i ** 2 for i in range(1, 21) if i % 2 == 0]
print(l)  # [4, 16, 36, 64, 100, 144, 196, 256, 324, 400]

也可以这样,创建一个嵌套列表:

l = [[col for col in range(3)] for rows in range(5)]
print(l)  # [[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]

上例中,大的列表共有rows个子元素,每个子元素(嵌套内的列表)是col。
或者 这样的:

l = [x + y for x in 'abc' for y in 'ABC']
print(l)  # ['aA', 'aB', 'aC', 'bA', 'bB', 'bC', 'cA', 'cB', 'cC']

注意,不用一味的渴求简便,要注意可读性。
集合推导式
同样的,集合也有其推导式,用法与列表类似,只要将中括号换为大花括号即可。

variable = {expression for value in iterable if condition}   
  变量        表达式       收集器              条件 

来个示例:

s = {i for i in range(10)}
print(s)  # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

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

s2 = {i ** 2 for i in range(10) if i % 2 == 0}
print(s2)  # {0, 8, 2, 4, 6}

s3 = {x + y for x in 'abc' for y in 'ABC'}
print(s3)  # {'aB', 'bA', 'aA', 'cC', 'bB', 'cA', 'cB', 'bC', 'aC'}

那么同为花括号的字典呢,也有自己的推导式。

字典推导式

d = {k: '我是value啦' for k in range(5)}
print(d)  # {0: '我是value啦', 1: '我是value啦', 2: '我是value啦', 3: '我是value啦', 4: '我是value啦'}

三元表达式

接下来再说一个知识点——三元表达式,其语法是:

result = True if condition else False

if后跟条件,条件为真返回if左侧的结果,当条件为假则返回else的结果,其等价于下面的示例:

x = 1  
y = 2  
if x < y:  
    print(x)  
else:  
    print(y)  
res = x if x < y else y  

有些情况下的代码结构相当的简单,所以Python为我们提供一种将这种简单结构的代码镶嵌在较大的表达式内的格式。


欢迎斧正,that's all
posted @ 2019-07-28 21:30  听雨危楼  阅读(597)  评论(0编辑  收藏  举报