1. 程式人生 > 程式設計 >Python 一行程式碼能實現喪心病狂的功能

Python 一行程式碼能實現喪心病狂的功能

手頭有 109 張頭部 CT 的斷層掃描圖片,我打算用這些圖片嘗試頭部的三維重建。基礎工作之一,就是要把這些圖片資料讀出來,組織成一個三維的資料結構(實際上是四維的,因為每個畫素有 RGBA 四個通道)。

這個資料結構,自然是 numpy 的 ndarray 物件,讀取影象檔案我習慣使用 PIL。因此,需要匯入兩個模組:

import numpy as np
from PIL import Image

接下來,我用一行程式碼就把 109 張圖片讀到了一個 109x256x256x4 的 numpy 陣列中,耗時 172 毫秒:

data = np.stack([np.array(Image.open('head%d.png'%i)) for i in range(109)],axis=0)

通常,上面這一行程式碼應該寫成這樣:

data = list()
for i in range(109):
	img = Image.open('head%d.png'%i)
	img = np.array(img)
	data.append(img)
data = np.stack(data,axis=0)

我把這些程式碼寫成一行,卻毫無晦澀艱深之感,仍然像詩歌一樣優美、像自然語言一樣通俗!

那一刻,我腦洞大開,很想知道 python 高手們只用一行程式碼都能幹些什麼?當然,限定條件是不能引用自定義的模組,可以使用內建模組或通用的第三方模組。上網一搜,發現這個問題好像是 python 的專屬問題,其他語言很難用一行程式碼做點什麼。知乎上有一篇名為《一行 Python 能實現什麼喪心病狂的功能?》的帖子,其映象貼只有 java 的和 js 的,點進去發現,和 python 的完全不是一個概念。

整理了一下知乎上這篇文章的內容,頗覺有趣,分享給大家。

1. 一行程式碼列印乘法口訣

print('\n'.join([' '.join(["%2s x%2s = %2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))

2. 一行程式碼列印迷宮

print(''.join(__import__('random').choice('\u2571\u2572') for i in range(50*24)))

3. 一行程式碼表白愛情

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 <= 0else' ') for x in range(-30,30)]) for y in range(30,-30,-1)]))

4. 一行程式碼列印小龜龜

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

你在 python 使用過程中用一行程式碼實現過哪些激動人心的功能呢?歡迎留言討論。