美文网首页Python新世界python热爱者码农的世界
一句 Python 语言能实现哪些神奇功能?我已经例举几十个,还

一句 Python 语言能实现哪些神奇功能?我已经例举几十个,还

作者: Python新世界 | 来源:发表于2018-09-09 19:31 被阅读23次
    一句 Python 语言能实现哪些神奇功能?我已经例举几十个,还有吗

    一行 Python 能实现什么丧心病狂的功能?

    爱心

    <pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); word-break: break-all; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">print'
    '.join([''.join([('PYTHON!'[(x-y)%7]if((x0.05)2+(y0.1)2-1)3-(x0.05)2(y0.1)*3<=0 else' ')for x in range(-30,30)])for y in range(15,-15,-1)])
    </pre>

    range() 不能用浮点不开心。

    一句 Python 语言能实现哪些神奇功能?我已经例举几十个,还有吗

    Mandelbrot set

    <pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); word-break: break-all; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">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,zz+c,c,n-1))(0,0.02x+0.05jy,40))<2 else' 'for x in range(-80,20)])for y in range(-20,20)])
    </pre>

    一句 Python 语言能实现哪些神奇功能?我已经例举几十个,还有吗

    八皇后问题

    让开,我要装逼了。1行python解八皇后,其中一大半代码是用于打印出来带格式的。

    <pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); word-break: break-all; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">_=[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)))]
    </pre>

    一句 Python 语言能实现哪些神奇功能?我已经例举几十个,还有吗

    终端路径切换到某文件夹下

    键入:

    <pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); word-break: break-all; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">python -m SimpleHTTPServer 8000
    </pre>

    然后浏览器打开 localhost:8000,一个简易的web服务就开启了,我经常用这个来分享实验室里的电脑上的目录,这样在宿舍也可以方便地获取想要的资料了。

    PS:Windows下通过IIS开个ftp也就几步,但如果装了Python,就一行代码。

    lambda

    其实,只要你功能不是太大。。。那用lambda都可以包裹到一行。

    有一个这样的库,可以把你所有python实现,包裹到一行当中,比如这个

    <pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); word-break: break-all; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">x = 3
    y = 4
    print (x < y < 5)
    </pre>

    会下面变成这样:

    <pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); word-break: break-all; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">(lambda x: (lambda y: print(x<y<5))(4))(3)
    </pre>

    又比如复杂一点的

    <pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); word-break: break-all; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">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)
    </pre>

    会变成下面这样

    <pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); word-break: break-all; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">(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'))
    </pre>

    原理是lambda caculus,看一看也挺好玩的。

    爬虫库

    import requests

    对于一个用C++写过爬虫的人来说,没有比这一行更加丧心病狂的了!!!

    最经典的还是一行筛质数

    <pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); word-break: break-all; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">filter(lambda x: all(map(lambda p: x % p != 0, range(2, x))), range(2, n))
    </pre>

    一般而言,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 这种东西。 暂时就这些,想到再来更新。

    一行代码输出斐波那契数列

    <pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); word-break: break-all; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">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)]])
    </pre>

    一行代码实现快排算法

    <pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); word-break: break-all; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;"> 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
    </pre>

    一行代码实现数组的flatten功能

    将多维数组转化为一维

    <pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); word-break: break-all; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;"> flatten = lambda x: [y for l in x for y in flatten(l)] if isinstance(x, list) else [x]
    </pre>

    一行代码实现list

    有点类似与上个功能的反功能

    <pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); word-break: break-all; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">array = lambda x: [x[i:i+3] for i in range(0, len(x), 3)]
    </pre>

    一行代码实现求解2的1000次方的各位数之和

    <pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px 0px 24px; position: relative; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; font-family: Consolas, Inconsolata, Courier, monospace; font-size: 14px; line-height: 22px; color: rgb(0, 0, 0); word-break: break-all; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">print(sum(map(int, str(2**1000))))
    </pre>

    小编已经说了几十个相关例子了,真不相信还有人能说出更多!

    一句 Python 语言能实现哪些神奇功能?我已经例举几十个,还有吗

    相关文章

      网友评论

        本文标题:一句 Python 语言能实现哪些神奇功能?我已经例举几十个,还

        本文链接:https://www.haomeiwen.com/subject/doudgftx.html