一行代码输出 1-100 之间的所有偶数
那天晚上我正泡着茶,外面下着雨,想着写点轻松的代码练手,就突然冒出来一个小想法:**能不能用一行 Python 代码把 1 到 100 之间所有的偶数都打印出来?**别看这问题小,里面其实能聊不少东西,刚好我就借着这个机会写下来,顺便展开讲讲 Python 里面的各种写法,聊到你完全不会觉得“就这一行代码而已”。
最直观的那一行代码
很多人第一反应肯定是 for 循环,然后 print 打印嘛。 如果写多行就是这样:
for i in range(1, 101):
if i % 2 == 0:
print(i, end=" ")
这肯定能跑,但显然不是“一行”。要是强行压成一行,其实就:
print([i for i in range(1, 101) if i % 2 == 0])
你看,这就是所谓的列表推导式,写法紧凑,直接生成一个偶数列表丢给 print,一次性输出。执行结果就是 [2, 4, 6, ..., 100]。
这里面用的 range(1, 101) 很关键。
range(1, 101)会从 1 生成到 100(不包含 101)。如果想偷懒,可以直接写 range(2, 101, 2),这就一步到位,直接跳过奇数了。
所以另一行解法是:
print(list(range(2, 101, 2)))
是不是更干脆?少了个 if,直接让 range 自己去做筛选。
这里要注意,list(range(...)) 会真的生成一个完整列表,占内存。 如果只是想打印,不用真的保留所有元素,可以用生成器写法:
print(*range(2, 101, 2))
* 这个星号很妙,等于是把 range 里的元素一个个拆开,作为参数传给 print。于是 print 会按空格分隔打印出来,结果就是 2 4 6 ... 100,看着舒服,还省内存。
Lambda 也能来凑热闹
要是你在面试,面试官非得让你搞“骚操作”,lambda 一行也行:
(lambda: print([i for i in range(2, 101, 2)]))()
不过说实话,这么写有点画蛇添足,装逼成分多过实用,毕竟本质还是在那套列表推导式上。
map/filter 组合拳
还有些同学喜欢函数式写法,filter 就是为这种场景准备的:
print(list(filter(lambda x: x % 2 == 0, range(1, 101))))
这也是一行,但比推导式啰嗦,性能差不多。map 也能用,不过它更多是做转换,这里其实不如 filter 合适。
为什么要强调“一行”
很多人会问,不就是个偶数输出吗?干嘛非要一行? 其实这就是 Python 的有趣之处,它本来就支持简洁表达。你能用一行解决,就说明你对语法糖的掌握够熟,能在合适的地方用对工具,而不是凡事都堆循环。
我记得有次面试,一个候选人被问“用一行输出 1-100 偶数”,他愣是写了五行循环,最后面试官笑了,说:“你这 Python 用得像 C。”所以这种题更多是考你有没有理解 Python 的“味道”。
其实打印偶数只是最简单的,思路一变,可以顺手做很多类似的事:
打印所有能被 3 整除的数:
print([i for i in range(1, 101) if i % 3 == 0])
打印平方:
print([i ** 2for i in range(2, 101, 2)])
拼成字符串输出:
print(",".join(str(i) for i in range(2, 101, 2)))
看吧,一旦你理解了,玩法就随便扩展。
写到这,茶都凉了,窗外雨还在下。其实这道题一行代码不难,关键在于理解 Python 给我们的几种思路:
列表推导式,最直观。 range 步长,最简洁。 解包星号,最省内存。 filter/map,偏函数式。
所以如果你现在让我选,我会毫不犹豫推荐这一行:
print(*range(2, 101, 2))
既优雅,又符合 Python 的味道。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领