手头有 109 张头部 CT 的断层扫描图片,我打算用这些图片尝试头部的三维重建。基础工作之一,就是要把这些图片数据读出来,组织成一个三维的数据结构(实际上是四维的,因为每个像素有 RGBA 四个通道)。
这个数据结构,自然是 numpy 的 ndarray 对象,读取图像文件我习惯使用 PIL。因此,需要导入两个模块:
import
numpy
as
np
from
PIL
import
Image
- 1
- 2
接下来,我用一行代码就把 109 张图片读到了一个 109x256x256x4 的 numpy 数组中,耗时 172 毫秒:
data
=
np
.
stack
(
[
np
.
array
(
Image
.
open
(
'head%d.png'
%
i
)
)
for
i
in
range
(
109
)
]
,
axis
=
0
)
- 1
通常,上面这一行代码应该写成这样:
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
)
- 1
- 2
- 3
- 4
- 5
- 6
我把这些代码写成一行,却毫无晦涩艰深之感,仍然像诗歌一样优美、像自然语言一样通俗!
那一刻,我脑洞大开,很想知道 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
)
]
)
)
- 1
2. 一行代码打印迷宫
print
(
''
.
join
(
__import__
(
'random'
)
.
choice
(
'\u2571\u2572'
)
for
i
in
range
(
50
*
24
)
)
)
- 1
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
)
]
)
)
- 1
4. 一行代码打印小龟龟
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
)
]
)
)
- 1