合肥建设学校网站,商业网站建设方案,欧米茄表价格官网报价,图书馆 网站建设人生苦短#xff0c;我用python python 安装包资料:点击此处跳转文末名片获取 1.实现generator的两种方式
python中的generator保存的是算法#xff0c; 真正需要计算出值的时候才会去往下计算出值。 它是一种惰性计算#xff08;lazy evaluation#xff09;。
要创建一个…人生苦短我用python python 安装包资料:点击此处跳转文末名片获取 1.实现generator的两种方式
python中的generator保存的是算法 真正需要计算出值的时候才会去往下计算出值。 它是一种惰性计算lazy evaluation。
要创建一个generator有两种方式。
第一种方法
把一个列表生成式的[]改成() 就创建了一个generator L[x * x for x in range(10)]L
[0,1,4,9,16,25,36,49,6481]g (x * x for x in range(10))#注意把[]改成()后不是生成一个tuple而是生成一个generatorg
generator object genexpr at 0x1022ef630第二种方式 在函数中使用yield关键字函数就变成了一个generator。
函数里有了yield后执行到yield就会停住 当需要再往下算时才会再往下算。 所以生成器函数即使是有无限循环也没关系 它需要算到多少就会算多少不需要就不往下算。
def fib():a,b 0,1while True:yield aa, b b, a bf fib()
print (f, next(f),next(f),next(f))
#generator object fib at 0x7f89769d1fa0 0 1 1如上例第一次输出f 它就是一个generator 之后每次next它就执行到yield a。
当然其实平常很少用到next() 我们直接用for循环就可以遍历一个generator 其实for循环的内部实现就是不停调用next()。
生成器可以避免不必要的计算 带来性能上的提升 而且会节约空间 可以实现无限循环无穷大的的数据结构。 2.可迭代对象(Iterable)和迭代器(Iterator)的概念
可以直接作用于for循环的对象统称为可迭代对象Iterable。
包括集合数据类型list、tuple、dict、set、str等和生成器generator。
可以使用isinstance()判断一个对象是否是Iterable对象。
from collections import Iterableisinstance([],Iterable)
Trueisinstance({},Iterable)
Trueisinstance(abc, Iterable)
Trueisinstance((x for x in range(10)),Iterable)
Trueisinstance(100,Iterable)
False迭代器Iterator。
它表示的是一个数据流
Iterator对象可以被next()函数调用并不断返回下一个数据
直到没有数据时抛出StopIteration错误。
可以把这个数据流看做是一个有序序列
但我们却不能提前知道序列的长度
只能不断通过next()函数实现按需计算下一个数据
所以Iterator的计算是惰性的
只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流
例如全体自然数。
而使用list是永远不可能存储全体自然数的。
生成器generator都是Iterator对象
但list、dict、str虽然是Iterable
却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数 isinstance(iter([]),Iterator)
Trueisinstance( iter(abc),Iterator)
TruePython的for循环本质上就是通过不断调用next()函数实现的
例如
for x in [1,2,3,4,5]:pass实际上完全等价于
#首先获得Iterator对象:
it iter([12345])#循环:
while True:try:#获得下一个值:x next(it)except StopIteration:#遇到StopIteration就退出循环break3.itertools模块
python的内置模块itertools提供了用于操作迭代对象的函数 非常方便实用。 举一个例子
islice(iterable, [start, ] stop [, step]):
创建一个迭代器 生成项的方式类似于切片返回值 iterable[start : stop : step]
将跳过前start个项迭代在stop所指定的位置停止
step指定用于跳过项的步幅。
与切片不同
负值不会用于任何startstop和step
如果省略了start迭代将从0开始
如果省略了step步幅将采用1.
from itertools import islicedef fib():a, b 0,1while True:yield aa, b b,a bf fib()
print (list(islice(f10)))#[0,1,1,2,3,5,8,1321,34]python学习交流扣扣qun903971231问题解答 · 源码获取 · 技术交流 · 抱团学习请联系