Python入门高级特性中切片和列表生成式还有生成器使用教程

切片就是取部分元素是非常常见的操作。

对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片操作,能大大简化这种操作。

切片操作十分有用。我们先创建一个-5-5的数列:

输出结果:[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]

通过切片轻松取出某一段数列。比如前6个数:

输出结果:[-5, -4, -3, -2, -1, 0] ,-5 到0刚好6个数。

取后面6个数:倒数第一个数是-1,后6个数就是-6。后面6个数从-6开始往后取。

输出结果:

获取前4-8个数:

输出结果:[-1, 0, 1, 2]

获取前10个数每两个取一个:

输出结果:[-5, -3, -1, 1, 3]

获取后面8个数每三个取一个:

输出结果:[-2, 1, 4]

省略开始数字、结束数字和步长,只用一个冒号。

输出结果:[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5],可以用来当复制使用。

切片支持使用类型有字符串、元组、列表、字典。

注意:

字典切片只取键,不取值。

集合是无序不重复的序列,切片会报错。

列表生成式是Python内置的非常简单却强大的可以用来创建list的生成式。

举个例子,要生成列表

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],

可以用

list(range(1, 11))。

但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?

也就是平方。但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成:

输出结果:

解析:[x*x for x in range(1,11)],就是for循环里面定义的变量。其实平方还可以改成[x**2 for x in range(1,11)],用**计算平方。

写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。

for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

输出结果:只有1-10的偶数平方,2、4、8、10。

还可以使用两层循环,可以生成全排列:

输出结果:

三层和三层以上的循环就很少用到了。运用列表生成式,可以写出非常简洁的代码。

生成器(generator)

如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?

这样就不必创建完整的list,从而节省大量的空间。

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。

而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间。

如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

只要把一个列表生成式的[]改成(),就创建了一个生成器。

输出结果:列表生成器直接显示列表元素;而生成器一串字母,大概的意思就是生成器对象genexpr存放在内存地址0x0000000001DD55E8。

生成器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。生成器只能往前不会后退。

如果要一个一个打印出来,可以通过

next(lists2)

函数获得生成器的下一个返回值。每取一个就要用一次next(lists2)。

生成器保存的是算法,每次调用

next(lists2)

,就计算出

lists2

的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出

topIteration

的错误。

这种不断调用next(lists2)实在是太变态了,正确的方法是使用for循环,因为生成器也是可迭代对象:

输出结果:end=' ',表示用空格隔开不换行。

创建了一个生成器后,基本上永远不会调用next(),而是通过for循环来迭代它,并且不需要关心StopIteration的错误。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181228A00ZMS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券