自己紹介
英語の苦手なwhile-true-ifです。
Pythonは小学生のころからやっています。
この記事の対象者
- Pythonのコード内の変数がテキトーな人
- フォルダ・ファイル名がテキトーな人
- クソコードが好きな人
とある日の友達との会話と後悔
状況
友達A君が自分のコードをたまたまみてしまった。
そのコードはいわゆる「クソコード」と呼ばれるものだった...
会話
友達はA、自分はWとします。
A:えっ!なにこれ。変数名テキトーすぎない?
W:普通だよ。大丈夫。何の変数か自分でわかるから。
A:変数名をa
、b
、c
、d
、e
とかってつけてるけど大丈夫なの?26個使い終わったらどうするつもりなの?
W:そんなことないよ。変数はせいぜい10個くらいだよ。
A:もう少し変数名をわかりやすくした方がいいと思うよ。
W:今度からそうするよ。
その後
「今度からそうする」と言ってしまったが、結局いつものクセでついつい変数名は1文字にしてしまった...
そのたびに似たような会話を何回かしていた。そのほかにもファイル名やフォルダ名でも注意された。
そして、後悔するときが1年後くらいにきてしまった...
後悔1
あらすじ
自分は自作のゲーム(マインスイーパー)を9月くらいに作った。そして、そのpythonファイルはpython_game
というちゃんとした名前のフォルダのところに入っていたが、ファイル名はm.py
だった。さらに、運悪く、そのフォルダの中にはそのほかにも10個程度ファイルが入っていて、a.py
やm2.py
やaa.py
など名前のいい加減なものがたくさんあった。しかし、それを放置したままにした。
半年後
そして、半年後くらいにマインスイーパーで遊びたくなった。しかし、マインスイーパーのコードが書かれているファイル名を忘れてしまったので、python_game
というフォルダの中からpythonファイルを一個一個開いてコードをみて、マインスイーパーのコードであるかを確かめるという作業を繰り返してようやくみつかった。
教訓
絶対にファイル名はちゃんとつけましょう。
後悔2
今回の本質です。結論からいうと、変数名はきちんとつけようということです。
あらすじ
今まで、自分の変数名は上からa
、b
、c
、d
、e
というabcde順でつけていました。
そして、友達から、「26個使い終わったらどうするつもりなの?」と聞かれて、「そんなことないよ」と答えていました。
しかし、1年くらいが経過して、ABC058のC問題を解いていたのですが、解法がわからずごり押しにでることとなりました。
クソコード
ちなみにこのコードは変数名のせいでWAした悪いコードです。
nn=int(input())
a,b,c,d,e,f,g,h,ii,jj,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z=[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn
for i in range(nn):
ss=list(input())
for j in range(len(ss)):
if ss[j]=='a':
a[i]+=1
elif ss[j]=='b':
b[i]+=1
elif ss[j]=='c':
c[i]+=1
elif ss[j]=='d':
d[i]+=1
elif ss[j]=='e':
e[i]+=1
elif ss[j]=='f':
f[i]+=1
elif ss[j]=='g':
g[i]+=1
elif ss[j]=='h':
h[i]+=1
elif ss[j]=='i':
ii[i]+=1
elif ss[j]=='j':
jj[i]+=1
elif ss[j]=='k':
k[i]+=1
elif ss[j]=='l':
l[i]+=1
elif ss[j]=='m':
m[i]+=1
elif ss[j]=='n':
n[i]+=1
elif ss[j]=='o':
o[i]+=1
elif ss[j]=='p':
p[i]+=1
elif ss[j]=='q':
q[i]+=1
elif ss[j]=='r':
r[i]+=1
elif ss[j]=='s':
s[i]+=1
elif ss[j]=='t':
t[i]+=1
elif ss[j]=='u':
u[i]+=1
elif ss[j]=='v':
v[i]+=1
elif ss[j]=='w':
w[i]+=1
elif ss[j]=='x':
x[i]+=1
elif ss[j]=='y':
y[i]+=1
else:
z[i]+=1
a=min(a)
b=min(b)
c=min(c)
d=min(d)
e=min(e)
f=min(f)
g=min(g)
h=min(h)
i=min(ii)
j=min(jj)
k=min(k)
l=min(l)
m=min(m)
n=min(n)
o=min(o)
p=min(p)
q=min(q)
r=min(r)
s=min(s)
t=min(t)
u=min(u)
v=min(v)
w=min(w)
x=min(x)
y=min(y)
z=min(z)
print('a'*a+'b'*(b)+'c'*(c)+'b'*(d)+'d'*(e)+'e'*(e)+'f'*(f)+'g'*(g)+'h'*(h)+'i'*(i)+'j'*(j)+'k'*(k)+'l'*(l)+'m'*(m)+'n'*(n)+'o'*(o)+'b'*(p)+'b'*(p)+'q'*(q)+'r'*(r)+'s'*(s)+'t'*(t)+'u'*(u)+'v'*(v)+'w'*(w)+'x'*(x)+'y'*(y)+'z'*(z))
そして、思いました。変数名はちゃんとつけようと。
まさか26個変数を使うわけがないと思ったのですが、その予想を裏切られ、30個を超えてしまいました。
なにが悪いのでしょうか?
自分はよくわからなくて、30分くらい苦戦した記憶があります。
ちなみに、ACコードはこれです。(自分で書きました)
nn=int(input())
a,b,c,d,e,f,g,h,ii,jj,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z=[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn,[0]*nn
for i in range(nn):
ss=list(input())
for j in range(len(ss)):
if ss[j]=='a':
a[i]+=1
elif ss[j]=='b':
b[i]+=1
elif ss[j]=='c':
c[i]+=1
elif ss[j]=='d':
d[i]+=1
elif ss[j]=='e':
e[i]+=1
elif ss[j]=='f':
f[i]+=1
elif ss[j]=='g':
g[i]+=1
elif ss[j]=='h':
h[i]+=1
elif ss[j]=='i':
ii[i]+=1
elif ss[j]=='j':
jj[i]+=1
elif ss[j]=='k':
k[i]+=1
elif ss[j]=='l':
l[i]+=1
elif ss[j]=='m':
m[i]+=1
elif ss[j]=='n':
n[i]+=1
elif ss[j]=='o':
o[i]+=1
elif ss[j]=='p':
p[i]+=1
elif ss[j]=='q':
q[i]+=1
elif ss[j]=='r':
r[i]+=1
elif ss[j]=='s':
s[i]+=1
elif ss[j]=='t':
t[i]+=1
elif ss[j]=='u':
u[i]+=1
elif ss[j]=='v':
v[i]+=1
elif ss[j]=='w':
w[i]+=1
elif ss[j]=='x':
x[i]+=1
elif ss[j]=='y':
y[i]+=1
else:
z[i]+=1
a=min(a)
b=min(b)
c=min(c)
d=min(d)
e=min(e)
f=min(f)
g=min(g)
h=min(h)
i=min(ii)
j=min(jj)
k=min(k)
l=min(l)
m=min(m)
n=min(n)
o=min(o)
p=min(p)
q=min(q)
r=min(r)
s=min(s)
t=min(t)
u=min(u)
v=min(v)
w=min(w)
x=min(x)
y=min(y)
z=min(z)
print('a'*a+'b'*(b)+'c'*(c)+'d'*(d)+'e'*(e)+'f'*(f)+'g'*(g)+'h'*(h)+'i'*(i)+'j'*(j)+'k'*(k)+'l'*(l)+'m'*(m)+'n'*(n)+'o'*(o)+'p'*(p)+'q'*(q)+'r'*(r)+'s'*(s)+'t'*(t)+'u'*(u)+'v'*(v)+'w'*(w)+'x'*(x)+'y'*(y)+'z'*(z))
教訓
変数名はちゃんとつけましょう。
ただ、自分でもちゃんとした変数名のつけ方はわかりません。googleのコード規約とかを読んで勉強したいと思います。
おわりに
最近は1文字の変数名を減らしました。
みんなもちゃんと変数名をつけて、みんなが見やすいコードを作りましょう。
よかったらいいねをお願いします。