ここ10年で最高に醜いPythonによるFizzBuzz pic.twitter.com/s61asSaSyt
— フライドサラダチキン南蛮 (@raclett3) February 15, 2020
Python3(以下Python)は平易で読みやすい文法を特徴とします。(本当にそうなのかは議論の余地があると思いますが、少なくとも上記ツイートのソースよりは読みやすいと思われます。)
しかしながら、Pythonには重大な欠点があります。さまざまな値を表現するのにリテラルを使用するため、もしあなたが文字列と数値と真理値のリテラルアレルギーになってしまったときにPythonが使用できなくなってしまうのです。
しかしご安心ください。以下のテクニックを駆使することで、それらのリテラルが使用できなくなっても値を表現することが出来ます。
真理値
True
とFalse
を表現する方法は比較的簡単です。
not() # True
not[()] # False
not
演算子はFalsyな値をTrue
に、Truthyな値をFalse
にします。何がFalsyであるかは公式ドキュメントにあります。
空タプルはFalsyであるため、not
で否定することでTrue
を得られます。対して、空タプルのリストはTruthyであるため、否定することでFalse
を得られます。
小さな数値
比較的小さな数値は、str()
, int()
と各種組み込みクラスで作った文字列やタプル等の長さをlen()
で取得することで作ることが出来ます。
int() # 0
len([()]) # 1
len(((),())) # 2
len(hex(not())) # 3
len(str(not())) # 4
len(str(not[()])) # 5
len(str(complex(not(),int()))) # 6
len(str(bytes(len(((),))))) # 7
len(str(((),()))) # 8
len(str(([int()],[]))) # 9
int()
はこちら、str()
はこちらで詳しい仕様を知ることが出来ます。
さらに、これらを文字列として結合したあとint()
で数値に変換したり、算術したりすることであらゆる数値を作成できます。
文字
数値があれば、文字列リテラルがなくともすでにある文字列から添字で値を借りることが出来ます。スライスで目当ての文字列をそのまま引っ張ってくることも出来ます。
str(not[()])[not()] # a
str(bool)[len(str(((),())))] # b
str(complex)[len(str(((),())))] # c
...
全ての文字について書くと長くなりすぎるのでやめておきます。君だけの文字の生成法を見つけてくれよな!
番外編: ifアレルギーを発症してしまったときに
人によってはifアレルギーを発症してしまうことがあるかもしれません。そんなときには、以下の回避法があります。
andとorによる回避法
and
とor
は、短絡評価という、結果が確定したらそれ以上評価を行わない(左辺が、and
ならFalse
、or
ならTrue
であれば右辺を評価しない)という特徴があります。(公式ドキュメント)
これを利用することで、
condition and truthy or falsy # or以降は省略可能
# condition = 条件, truthy = Trueの場合, falsy = Falseの場合
と記述することが出来ます。
whileによる回避法
上記の方法ではtryやwhileといった構文を含めることが出来ません。そこで、whileを使った回避法もご紹介します。
while condition:
...
break
まとめ
これらのテクニックを用いることで、文字列と数値と真理値のリテラルを使用せずにPythonのコードを書くことが出来ます。最初のツイートもおおよそこれらのテクニックで記述されているため、だいたい何を書いているかもわかるようになったことかと思います。
もしあなたがそれらのアレルギーであれば、この記事が助けになれば幸いです。あなたがそれらのアレルギーを発症した日には、またこの記事を見て、対策への第一歩となれば嬉しいです。
追記(2020/02/20)
こちらの記事で@ikanamazuさんに解説して頂きました。本当にありがとうございます!
ところで2020/02/20ってめっちゃ並び綺麗っすね。