惰性无限缓存序列
infseq的Python项目详细描述
python的无限序列
infseq模块为python 3实现缓存的惰性无限序列。
这里,单词“lazy”意味着序列的值永远不会被计算出来 除非它们真的被使用,“cached”一词意味着每个值 计算不超过一次。
序列可以包含任何类型的项,例如数字、字符串甚至 其他序列。
使用这个模块非常简单-一切都正常。这是 一些用法示例:
创建序列
>>>frominfseqimportInfSequence>>>InfSequence(5)<InfSequence:555555...>>>>InfSequence(5,6,...)<InfSequence:5678910...>>>>InfSequence(lambdaindex:index*2+1)<InfSequence:1357911...>>>>InfSequence.geometric_progression(3)<InfSequence:1392781243...>>>>InfSequence.cycle('a','b','c')<InfSequence:'a''b''c''a''b''c'...>>>>InfSequence.fibonacci()<InfSequence:011235...>
注意:为了便于调试,在 repr()在序列上被调用。如果你只是在没有 打印时,不计算值。项目数量可以调整 通过修改infseq.REPR_VALUES数字(默认设置为6)。
检索值
>>>a=InfSequence.geometric_progression(2)>>>a<InfSequence:12481632...>>>>a[10]1024>>>a.partial_sum(10)# a[0] + ... + a[9]1023>>>a.partial_sum(4,10)# sum(a[i] for i in range(4, 10))1008>>>a.partial_product(5)# a[0] * ... * a[4]1024
切片和预处理元素
>>>a[5:]<InfSequence:32641282565121024...>>>>a[::2]<InfSequence:1416642561024...>>>>list(a[5:10])# a[5:10] returns a map object, because of laziness[32,64,128,256,512]>>>list(a[4::-1])# reverse slices also work[16,8,4,2,1]>>>(5,7)+a<InfSequence:571248...>
算术运算
>>>b=InfSequence(1,2,...)>>>b<InfSequence:123456...>>>>b*2<InfSequence:24681012...>>>>b**2<InfSequence:149162536...>>>>a+b<InfSequence:247122138...>
应用任何函数
>>>c=InfSequence.geometric_progression(9)>>>c<InfSequence:1981729656159049...>>>>importmath>>>c.apply_function(math.sqrt)<InfSequence:1.03.09.027.081.0243.0...>
使用accumulate方法
accumulate方法返回原始值的部分和序列 序列(类似于itertools.accumulate):
result[0] = a[0] result[1] = a[0] + a[1] result[2] = a[0] + a[1] + a[2] ...
如果自定义函数作为参数传递,则使用它来执行 约化函数而不是和函数。
在下面的例子中,我们可以得到n(n+1)/2的序列和 n!使用此方法:
>>>fromoperatorimportmul>>>b<InfSequence:123456...>>>>b.accumulate()<InfSequence:136101521...>>>>b.accumulate(mul)<InfSequence:12624120720...>
使用矩阵乘法运算符
如果您使用的是Python3.5+,则可以使用新的“矩阵乘法” 在那个版本中引入的运算符。
表达式a @ b将产生以下结果:
result[0] = a[0] * b[0] result[1] = a[0] * b[1] + a[1] * b[0] result[2] = a[0] * b[2] + a[1] * b[1] + a[2] * b[0] ...
示例:
>>>InfSequence(0,2,...)@InfSequence(1)<InfSequence:149162536...>