幾個(gè)小例子告訴你, 一行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倡導(dǎo)Beautiful、Explicit、Simple等原則,當(dāng)然我們接下來(lái)要介紹的一行Python能實(shí)現(xiàn)哪些好玩的功能,可能和Explicit原則相違背。
如果你有其他這方面的小例子,也歡迎評(píng)論,我會(huì)加到文章中,文章也許會(huì)長(zhǎng)期更新。
(1)一行代碼啟動(dòng)一個(gè)Web服務(wù)
- python -m SimpleHTTPServer 8080 # python2
- python3 -m http.server 8080 # python3
(2)一行代碼實(shí)現(xiàn)變量值互換
- a, b = 1, 2; a, b = b, a
(3)一行代碼解決FizzBuzz問(wèn)題:
FizzBuzz問(wèn)題:打印數(shù)字1到100, 3的倍數(shù)打印“Fizz”, 5的倍數(shù)打印“Buzz”, 既是3又是5的倍數(shù)的打印“FizzBuzz”
- for x in range(1, 101): print("fizz"[x % 3 * 4:]+"buzz"[x % 5 * 4:] or x)
(4)一行代碼輸出特定字符”Love”拼成的心形
- 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 <= 0 else ' ') for x in range(-30, 30)]) for y in range(30, -30, -1)]))
(5)一行代碼輸出Mandelbrot圖像
Mandelbrot圖像:圖像中的每個(gè)位置都對(duì)應(yīng)于公式N=x+y*i中的一個(gè)復(fù)數(shù)
- 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 == 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('\n'.join([' '.join(['%s*%s=%-2s' % (y, x, x*y) for y in range(1, x+1)]) for x in range(1, 10)]))
(7)一行代碼計(jì)算出1-100之間的素?cái)?shù)(兩個(gè)版本)
- 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)一行代碼輸出斐波那契數(shù)列
- 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)一行代碼實(shí)現(xiàn)快排算法
- 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)一行代碼解決八皇后問(wèn)題
- [__import__('sys').stdout.write('\n'.join('.' * i + 'Q' + '.' * (8-i-1) for i in vec) + "\n========\n") 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)一行代碼實(shí)現(xiàn)數(shù)組的flatten功能: 將多維數(shù)組轉(zhuǎn)化為一維
- flatten = lambda x: [y for l in x for y in flatten(l)] if isinstance(x, list) else [x]
(12)一行代碼實(shí)現(xiàn)list, 有點(diǎn)類似與上個(gè)功能的反功能
- array = lambda x: [x[i:i+3] for i in range(0, len(x), 3)]
(13)一行代碼實(shí)現(xiàn)求解2的1000次方的各位數(shù)之和
- print(sum(map(int, str(2**1000))))