一行代码输出 1-100 之间的所有偶数。
哎其实一行代码输出1-100偶数这种问题,背后还挺多细节的。昨天晚上本来想早点睡,结果临睡前在群里一聊又聊嗨了,主要是因为小王非得问我:"为啥你们都用 range(2, 101, 2),不能用 range(1, 101) 然后判断一下?"
我说其实都能用,但是这里面还是有点讲究。比如你写
print([i for i in range(1, 101) if i % 2 == 0])
是不是?也能出来。但是你这样写,等于让计算机每次都去做一次除法取余,哪怕1、3、5这些奇数也都算一遍,等于多做了好多无用功。你换成
print([i for i in range(2, 101, 2)])
这其实效率就高了,因为 range 直接跳着来,2、4、6……每次+2,压根儿就不看奇数,这计算机就轻松多了嘛。
不过你要是想装X,甚至还能这么写:
print(list(filter(lambda x: x % 2 == 0, range(1, 101))))
这种 filter 配合 lambda,也是搞定,但说真的,没啥必要,反而显得绕。
然后有个同事比较喜欢 map,非要写:
print(list(map(lambda x: x*2, range(1, 51))))
这个就思路完全不一样了,他让 range 从1到50,然后每个数乘2,直接得到2到100的所有偶数。就等于换了个角度,不再是判断或者跳着走了,而是直接算出来偶数——其实这种写法要是和数据科学或者大批量数据打交道,效率上也还行。
还有个细节,有的人喜欢生成器表达式,写成这样:
for i in range(2, 101, 2):
print(i)
这不是一行,但你非要一行其实也行:
print(*range(2, 101, 2))
这样它会把偶数都直接输出在一行,中间用空格隔着。我们公司有前端妹子拿到这个输出还说,啊怎么没有逗号分隔?你要加逗号就得这样:
print(','.join(str(i) for i in range(2, 101, 2)))
就这么玩儿呗。
对了,还有个老哥补充了一句:说这种题其实还蛮考察基础的,比如 range 的左闭右开、步长参数啊啥的。你 range(2,101,2) 这里的101其实不会取到,所以如果你想包含100,就得写101。如果你一不小心写成100,那就只有到98了,新手容易犯错。
反正总结一下,这种题随便写都能出结果,但写得好不好其实还是能看出功底的,效率和优雅都有讲究。你下次面试遇到这种别紧张,一行写完能说清楚背后原理,面试官都得点头。
-END-
我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领