Python基础(8):python中的特性进阶篇(迭代,列表生成式,生成器,迭代器)

版权声明:转载请注明来处 https://blog.csdn.net/Daisy_zye/article/details/84654835

python中还包括一些高级特性,以下简单介绍。

迭代

定义:用for循环来遍历对象的过程,叫做迭代。

作用对象:可迭代对象

如何判断是否为可迭代对象:isinstance(xxx,Iterable),Iterable类型来源于collections模块。

应用场景:

1:遍历列表或元组 

2:遍历字典   

3:实现列表下标循环   (enumerate是一个内置函数,可以将列表变为索引-元素对)

列表生成式

定义:python内置的,一种简单,强大,用来创建列表的生成式。

目的:使代码更简洁。

简单对比:

生成一个[1,4,9,…10*10]的列表

传统方法:

列表生成式:

应用场景:

用if增加判断,生成更符合需求的列表

双层循环生成全排列

使用两个变量生成列表

使用类方法,生成符合需求的列表

生成器

定义:一边循环一边计算元素的机制。生成器,又称为generator

目的:节约内存。直接定义或生成列表时,若列表过大,需要占用大量内存。

定义生成器的两种方法:

1:列表生成式变形记,将列表生成式的[]变成(),就变成了生成器

生成器对象的获取,简单的需要借助next()方法,如下所示:

这个简单的小例子有助于我们了解两点内容:1,生成器保存的是算法,每调用一次next,执行一次,返回一个结果。2,next直接调用时,若生成器中已无对象,会抛出stopIteration异常。

所以,获取生成器对象,还有一种通俗的方法,for循环。生成器是可迭代对象啊,(*^▽^*)

2:函数和yield

因为生成器中保存的是算法。算法有难有易,对于,稍显复杂的算法,无法用上述方法创建生成器。

例如,斐波那契数列。

1, 1, 2, 3, 5, 8, 13, 21, 34, ...,除第一和第二个数之外,任意一个数,均为前两个数的和。函数实现如下:

从此例中我们可以看到,函数有着跟生成器一样的目标:定义一种规则。所以,第二种定义生成器的方法,就是利用函数。

在上述实例中,将print(b),改为yield b

当函数中包含yield关键字时,该函数不再为普通函数,而是generator。

yield与普通函数相比不同的地方在于,普通函数顺序执行,用return返回需要的值,而yield则是,执行到yield,返回生成器对象,停止,下一次,再从上次停止的地方继续执行。

从生成器对象中取值,上文已经讲过,next函数或for循环。所以,裴波那契生成器,修改如下:

迭代器

定义:可以被next函数调用并不断返回下一个值的对象称为迭代器:Iterator(用isinstance函数判断)

易混淆点:

可以直接作用于for循环的,成为可迭代对象:Iterable。包括数据集合类型(列表,元组,字典,集合,字符串)和生成器generator。

可迭代对象,不等于迭代器。

根据迭代器对象,可用next函数调用,直至抛出StopIteration异常的,只有生成器。所以生成器是一种迭代器

其他可迭代对象,若需转换成迭代器,需要iter函数。

理论基础:

Iterator对象,表示的是一个数据流。

可以看做是一个有序序列,但不知道长度,需要始终通过next取值,知道不再返回数据时,抛出异常。

Iterator对象,采用惰性计算,需要返回下一个数值时才会去计算。

猜你喜欢

转载自blog.csdn.net/Daisy_zye/article/details/84654835