python中还包括一些高级特性,以下简单介绍。
定义:用for循环来遍历对象的过程,叫做迭代。
作用对象:可迭代对象
如何判断是否为可迭代对象:isinstance(xxx,Iterable),Iterable类型来源于collections模块。
应用场景:
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对象,采用惰性计算,需要返回下一个数值时才会去计算。