周回遅れでIT業界デビューしたエンジニアのブログ

就職氷河期にモロにぶち当たり、人生で混迷を極めた末にIT業界に安寧を見出そうとしているアラフォーのお勉強日記です。

Pythonで書いたコードをリファクタリング

f:id:sionff:20180119162019j:plain

最近モヤモヤしていること。

1. python自体の理解不足

python案件の仕事でサブシステム1つ担当して実装して単体テスト通すくらいはできるけれど、そもそもその実装がpythonに合った書き方をしているか、効率的に書けているかどうかというのは怪しいわけで。

2. pythonを使った機械学習の理解不足

courseraのMachine Learningは修了して機械学習にどんな種類があるとか理論はざっと学んだものの、pythonでの実装は結局手付かずになっています。

そんな中、いざkaggleに挑戦だ!となっても、pandasの扱い方も分からなければ、scikit-learnのような機械学習のライブラリについての理解も全然なので使いこなせていません。

この感情をとりあえずpaizaにぶつけてみた

そんな中、久しぶりにpaizaで練習してみました。

paiza.jp

プログラミングのスキルチェックと転職活動ができるおなじみのアレです。

1週間ほど遊んでBランクは解けるようになったものの。各種メソッドを知っていれば一発ですぐ分かるのに……と思うことがありすぎて、一度ちゃんとテキストで順を追って知識を習得して整理する必要があると感じました。

例えばこんなコード。

# coding: utf-8

n = 0
c = []
def competitors():
    n = int(input())
    c = [input().split() for i in range(n)]
    for i in range(n):
        for j in range(5):
            c[i][j+1] = int(c[i][j+1])
    return n, c

def points(n, c):
    for i in range(n):
        c[i].append(c[i][2]+c[i][3])
        c[i].append(c[i][4]+c[i][5])
        c[i].append(c[i][1]+c[i][2]+c[i][3]+c[i][4]+c[i][5])
    return c

def predict_a(n, c):
    for i in range(n):
        if c[i][0] == "s":
            c[i].append("OK") if c[i][6] >= 160 else c[i].append("NG")
        else:
            c[i].append("OK") if c[i][7] >= 160 else c[i].append("NG")
    return c

def predict_b(n, c):
    for i in range(n):
        if c[i][9] == 0:
            break
        else:
            if c[i][8] >= 350:
                pass
            else:
                c[i][9] = "NG"
    return c    

def count(n, c):
    d = 0
    for i in range(n):
        if c[i][9] == "OK":
            d = d + 1
        else:
            pass
    print(d)

def main():
    n, c = competitors()
    c = points(n, c)
    c = predict_a(n, c)
    c = predict_b(n, c)
    count(n, c)

main()

次に上をリファクタリングしたコード。

# coding: utf-8

def competitors():
    global n
    n = int(input())
    c = [input().split() for i in range(n)]
    for i in range(n):
        c[i][1:6] = map(int, c[i][1:6])
    return c

def predict(c):
    d = []
    ok = "OK"
    ng = "NG"
    cut_5 = 350
    cut_2 = 160
    for i in range(n):
        if sum(c[i][1:6]) >= cut_5:
            if c[i][0] == "s":
                d.append(ok) if sum(c[i][2:4]) >= cut_2 else c[i].append(ng)
            else:
                d.append(ok) if sum(c[i][4:6]) >= cut_2 else c[i].append(ng)
        else:
            d.append(ng)
    return d.count(ok)

def main():
    d = predict(competitors())
    print(d)

main()

上と下でやってることは同じなのに、最初提出した時に書いたコードの無駄がすごすぎて、直してて一人で凹むという……。いま見返してもホント酷い。

そこで自分への課題を考えた

ステップ1

  • pythonのテキストを1冊こなす → pythonへの理解を深める
  • Udacityの「Intro to Machine Learning」を受ける → python機械学習の実装を学ぶ

このあたりを済ませてから、

ステップ2

  • paizaの続き
  • kaggle挑戦

に行くのがいいかなーとイメージ。

 

まずは本探しから。がんばろう!