null部の部誌

プログラミングの話とか色々。

Pythonの複合文をインデントせずに書く

この前p3+q3+r3=s3 (p, q, r, sは自然数)の解って(3, 4, 5, 6)の立法数倍以外にあるのかなーと思ってpaiza_runしてみたところ、

エラーが途中までしか見えませんがSyntaxErrorになりました。悲しい。

インデントのない複合文

複合文っていうのは要するにifとかforとかwithとかの、 :の後に文を書くアレです。とりあえずifで説明をします。

ifっていうと大抵こんな感じですよね。

if flag:
    hoge()

条件と:のあと改行・インデントして処理を書きます。これは、以下のように書くことと同等です。

if flag: hoge()

インデントをすると文字数が爆発するので、paiza_runとかではこのようにしてインデントを回避できると便利です。

ちなみに、

if flag: hoge(); fuga(); piyo()

これは、以下のコードと同等です。

if flag:
    hoge()
    fuga()
    piyo()

直感的といえば直感的なんですが、C/C++とは違うので注意が必要かもしれません。

ネストがしたい

そういえば私はp3+q3+r3=s3 (p, q, r, sは自然数)の解を探し求めているのでした。頭を全く使いたくないので愚直に(p, q, r, s)を4重ループで回します。

インデントをしたくないのでこう書きたくなります。

r=range(1,10)
for w in r:for x in r:for y in r:for z in r:if w**3+x**3+y**3==z**3:print(w,x,y,z)

しかしこれは冒頭で述べたようにSyntaxErrorになります。リファレンスを見てみましょう。

8. 複合文 (compound statement) — Python 3.6.1 ドキュメント

スイートは、ヘッダのコロンの後ろにセミコロンで区切られた一つまたはそれ以上の単純文を並べるか、ヘッダ行後のインデントされた文の集まりです。後者の形式のスイートに限り、ネストされた複合文を入れることができます ; 以下の文は、 else 節がどの if 節に属するかがはっきりしないという理由から不正になります :
if test1: if test2: print(x)

じゃあwithとかなら良いのかっていうとこれもSyntaxErrorになります。複合文はインデントしないとネストできないのです。大人しくインデントしましょう。

それでも僕はインデントをしたくない

残念ながらTwitterは140字の制限があるのです。インデントなんかしてたらpaiza_runに投げられないのです。そこで登場するのがリスト内包表記。

リスト内包表記を使うと4重ループとifをワンライナーできます。join()とかで適当に整形すれば最初にやろうとしていた出力と同じ出力を得ることもできますが、それをやるには140字は少なすぎる。リスト内包表記はいいぞ。

余談

13+63+83=93という結構小さい解が普通にあって意外でした。ところで連続する3立方数の和が立方数になるのは、33+43+53=63の場合以外にあるのでしょうか。数学のプロ教えてください。