🤷‍♂️

回りくどすぎるPythonコードを書く

に公開

初めに

インタプリタ言語は、実行速度という最大の弱点を持つものの、
コードはとても簡潔に書けて読みやすい(ことが多い)。

そこで、僕が思ったのは

あえて長くコードを書くことはできるのか?

ということ。
インタプリタの恩恵を実感するためにも、あえて長くコードを書くことにした。

対象

  • C言語がちょっとはわかる人 (#includeとint mainぐらい)

今回作るもの

プログラミングと言ったら誰もが最初は通るであろう
Hello world!\n」を出力するプログラムを書くことにした。

一応、通常のPythonでこれを書いてみると、

print("Hello world!")

となる。Pythonは標準でprintという関数が内蔵されており、
簡単に文字列が出力できる。

完成品

そして、できたのが以下のコード。

import sys

def main():
    with sys.stdout as text:
        text.write("Hello world!\n")
        
    sys.exit(0)

if __name__ == "__main__":
    main()

なんと全部で10行。空行を除いても7行。
あまり見慣れないコードがあったりもするので、
初心者向けに解説することにする。

解説

import sys

これはそのままの意味で、sysというモジュールをインポートする。
#include <stdio.h>と似たような意味である。

def main()

これはC言語のint main () {}部に等しい。

with sys.stdout as text: ...

これが肝心な部分。実はsysモジュールには、
stdout[1]というものがあり、これを使うとprint関数を
使わずに回りくどく文字列を出力することができるのだ!
さらに、標準で改行も付け加えられないので、\nを自分で書く必要がある。

sys.exit(0)

Pythonはプログラム終了時に標準でコード0で終了してくれるが
それを手動で行なっている。本当に意味がない。

C言語で書いてみると?

#include <stdio.h>

int main() {
    puts("Hello world!");
    return 0;
}

全部で6行。なんとあのCを超える行数になっていることがわかった。

結果

- print("Hello world!")
+ import sys
+ 
+ def main():
+     with sys.stdout as text:
+         text.write("Hello world!\n")
+         
+     sys.exit(0)
+ 
+ if __name__ == "__main__":
+     main()
  • Pythonは工夫次第で回りくどくできる。
  • C言語も超える。
  • 普通に書けば良くね?

最後まで読んでいただきありがとうございました!
回りくどいコードの改善案、もっと回りくどくする方法があったら
コメントで教えてください!

脚注
  1. ちょっとファイル操作に似てる。 ↩︎

Discussion