引言:列表生成式

现在有个需求,给定列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],现在要求你把列表里的每个值加1,你怎么实现?你可能会想到2种方式 

 1 >>> a
 2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 3 >>> b = []
 4 >>> for i in a:b.append(i+1)
 5 ... 
 6 >>> b
 7 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 8 >>> a = b
 9 >>> a
10 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

或者另一种方法:

1 a = [1,3,4,6,7,7,8,9,11]
2 
3 for index,i in enumerate(a):
4     a[index] +=1
5 print(a)

还有一种写法如下:

1 >>> a = [i+1 for i in range(10)]
2 >>> a
3 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

这就是列表生成。

生成器

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

1 >>> L = [x * x for x in range(10)]
2 >>> L
3 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
4 >>> g = (x * x for x in range(10))
5 >>> g
6 <generator object <genexpr> at 0x1022ef630>

创建Lg的区别仅在于最外层的[]()L是一个list,而g是一个generator。

我们可以直接打印出list的每一个元素,但我们怎么打印出generator的每一个元素呢?

如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值:

 1 >>> next(g)
 2 0
 3 >>> next(g)
 4 1
 5 >>> next(g)
 6 4
 7 >>> next(g)
 8 9
 9 >>> next(g)
10 16
11 >>> next(g)
12 25
13 >>> next(g)
14 36
15 >>> next(g)
16 49
17 >>> next(g)
18 64
19 >>> next(g)
20 81
21 >>> next(g)
22 Traceback (most recent call last):
23   File "<stdin>", line 1, in <module>
24 StopIteration
View Code

相关文章:

  • 2022-01-04
  • 2021-08-24
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-31
  • 2021-04-25
  • 2021-12-07
猜你喜欢
  • 2022-01-18
  • 2022-02-20
  • 2022-12-23
  • 2021-07-30
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案