三元表达式
可以将if...else..…分支变成一行
语法:
`条件为真时的结果 if 判断的条件 lese 条件为假时的结果`
a = 1
b = 2
#第一种写法
erroStr = "More" if a > b else "Less"
print(erroStr) # 运行结果为:Less
#第二种写法
print({True:'More',False:'less}[a > b]')#运行结果为Less
#第三种写法
print(("FalseValue", "TrueValue")[a > b]) # 运行结果为:FalseValue
列表生成式
列表推导式可以利用 range 区间、列表、元组、集合和字典等数据类型,快速生成一个满足指定需求的列表。
语法:
[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] ]
此格式中,[if 条件表达式] 不是必须的,可以使用,也可以省略。
列表生成式
list1 = [f'1{line}' for line in range(1, 101)]# print(list1)
Demo: 将name_list列表中的每一个人后缀都添加_dsb
name_list = ['jason', '饼哥(大脸)', 'sean', 'egon']
new_name_list = [name + '_dsb' for name in name_list]
另外,以上所看到的列表推导式都只有一个循环,实际上它可使用多个循环,就像嵌套循环一样
d_list = [(x, y) for x in range(5) for y in range(4)]
d_list列表包含20个元素
上面代码中,x 是遍历 range(5) 的迭代变量(计数器),因此该 x 可迭代 5 次;y 是遍历 range(4) 的计数器,因此该 y 可迭代 4 次。因此,该(x,y)表达式一共会迭代 20 次。上面的 for 表达式相当于如下嵌套循环
代码结果:
[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]
当然,也支持三次嵌套的for循环表达式
应用场景:数据量小时采用
[line for line in range(1, 6)] ---> [1, 2, 3, 4, 5]
优点:可依赖索引取值,取值方便
缺点:和生成器表达式对比 浪费资源
生成器表达式(元组生成式)
语法:除了和列表生成式用的括号不一样,其他完全一样
(表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] )
例如,我们可以使用下面的代码生成一个包含数字 1~9 的元组:
a = (x for x in range(1,10))print(a)
运行结果:
<generator object
at 0x0000020BAD136620>
从上面的执行结果可以看出,使用元组推导式生成的结果并不是一个元组,而是一个生成器对象
如果想要使用元组推导式获得新元组或新元组中的元素,有以下三种方式:
1 使用 tuple() 函数,可以直接将生成器对象转换成元组,例如:
a = (x for x in range(1,10))
print(tuple(a))
运行结果为:
(1, 2, 3, 4, 5, 6, 7, 8, 9)
2 直接使用 for 循环遍历生成器对象,可以获得各个元素,例如:
a = (x for x in range(1,10))
for i in a:
print(i,end=' ')
print(tuple(a))
运行结果:
1 2 3 4 5 6 7 8 9 ()
3 使用 __next__()
方法遍历生成器对象,也可以获得各个元素,例如:
a = (x for x in range(3))
print(a._next_())
print(a._next_())
print(a._next_())
a = tuple(a)
运行结果:
0
1
2
转换后的元组: ()
注意,无论是使用 for 循环遍历生成器对象,还是使用 next() 方法遍历生成器对象,遍历后原生成器对象将不复存在,这就是遍历后转换原生成器对象却得到空元组的原因。
应用场景:数据量过大时使用
(line for line in range(1, 6)) ---> g生成器(1, 2, 3, 4, 5)
优点:节省资源
缺点:取值不方便
还有集合生成式,字典生成式