python3でコードゴルフをするためのテクニック
':'の後ろに式を書くことができる。
for や if のあとにつく : の後ろに続けて式を書くことで余分なスペースを省くことができる。続けて式を書きたい時には ; で区切る。
しかし、2重for や for:if: のように : の後ろに更に : がつくような式は書くことができない。
# long for i in range(10): print(i) print(i*i) # short for i in range(10):print(i);print(i*i) # このような書き方はできない for i in range(10):for j in range(10):print(i*j) # 3項演算子ならOK for i in range(10):a+=0 if i%3==0 else 1
n回処理をするときにはrangeを使わない
ただ単にn回処理を行いたい場合には [0]*n を使うと3文字短くすることができる。
# long for i in range(10):print('Hello world!') # short for i in [0]*10:print('Hello world!')
複数回同じ関数を使うなら関数を代入する
3回以上input()を使うなら、inputを変数に代入することによってコードを短くすることができる。
input の他にも print や range などでも有効。
# long a=input();b=input();c=input() # short i=input;a=i();b=i();c=i()
lambdaが使えるなら使う
通常の場合だと def と return が重いので lambda を使うと良い
from math import * # long def a(x,y):return x*y//gcd(x,y) # short a=lambda x,y:x*y//gcd(x,y)
rangeでループするときはiの初期化はいらない
forループ後もiは生きているので i = 0で初期化はいらない
for i in range(10): pass print(i) # 9が表示される
リストを使って場合分けを行う
# グー = 0, チョキ = 1, パー = 2 print(["Drew","Lost","Won"][(a-b)%3]) # printされる値は以下のようになる # 001 002 003 # 004 005 006 # 007 008 009 for i in range(1,10):print(("%03d"+"\n "[i%3!=0])%i,end="")
reversedではなく[::-1]を使う
リストや文字列を反転させたい時には reversed (reverse) ではなく [::-1]を使うと良い。
# long print("".join(reversed(sorted(input())))) # short print("".join(sorted(input())[::-1]))
細々としたコード短縮法
数字と数字以外の文字の間のスペースや、記号以外の文字と記号の間のスペースは省略できる。
# long for i in [0]*10:print('Hello world!') # short for i in[0]*10:print('Hello world!') # long a=0 if i<3 else i%3 # short a=0if i<3 else i%3
おまけ
and, orを駆使する
and や or の挙動を知っておくと便利かもしれない
# 前が False の場合、前の値を返す print(0 and 2) # 0 # 前が True の場合、後ろの値を返す print(1 and 2) # 2 # True と判定した方を返す # 両方とも False の場合は後ろの値を返す print(0 or 2) # 2 print(1 or 2) # 1 print(None or []) # []