python 的生成式能够减少内存的消耗
列表生成式
列表生成式即生成列表的生成式,写法简单而优雅,可以将多行代码融合成一行。主要的作用是将其他对象转换成列表或对原来的列表进行过滤。
# 列表转换列表
ls = [1,2,4,6]
ls1 = [x**2 for x in ls]
print(ls1)
结果:[1,4,16,36]
# 对列表过滤,返回true的才会保留到列表
ls = [1,2,4,6]
ls1 = [x**2 for x in ls if x > 3]
print(ls1)
结果:[16, 36]
# 多条件过滤
ls = [1,2,4,6]
ls1 = [x**2 if x > 2 else x**3 for x in ls]
print(ls1)
结果:[1, 8, 16, 36]
# 多重循环
ls = [1,2,4,6]
ls1 = [x**y if x > 2 else x**3 for x in ls for y in ls]
print(ls1)
结果:[1, 1, 1, 1, 8, 8, 8, 8, 4, 16, 256, 4096, 6, 36, 1296, 46656]
生成器生成式
在涉及到需要遍历列表而不是针对列表的某个值操作时,使用生成器代替列表可以减少内存的消耗。
ls = [1,2,4,6]
ls1 = (x**2 for x in ls)
print(ls1)
结果:<generator object <genexpr> at 0x0000021B21DED150>
# 通过for..in取数据不需要处理StopIteration
for i in ls1:
pass
# next()方法需要处理StopIteration
while True:
try:
print(next(ls1))
except StopIteration:
pass
字典生成式
字典生成式在一些需要列表或元组转化成字典的场合可以写出很优雅的代码。
# dict()可以接受类似列表生成式的写法,前提是ls至少是二维可迭代对象,否则报错
ls = [('name1','xiao'),('name2','wang')]
dict_ls = dict(x for x in ls)
print(dict_ls)
结果:{'name1': 'xiao', 'name2': 'wang'}
# 也可以针对zip使用
d = dict(zip([1,2],[3,4,]))
print(d)
# 结果
{1: 3, 2: 4}
还可以通过类似:
k:v for k in iterable_object for v in iterable_object2的形式;
元组生成式
由于()这个类似列表生成式的形式被生成器占用了,所有元组生成式使用tuple()来进行。
ls = [('name1',['1','2']),('name2','wang')]
dict_ls = tuple(x for x in ls)
print(dict_ls)
结果:(('name1', ['1', '2']), ('name2', 'wang'))
条件表达式代码压缩
对于一些如果代码不算长的if...else...的判断情况,可以将代码写在一行,显得非常的优雅。
x = 1 if 1>0 else None
转载自:https://www.cnblogs.com/cwp-bg/p/9041319.html#undefined