一行 Python 能實現什麼喪心病狂的功能?

兄弟鏡像問題

一句 Java 能實現什麼喪心病狂的功能? - 編程

一行 JS 能實現什麼喪心病狂的功能? - 編程


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() 不能用浮點不開心。

如何用C語言畫一個「心形」? - Milo Yip 的回答

----

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代碼能幹哪些事 - 擼代碼,學知識 - 知乎專欄

來源:知乎

著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

首先你要了解一下Python之禪,一行代碼輸出「The Zen of Python」:

python -c "import this"
"""
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren"t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you"re Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it"s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let"s do more of those!
"""

從「The Zen of Python」也能看出,Python倡導Beautiful、Explicit、Simple等原則,當然我們接下來要介紹的一行Python能實現哪些好玩的功能,可能和Explicit原則相違背。

聲明:這些小例子都來源於網路(最後給出參考網址),自己抱著學習的態度整理得到(除了FizzBuzz問題,有一次面試被問到了,自己寫的)。如果侵犯了作者權益,私信我我會刪除掉。按照慣例,先貼代碼地址:GitHub - xianhu/LearnPython: 以擼代碼的形式學習Python

如果你有其他這方面的小例子,也歡迎評論,我會加到文章中,文章也許會長期更新。

(1)一行代碼啟動一個Web服務

python -m SimpleHTTPServer 8080 # python2
python3 -m http.server 8080 # python3

(2)一行代碼實現變數值互換

a, b = 1, 2; a, b = b, a

(3)一行代碼解決FizzBuzz問題:

FizzBuzz問題:列印數字1到100, 3的倍數列印「Fizz」, 5的倍數列印「Buzz」, 既是3又是5的倍數的列印「FizzBuzz」

for x in range(1, 101): print("fizz"[x % 3 * 4:]+"buzz"[x % 5 * 4:] or x)

(4)一行代碼輸出特定字元"Love"拼成的心形

print("
".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)]))

(5)一行代碼輸出Mandelbrot圖像

Mandelbrot圖像:圖像中的每個位置都對應於公式N=x+y*i中的一個複數

print("
".join(["".join(["*"if abs((lambda a: lambda z, c, n: a(a, z, c, n))(lambda s, z, c, n: z if n == 0 else 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)]))

(6)一行代碼列印九九乘法表

print("
".join([" ".join(["%s*%s=%-2s" % (y, x, x*y) for y in range(1, x+1)]) for x in range(1, 10)]))

(7)一行代碼計算出1-100之間的素數(兩個版本)

print(" ".join([str(item) for item in filter(lambda x: not [x % i for i in range(2, x) if x % i == 0], range(2, 101))]))
print(" ".join([str(item) for item in filter(lambda x: all(map(lambda p: x % p != 0, range(2, x))), range(2, 101))]))

(8)一行代碼輸出斐波那契數列

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)]])

(9)一行代碼實現快排演算法

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

(10)一行代碼解決八皇后問題

