Python一行代码能干啥?看到第5个我裂开了
前几天刷到一段代码,整个人都不好了。
就一行。
干了我之前写了20多行才搞定的事。
那一刻我意识到:不是我不会写Python,是我写得还不够骚。
今天分享一些「一行代码流」的操作,建议先收藏,别问我怎么知道的。
unsetunset1. 一行代码输出爱心unsetunset
程序员表白必备。
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 <= 0else' ') for x in range(-30, 30)]) for y in range(30, -30, -1)]))
运行效果自己试,我不说你也知道是个爱心形状。
懂的都懂。
unsetunset2. 一行代码九九乘法表unsetunset
以前写这个要两层循环,现在一行搞定:
print('\n'.join([' '.join([f"{i}x{j}={i*j}"for j in range(1,i+1)]) for i in range(1,10)]))
输出:
1x1=11x2=2 2x2=41x3=3 2x3=6 3x3=9...
面试要是被问到乘法表,甩出这一行,面试官看你的眼神都不一样。
unsetunset3. 一行代码统计词频unsetunset
以前用字典一个一个加,现在:
from collections import Counter; print(Counter("hello world hello python hello code".split()))
输出:
Counter({'hello': 3, 'world': 1, 'python': 1, 'code': 1})
Counter 是个好东西,值得深入了解。
unsetunset4. 一行代码找出最长单词unsetunset
print(max("the quick brown fox jumps over lazy dog".split(), key=len))
输出:jumps
原理是 max() 的 key 参数,可以自定义比较规则。
类似的还可以找最短单词、最大数字等。
unsetunset5. 一行代码反转字符串unsetunset
这个真的简单到离谱:
print("Python"[::-1])
输出:nohtyP
[::-1] 是切片语法,从头到尾,步长为 -1,正好反转。
以后面试被问字符串反转,别再傻傻写循环了。
unsetunset6. 一行代码判断素数unsetunset
n = 17print(all(n % i for i in range(2, int(n**0.5)+1)))
输出:True(17是素数)
用 all() 配合生成器表达式,优雅。
unsetunset7. 一行代码展开嵌套列表unsetunset
把 [[1,2],[3,4],[5]] 变成 [1,2,3,4,5]:
print([x for sub in [[1,2],[3,4],[5]] for x in sub])
双重列表推导式,乍看有点晕,多看几遍就顺了。
unsetunset8. 一行代码读取文件所有内容unsetunset
print(open("test.txt").read())
这行代码有个小问题:文件没关。
更骚的写法:
print(open("test.txt").readlines())
一行一行读,返回列表。
当然,正经项目还是建议用 with open(),别说是我教的。
unsetunset9. 一行代码生成随机密码unsetunset
import random; print(''.join(random.choices('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', k=16)))
生成16位随机密码,字母数字混搭。
改 k 的值就能调整长度。
unsetunset10. 一行代码实现快速排序unsetunset
这个真的绝了:
qsort = lambda L: qsort([x for x in L[1:] if x <= L[0]]) + [L[0]] + qsort([x for x in L[1:] if x > L[0]]) if L else []
测试:
print(qsort([3, 1, 4, 1, 5, 9, 2, 6]))# 输出: [1, 1, 2, 3, 4, 5, 6, 9]
一个 lambda 递归搞定快速排序,Python 的表达能力是真的强。
unsetunset11. 一行代码打印斐波那契数列unsetunset
fib = lambda n: n if n <= 1else fib(n-1) + fib(n-2); print([fib(i) for i in range(10)])
输出前10个斐波那契数:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
unsetunset12. 一行代码找出一组数的最大值、最小值、和unsetunset
nums = [3, 1, 4, 1, 5, 9, 2, 6]print((max(nums), min(nums), sum(nums)))
输出:(9, 1, 31)
这行不算骚,但确实好用。
unsetunset13. 一行代码把矩阵转置unsetunset
把 [[1,2,3],[4,5,6]] 变成 [[1,4],[2,5],[3,6]]:
print(list(zip(*[[1,2,3],[4,5,6]])))
* 解包,zip 重新打包,矩阵转置轻松搞定。
unsetunset14. 一行代码检查列表是否全部唯一unsetunset
print(len(set([1, 2, 3, 4])) == len([1, 2, 3, 4]))# True,没有重复print(len(set([1, 2, 2, 3])) == len([1, 2, 2, 3]))# False,有重复
用集合去重,再比较长度,一目了然。
unsetunset15. 一行代码合并两个字典unsetunset
a = {'x': 1, 'y': 2}b = {'y': 3, 'z': 4}print({**a, **b})
输出:{'x': 1, 'y': 3, 'z': 4}
Python 3.5+ 的语法,** 解包字典。
注意:如果 key 重复,后面的会覆盖前面的。
unsetunset⚠️ 说在最后unsetunset
这些一行代码确实爽,也确实骚。
但是——
千万别在生产环境这么写。
原因很简单:
代码首先是给人看的,其次才是给机器运行的。
骚操作适合:
不适合:
最后问一句:
你用过最骚的一行代码是什么?
评论区见。
如果觉得有用,点个「在看」,让更多人看看 Python 的骚操作 ✨