首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python高级特性

本次笔记主要包括:列表生成式、生成器、可迭代对象、迭代器

1、列表生成式

之前学习列表的时候,我们是通过list = [1,2,3,4]的形式定义,这样写起来总是太过于繁琐,Python中为我们提供了一个简单粗暴的列表生成式,可以很快捷的生成这种列表,如:

前面我们对列表中的数据进行相同操作的时候,我们使用如下方式:

使用列表生成式,我们可以使用如下方式:

Python代码向来简洁,所以能少些点代码那就不要犹豫,尽量少些。上图的运算步骤是,先遍历出x然后计算x * x,当然我们可以针对循环写出过滤,例如我们只想要能整除3的数字,然后在相加,代码效果如下:

运算步骤是先遍历出x,然后进行过滤,再接着把符合条件的数据相加。

除此之外我们还可以通过这种方式进行二层三层for循环。可以自行尝试。

2、生成器

我们之前介绍了列表的相关使用,但是我们通常用的时候列表的内容都是有限制的。而且如果列表中存在多个数据,但是我们只需要取前面的几个数据。那么其他不用的数据就会浪费大量的空间。在Python中我们可以使用生成器来解决这个问题,所谓的生成器就是一种边循环边计算的机制,计算机制由我们自己来定义。我们来看看相关代码:

我们可以通过列表生成式,生成x平方的列表,这种使我们之前的列表模式,那么如果此时我们只需要用到第一个数据,后面多出来的数据不要,可以使用“one = ten[0]”的形式。换成迭代器的方式如下:

与列表相比,生成器使用的是“()”包裹着数据,如上图的“ten2”声明,打印“ten2”可以看到控制台输出的对象信息。生成器取值方式使用“next(生成器)”,该方法获取的是下一次生成器返回的值。

当取结束后继续调用next会抛出“StopIteration”异常,我们来看看代码:

通过这种next的方式我们可以很方便计算出下一个值,但是当数据太多的时候,那么满屏幕的next看起来也是头疼,所以我们还是使用for循环进行迭代输出。因为生成器也是一个可以被迭代的对象,而且通过for也不会产生StopIteration的异常信息。

在编程的过程中我们经常会见到写杨辉三角,关于杨辉三角的数字生成规律就不做详细描述了,我们都知道杨辉三角是一组有规律的数据,可以通过上一行计算出下一行相关,相关代码如下:

我们可以发现这种生成规律其实和生成器差不多,如果想通过next的方式进行逐行输出,那么可以通过使用yield来替换print,相关代码如图:

yield的作用就类似于return,和return不一样的是,当程序执行到yield处会返回相关的值,而后继续执行,直至抛出异常StopIteration。当然我们也可以循环遍历出来,如:

此处我们本意是执行完毕后,会打印一个“执行完毕”的结果,事实上for循环并不能满足我们的需求,此时我们需要使用while循环,通过try...catch来捕获异常,return的值在异常的“value”中,代码如:

生成器方法中除了使用“next()”计算获取下一次值之外,还可以使用“send()”和“__next__()”这两种方式,如:

需要注意的是,temp接收下一次外界调用传过来的值,当使用“__next__()”和“next()”方法的时候,相当于“send(None)”

3、迭代3.1可迭代对象

通过for循环进行迭代的对象都叫可迭代对象(Iterable),例如,集合数据类型list、tuple、dict、set以及字符串str,除此之外还有我们上面讲到过得生成器。

我们可以通过isinstance来判断一个对象是否属于可迭代对象,代码如下:

3.2迭代器

一个对象如果可以被函数next调用,且返回下一个值就叫迭代器(Iterator),例如我们之前看到的生成器都是迭代器对象。

同样使用isinstance来判断对象是否属于迭代器,代码如下:

从代码我们可以看书,Iterable对象不一定是Iterator对象,但是Iterator对象一定是Iterable对象,Python中我们可以通过“iter()”这个方法把Iterable对象变成Iterator对象。如:

4、总结

1、列表生成式可以快速的简化我们的代码书写,格式:l = [x * x for x in range(1,10)]

2、生成器是一种边循环边计算的机制,我们通常使用for循环来迭代,单个取值使用next(),需要注意的是,当没有值的时候会抛出“StopIteration”异常。

3、函数中,使用yield可以实现生成器函数,生成器函数它会记住上一次返回时候函数体的位置,下一次调用的时候会进入上一次的位置,且保持局部变量不变。这样可以节约内存。

4、能使用for循环的对象都是Iterable类型的对象,可以使用next()函数的都是Iterator对象,Iterable类型的对象可以使用iter()函数变成Iterator对象。

关注一起成长!!!

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券