个人Python学习随笔——看不懂的代码1

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 函数运算,最后得到一个结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值