列表推导式
之前生成一个满足条件的列表我们可以使用for循环,然后往列表中append元素,现在可以不用那么麻烦,直接一个表达式就可以搞定:
L=['你好哇%d'% i for i in range(10)] print(L)
规则就是: for 是控制循环变量的,前面写上你要生成的这个列表的组成元素(就是后面的循环变量的某种组合形式)
运行结果:
再比如你要生成一个0-9范围内 每个数字立方的列表,就可以这样写:
L=[i**3 for i in range(10)] print(L)
运行结果:
生成器表达式
前面之所以先介绍列表推到式,就是因为生成器表达式跟它真的太像了!我们先来感受一下:
g=(i for i in range(5)) print(g) # g是一个生成器 # for i in g: #可以使用for循环一次来打印出该生成器内的值 # print(i) print(g.__next__()) #当然也可以使用g.__next__()方法一个一个打印该生成器内的值~ print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__())
运行结果:
如果想要使用生成器表达式得到一个生成器,要去里面的元素是0-9数字的平方:
g=(i**2 for i in range(10)) print(g) #生成器表达式得到的是一个生成器 # for i in g: #可以使用for循环来获取生成器内的值 # print(i) print(g.__next__()) #也可以使用.__next__()方法来获取 print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__())
运行结果:
对比可以发下,生成器表达式和列表推导式的区别为:
1. 形式不同,列表推导式最外层采用的是 [] -中括号,而生成器表达式采用的是()---圆括号;
2. 两者的返回值不同,列表推导式返回的是一个list,而生成器表达式返回的是一个生成器,所以列表推导式一次性返回这个列表(包含列表的所有值),而生成器只有当调用__next__()方法时才会得到值,所以更节省内存空间;