一行 Python 能实现什么丧心病狂的功能?
关注者
9,071被浏览
1,120,948135 个回答
print'\n'.join([''.join([('PYTHON!'[(x-y)%7]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(15,-15,-1)])
range() 不能用浮点不开心。
如何用C语言画一个“心形”? - Milo Yip 的回答----
Mandelbrot set
print'\n'.join([''.join(['*'if abs((lambda a:lambda z,c,n:a(a,z,c,n))(lambda s,z,c,n:z if n==0else s(s,z*z+c,c,n-1))(0,0.02*x+0.05j*y,40))<2 else' 'for x in range(-80,20)])for y in range(-20,20)])
最经典的还是一行筛质数吧。。
filter(lambda x: all(map(lambda p: x % p != 0, range(2, x))), range(2, n))
一般而言,Python 的 one-liner 要不就是用到了很好用的库,要不就是用到了一些函数式的特性以及 list comprehension 等。
诚然,filter、map、reduce 以及 all、any 这些东西都能用 list comprehension 乃至过程式的写法来替代,但写习惯了以后会发现这样不仅写着爽而且思路更清晰了!
其实大多数时候也说不上丧心病狂,只是用来完成一些小工作比较简短方便。
随便补充几个自己经常用到的:
读取 csv 文件。with 和 list comprehension 的使用。strip 和 split 也是处理字符串的常用函数。
with open('t.csv', 'r') as f: rows = [line.strip().split(',') for line in f.readlines()]
对 array 按照第二列降序排序并取前 10 个。匿名函数和切片操作的使用。说起来给 sort/sorted 提供 key 会比提供 cmp 要快。(好像 Python 3 里面把 cmp 给取消了)
sorted(array, key=lambda x: x[1], reverse=True)[:10]
对两个字符串(这里假设等长)做异或操作。join 和 zip 的使用。
"".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a, b)])
其他的话,要看具体做什么。如果写爬虫,requests 配合 pyquery 不要太好用;写数值处理 / 科学计算 的小脚本,有 numpy 就可以省下许多事。标准库里面像 os、re、random 等都有许多实用的函数。
个人觉得过分追求 one-liner 不完全是一件好事,更重要的是把这些常用的函数弄熟了,写起代码来自然得心应手,充分发挥 Python 写起来爽的优势。同时要经常思考有没有更好的写法,比如我用了很久的 random.randint 才知道原来还有 random.randrange 这种东西。
暂时就这些,想到再来更新。