Python技术迷

一行代码输出 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 全部免费领