ワンライナーはダークサイド。改行をいれるべし
今年は西尾さんのワンライナー芸が見られなさそうで残念だ。いやいや、去年のLL Ringで懲りましたから。ワンライナー イクナイ!
ワンライナーはダークサイド。 やすきに流されてワンライナーを書いてはいけないのですよ!
先日のプログラミングシンポジウムで「カレンダーを表示するプログラムを書け」というお題が出されて、 ついついワンライナーで書いてしまったのですが…
やっぱりこれはいけないですよね。 いくら資料を作り始めたのが開始の前日の夜だったからといって、 手抜きしてワンライナーなんか書いちゃいけないんですよ。 やっぱりPythonのコードは読みやすく改行を入れるべきなのですよ。
「本当は一行なんだけどもエディタの折り返し幅を32文字にすることで正方形!」とか 何を寝ぼけたことを言っているのかと。 そんなトリッキーなコードを書いていないできちんと改行入れて読みやすいコードを書けと。
というわけできちんと改行を入れて作り直しました。
ほらこの通り、ちゃんと改行を入れれば読みやすい!
最初のバージョンでlamndaのdとaの間に改行が入っているのなんか全然ダメダメですよね。 実行するためにはわざわざ改行文字を取り除かないとシンタックスエラーになっちゃうよね! こっちはちゃんと改行してあるからこのままPythonで実行できますよ!
>>> \
(lambda s=__import__("sys"),(y,m
)=input("year and month (y, m)>"
):(lambda w=s.stdout.write,l=[28
+v for v in 3,(lambda y,x=lambda
y,d:y/d-(y-1)/d:x(y,4)-x(y,100)
+x(y,400))(y),3,2,3,2,3,3,2,3,2,
3][m-1],z=lambda y,m,d:(lambda a
,b:(int(m*2.6-0.2)+d+b+b/4+a/4+5
*a)%7)(*divmod(y,100)):w(("%d/%"
"d"%(y,m)).center(20)+"\n")or w(
" S M Tu W Th F S \n")or[[1-
(0<e<=l)and[w(" "*3)]or w("%2d \
"%e)for e in range(d,d+7)]and w(
"\n")for d in range(1-(lambda y,
m,d:(m<3)and[z(y-1,m+10,d)]or[z(
y,m-2,d)])(y,m,1)[0],l,7)])())()
year and month (y, m)>2007, 8
2007/8
S M Tu W Th F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
[None, None, None, None, None]
実行すると年と月を聞いてくるので「2007, 8」とか入力してやってくださいな。
注: 西尾泰和のブログ: Pythonでワンライナーを作成する際のノウハウ集 を真に受けて反論したりしている人がいるみたいですが、 これはネタなので業務コードで実践しないように! 追記:
最初話を聞いたとき、前者の「エディタの論理改行をつかったワンラーナー」と「有効な改行を入れた非ワンライナー」の違いがはっきりとは分からなかったが、よく見たら前者だとlambdaが途中で切れていたのね。おびなたのはてな日記 - ワンライナーは悪
そう。識別子の途中で改行されると読みにくいのです。lambdaは色が付いていてわかりやすいけども、__import__("sys").stdout.writeとかも途中で改行されています。この行を決められた長さで改行するのが一番難しかったです。結局lambdaが2重になっていることを利用して2行に分けてから改行したのですが。