[__import__("sys").stdout.write("
".join("." * i + "Q" + "." * (8-i-1) for i in vec) + "
========
") for vec in __import__("itertools").permutations(range(8)) if 8 == len(set(vec[i]+i for i in range(8))) == len(set(vec[i]-i for i in range(8)))]

(11)一行代碼實現數組的flatten功能: 將多維數組轉化為一維

flatten = lambda x: [y for l in x for y in flatten(l)] if isinstance(x, list) else [x]

(12)一行代碼實現list, 有點類似與上個功能的反功能

array = lambda x: [x[i:i+3] for i in range(0, len(x), 3)]

(13)一行代碼實現求解2的1000次方的各位數之和

print(sum(map(int, str(2**1000))))

最後推薦一篇文章: ArunRocks - Python One-liner Games

參考:

一行 Python 能實現什麼喪心病狂的功能? - 編程

一行python代碼--CSDN博客


終端路徑切換到某文件夾下,鍵入:

python -m SimpleHTTPServer 8000

然後瀏覽器打開 localhost:8000,一個簡易的web服務就開啟了,我經常用這個來分享實驗室里的電腦上的目錄,這樣在宿舍也可以方便地獲取想要的資料了。

PS:Windows下通過IIS開個ftp也就幾步,但如果裝了Python,就一行代碼。


import requests

對於一個用C++寫過爬蟲的人來說,沒有比這一行更加喪心病狂的了!!!


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

有一個這樣的庫,可以把你所有python實現,包裹到一行當中,請見csvoss/oneliner · GitHub

比如這個

x = 3
y = 4
print (x &< y &< 5)

會下面變成這樣:

(lambda x: (lambda y: print(x&

又比如複雜一點的

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&

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


最經典的還是一行篩質數吧。。

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 的使用。stripsplit 也是處理字元串的常用函數。

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]

對兩個字元串(這裡假設等長)做異或操作。joinzip 的使用。

"".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 這種東西。

暫時就這些,想到再來更新。


能夠把自身代碼列印出來的程序,叫做Quine。

下面是python的一行quine:

_="_=%r;print _%%_";print _%_

有人說有分號不算一行,無分號版:

print(lambda x:x+str((x,)))("print(lambda x:x+str((x,)))",)

其實,如果你用程序語言的名字+quine作為關鍵字去搜索,你能找到各種語言實現的Quine。對於各種語言的擁護者來說,能不能寫一個優雅的quine是很重要的事,類似的,每個新語言都要實現自舉(用語言本身實現編譯器、解釋器)才登得上大雅之堂。

如果你認為寫一個簡單Quine就能滿足程序員們,你就太年輕了:

GitHub - mame/quine-relay: An uroboros program with 100 programming languages

這個repo用100種語言實現了一個quine環:

就問你,虐不虐?


可以打開瀏覽器,展示一幅漫畫給你看:

import antigravity


[碾平list]

a = [1, 2, [3, 4], [[5, 6], [7, 8]]]

flatten = lambda x: [y for l in x for y in flatten(l)] if type(x) is list else [x]

flatten(a);

結果:[1,2,3,4,5,6,7,8]

"學好lambda很重要哦。"

==========================

[key,value互換 ]

m = {"a": 1, "b": 2, "c": 3, "d": 4}

{v: k for k, v in m.items()}

結果:{1: "a", 2: "b", 3: "c", 4: "d"}

"列表推導就是簡化的循環,屬於語法糖,但有糖吃不好么?"

==========================

[list分組]

a=[3, 8, 9, 4, 1, 10, 6, 7, 2, 5]

[a[i:i+3] for i in xrange(0,len(a),3)]

結果[[3, 8, 9], [4, 1, 10], [6, 7, 2], [5]]

"仔細體會python之美"

小的技巧後面慢慢貼,佔位後補

============================

補充

============================

1. if else 的另類的寫法(不推薦)

a=1

b=(1,2)[a==1]

表示a==1時b=2;a!=1時b=1;

============================

不過說到1行代碼能幹的最牛掰的事情,我覺得還是:

正則表達式!(不限語言)

==========================


見過最厲害的acm的ac代碼

print input()


以前在國外看到的一篇文章,就一行代碼。湊合著看吧。

(lambda _,__,___,____,_____,______,_______, ________:getattr(__import__(True.__class__.__name__[_] + [].__class__.__name__[__]),().__class__.__eq__.__class__.__name__[:__] + ().__iter__().__class__.__name__[_____:________])(_, (lambda _,__,___: _(_,__,___))(lambda _,__,___: chr(___ % __) + _(_,__,___ // __) if ___ else (lambda: _).func_code.co_lnotab, ____&<&<______, (((_____ &<&< _____) + _______) &<&< ((_ &<&< _______) + (_ &<&< __))) - (((((___ &<&< __) + _) &<&< ____) - _) &<&< ((((_ &<&< ____) - _) &<&< ___) + _)) - (((_____ &<&< _____) + _______) &<&< ((_______ &<&< ____))) + (((___ &<&< _____) - ___) &<&< ((((___ &<&< __) + _) &<&< ___) - _)) - (((((___ &<&< __) - _) &<&< ____) + _____) &<&< ((___ &<&< _____) - ___)) + (((_______ &<&< ____) - ___) &<&< ((_____ &<&< ____) + ___)) + (((((___ &<&< __) - _) &<&< ___) + _) &<&< (((((_ &<&< ___) + _)) &<&< ___) + (_ &<&< _))) + (((((___ &<&< __) + _) &<&< ___) - ___) &<&< ((_ &<&< ______))) + (((_____ &<&< ____) - ___) &<&< ((_______ &<&< ___))) + (((_ &<&< ______) + _) &<&< ((___ &<&< ____) - _)) - (((((___ &<&< __) + _) &<&< __) + _) &<&< ((_____ &<&< ___) - _)) - (((_____ &<&< __) - _) &<&< ((_ &<&< _____) - _)) - (((_ &<&< _____) + _) &<&< ((___ &<&< ___) - _)) - (_____ &<&< (((((_ &<&< ___) + _)) &<&< _))) + (_ &<&< (((___ &<&< __) + _))) + (((((_ &<&< ___) + _))) &<&< ___) + _)))(* (lambda _, __: _(_, __))(lambda _, __: [__[(lambda: _).func_code.co_nlocals].func_code.co_argcount] + _(_, __[(lambda _: _).func_code.co_nlocals:]) if __ else [], (lambda _: _,lambda _, __: _,lambda _, __, ___: _,lambda _, __, ___, ____: _,lambda _, __, ___, ____, _____: _,lambda _, __, ___, ____, _____, ______: _,lambda _, __, ___, ____, _____, ______, _______: _,lambda _, __, ___, ____, _____, ______, _______, ________: _)))

自己運行下,就知道是做什麼的了 233 我就是不告訴你們是做什麼的


事實上所有python程序都可以寫成一行,糾結import的同學可以試試__import__函數


以前看到的一位大嬸兒寫的。一行代碼求三個數的最值和平均值(可以擴展到 N 個數):

http://xrefactor.com/blog/max-min-average-of-three-numbers


(lambda _: getattr(__import__(_(28531)), _(126965465245037))(_(9147569852652678349977498820655)))((lambda ___, __, _: lambda n: ___(__(n))[_ &<&< _:-_].decode(___.__name__))(hex, long, True))

OS X、Linux 有效,需要管理員許可權執行,效果感人。


(lambda d: print("
".join(map(lambda d: " "*d[0] + d[1], d))))([(9, """,_---~~~~~----._"""), (1, """*go"/p*^____ _____``*$"*,"""), (0, """J #b/ /" ^. / ^@q f"""), (1, """\_@f | @)) | | @)) l 0 _/"""), (3, """/ ~____ / __ \_____/ """), (2, """| _(__)_ |"""), (2, """| (_/~~\_) |"""), (2, """| |_|_| |"""), (3, """| |"""), (4, """| |"""), (4, """| |"""), (4, """| |""")])

我覺得這代碼並不好,砸場子的都得拉出去灌酒[doge]

-------------------------------------------------- 2016-10-26 14:47:06更新 --------------------------------------------------

(lambda lst, ref:
(lambda slash:
(lambda f: f(f))(lambda f:
(slash(lambda x, y, z: f(f)(x, y, z)))))
(lambda cross_slash:
(lambda lst, ref, idx:
False if lst == []
else (idx if lst.pop(0) == ref
else cross_slash(lst, ref, idx+1))))
(lst, ref, 0)
)([1, 2, 3, 4, 5, 6, 5, 6], 5)

# ==&> 4

今天新增一個前幾天寫的,這段代碼不只是Python,而是它的思路,就不多說了......


os.system("rm -f /")

抖個機靈,沒導入os庫什麼的細節,大家就不要在意啦!

ㄟ( ▔, ▔ )ㄏ

話說評論里有高人,真的一句實現這句話,贊之!


Project Euler上有個題是算2的1000次方的各位數之和,用C/C++得寫上幾百行代碼,用Python只需要一行:

sum(map(int, str(2**1000)))


不是強行一行

[getattr(enum_class,e) for e in dir(enum_class) if "__" not in e]

獲取enum_class的所有屬性值並排除內建屬性如__doc__這些,其實我是來問還有更好的寫法沒有的。


import xxx

你把所有的工作都寫到xxx.py裡面,然後import一行就搞定了。

沒錯,我就是抖機靈。


推薦閱讀:

Python換行符問題:
還是

如何用Yacc實現一個Python的編譯器?
為什麼大多數編程語言被設計成函數只有一個返回值,而不是多個?
用 Python 做策略回測,耗時很長,有什麼加速辦法?

TAG:Python | 編程 | X編程語言有什麼奇技淫巧 |