“一行代码”可不是近些年才有的概念,早在1960年就已经出现,那会儿C语言都还没出现呢。当时叫单行程序(One-liner program),是操作系统shell命令行的文本输入,一行输入就能执行一些功能。后来这个概念拓宽了,不再限定代码无需编译即可执行。
随着APL编程语言的发布,单行程序逐渐广为人知,后来成为展现编程语言差异和强大表达能力的一种形式。当时杂志也会介绍一些让人印象深刻的短小或者单行的程序代码。
▲ RUN杂志第35期关于单行程序的专栏
使用“一行代码”有时候是寻找更好的解决方案,有时候也是炫技玩法。来看看有哪些有趣、有用的“一行代码”吧。
有趣的“一行代码”
在早几年编程没有这么流行的时候,能打印出有趣图形的“一行代码”可以吸引许多人的眼光。虽然在现在看来这种形式的“炫技”似乎稍显稚嫩,但对刚接触编程的人来说这些的确非常有趣。
打印一个“爱心”
这行代码可以打印一个充满“爱”的爱心形状。
- print('\n'.join([''.join([('Love'[(x-y) % len('Love')] if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0 else ' ') for x in range(-30, 30)]) for y in range(30, -30, -1)]))
打印99乘法表
这行代码可以打印出我们非常熟悉的99乘法表。
- print('\n'.join([' '.join(['%s * %s = % - 2s' % (y, x , x*y)for y in range(1, x + 1)])for x in range(1, 10)]))
有用的“一行代码”
“一行代码”当然也可以有用,对编程有更深理解的时候,可以用“一行代码”这种形式加快我们写代码的速度。
创建一个服务器
如果我们想要用Python创建一个服务器,可能需要这些代码:
- import http.server
- import socketserver
- PORT = 8000
- Handler = http.server.SimpleHTTPRequestHandler
- with socketserver.TCPServer(("", PORT), Handler) as httpd:
- print("serving at port", PORT)
- httpd.serve_forever()
而现在用一行代码就能搞定:
- python -m http.server 8000
嵌套循环
有两个数组:
- iter1 = [1, 2, 3, 4]
- iter2 = ['a', 'b', 'c']
一般的嵌套循环代码是这样的:
- for x in iter1:
- for y in iter2:
- print(x, y)
一行代码可以这样写:
- [print(x, y) for x in iter1 for y in iter2]
解算法题
力扣上有这样一个算法题:给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
就可以用一行代码解决:
- class Solution {
- public:
- bool isPowerOfTwo(int n) {
- return (n > 0) && (!(n & (n - 1)));
- }
- };
应该追求好的代码
不难看出上面大部分代码都是用的Python,这也是Python简单、优雅的体现。那是不是说我们在编程过程中代码写得越短越好,最好是一行呢?
答案是否定的。
如同大部分程序员调侃的经典删库跑路代码一样,没有人会在生产代码中去用那些炫技的“一行代码”。更重要的是通过“一行代码”来加深理解该语言的特性,掌握其编程技巧,成为真正的编程专家。
而且在项目中,那些很长的“一行代码”是完全被拒绝的,属于“Clean Code”系列作者罗伯特·C. 马丁口中的“糟糕的代码”,会毁了整个系统。他们的可读性实在是太差,就算有一些简单的注释,后来维护者大概率也看不懂为什么要写那样一段代码。
所有,优秀的程序员在写代码的时候追求的不是短,而是优雅、整洁。就像C++之父Bjarne Stroustrup说的一样:
我喜欢优雅和高效的代码。代码逻辑应当直截了当,令缺陷难以隐藏;尽量减少依赖关系,使之便于维护;依据某种分层战略完善错误处理代码;性能调至最优,省得引诱别人做没规矩的优化,搞出一堆混乱来。整洁的代码只做好一件事。
要写出优雅、高效的代码,除了掌握一些代码规范之外,更重要的是理解业务逻辑,知道如何正确选择和高效实现算法。
来源:异步社区