読者です 読者をやめる 読者になる 読者になる

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 []) # []