from functools import reduce
from operator import add
nbottlenecks = [3, 4, 23, 3]
self.bottleneck_ids = reduce(add, list(map(lambda x: list(range(x)), nbottlenecks)))
self.lids = reduce(add, [[i + 1] * x for i, x in enumerate(nbottlenecks)])
range() 函数
range(start, stop[, step])
- start: 计数从 start 开始。默认从 0 开始。
- stop: 计数到 stop 结束,但不包括 stop。
- step:步长,默认为1。
执行结果如下,在不加list()的时候,只会显示range(0,10),增加了list()之后可以完成序列中数字的显示。
range(10) # range(0, 10)
list(range(10)) # [0,1,2,3,4,5,6,7,8,9]
list(range(0,10,1)) # [0,1,2,3,4,5,6,7,8,9]
list(range(2,10,2)) # [2,4,6,8]
lambda函数 匿名函数
lambda arguments : expression
- arguments--参数
- expression--表达式
a=lambda x:x+1 #进行x+1的运算
a(1) #执行1+1的操作
a,[1,2,3] #对list中的每个元素执行+1操作
reduce()函数
reduce(function, iterable[, initializer])
- function -- 函数
- iterable -- 迭代对象
- initializer -- 可选[],初始参数
reduce(add,[3,4,5]) # 12 执行了3+4+5的操作
reduce(add,[[1,2],[3,4]]) # [1,2,3,4] 执行了将两个list拼接的操作
因此在代码中使用了
self.bottleneck_ids = reduce(add, list(map(lambda x: list(range(x)), nbottlenecks)))
其含义就是对list nbottlenecks中的每一个元素执行range(x)操作,生成list,通过map映射,再生成一个个list,最后使用reduce将其拼接。 得到的结果是
[0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 1, 2]
enumerate()函数
enumerate(sequence, [start=0])
- sequence -- 一个序列、迭代器或其他支持迭代的对象。
- start -- 下标起始位置的值。
list(enumerate([2,3,4,5])) # [(0, 2), (1, 3), (2, 4), (3, 5)]
list(enumerate([2,3,4,5],5)) # [(5, 2), (6, 3), (7, 4), (8, 5)]
list * 数值的效果是直接重复
[3]*5 # [3,3,3,3,3]
[2,3]*5 # [2,3,2,3,2,3,2,3,2,3]
因此代码
self.lids = reduce(add, [[i + 1] * x for i, x in enumerate(nbottlenecks)])
得到的结果是
[1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4]
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。