一行 Python 能实现什么丧心病狂的功能?
爱心
print' '.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() 不能用浮点不开心。
Mandelbrot set
print' '.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)])
八皇后问题
让开,我要装逼了。1行python解八皇后,其中一大半代码是用于打印出来带格式的。
_=[__import__('sys').stdout.write(" ".join('.' * i + 'Q' + '.' * (8-i-1) for i in vec) + " === ") for vec in __import__('itertools').permutations(xrange(8)) if 8 == len(set(vec[i]+i for i in xrange(8))) == len(set(vec[i]-i for i in xrange(8)))]
终端路径切换到某文件夹下
键入:
python -m SimpleHTTPServer 8000
然后浏览器打开 localhost:8000,一个简易的web服务就开启了,我经常用这个来分享实验室里的电脑上的目录,这样在宿舍也可以方便地获取想要的资料了。
PS:Windows下通过IIS开个ftp也就几步,但如果装了Python,就一行代码。
lambda
其实,只要你功能不是太大。。。那用lambda都可以包裹到一行。
有一个这样的库,可以把你所有python实现,包裹到一行当中,比如这个
x = 3 y = 4 print (x < y < 5)
会下面变成这样:
(lambda x: (lambda y: print(x<y<5))(4))(3)
又比如复杂一点的
def guess_my_number(n): while True: user_input = raw_input("Enter a positive integer to guess: ") if len(user_input)==0 or not user_input.isdigit(): print "Not a positive integer!" else: user_input = int(user_input) if user_input > n: print "Too big! Try again!" elif user_input < n: print "Too small! Try again!" else: print "You win!" return True guess_my_number(42)
会变成下面这样
(lambda __builtin__: (lambda __print, __y, d: [(lambda ___: None)(d.guess_my_number(42)) for d.guess_my_number in [(lambda n:[(__y(lambda __this: (lambda d: (lambda __after: [(lambda __after: (lambda ___: __after(d))(__print('Not a positive integer!')) if (d.len(d.user_input)==0 or (not d.user_input.isdigit())) else [(lambda __after: (lambda ___: __after(d))(__print('Too big! Try again!')) if d.user_input>d.n else (lambda __after: (lambda ___: __after(d))(__print('Too small! Try again!')) if d.user_input<d.n else (lambda ___: d.True)(__print('You win!')))(lambda d: __after(d)))(lambda d: __after(d)) for d.user_input in [(d.int(d.user_input))]][0])(lambda d: __this(d)) for d.user_input in [(d.raw_input('Enter a positive integer to guess: '))]][0] if d.True else __after(d))(lambda d: None))))(d) for d.n in [(n)]][0])]][0])(__builtin__.__dict__['print'],(lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))),type('StateDict',(),__builtin__.__dict__)()))(__import__('__builtin__'))
原理是lambda caculus,看一看也挺好玩的。
爬虫库
import requests
对于一个用C++写过爬虫的人来说,没有比这一行更加丧心病狂的了!!!
最经典的还是一行筛质数
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 这种东西。 暂时就这些,想到再来更新。
一行代码输出斐波那契数列
print([x[0] for x in [(a[i][0], a.append([a[i][1], a[i][0]+a[i][1]])) for a in ([[1, 1]], ) for i in range(30)]])
一行代码实现快排算法
qsort = lambda arr: len(arr) > 1 and qsort(list(filter(lambda x: x <= arr[0], arr[1:]))) + arr[0:1] + qsort(list(filter(lambda x: x > arr[0], arr[1:]))) or arr
一行代码实现数组的flatten功能
将多维数组转化为一维
flatten = lambda x: [y for l in x for y in flatten(l)] if isinstance(x, list) else [x]
一行代码实现list
有点类似与上个功能的反功能
array = lambda x: [x[i:i+3] for i in range(0, len(x), 3)]
一行代码实现求解2的1000次方的各位数之和
print(sum(map(int, str(2**1000))))
小编已经说了几十个相关例子了,真不相信还有人能说出更多!