グローバルシステム本部ITセキュリティ&品質管理部、ひよっ子Kaggle(https://www.kaggle.com/) Expertの廣橋です(2021年2月2日現在のランク : 949/154,169)。
主な業務は、情報セキュリティの維持/強化です。
業務終了後は、結構、Kaggleのコンペに参加しています。
Kaggleにおいて、プログラミング言語といえばやはりpythonですが、折角python(※1)(※2)でプログラミングしているなら、pythonらしい構文/機能でカッコよく読み書きしたいですよね。
ということで、今日はkaggleでもよく見かけるpythonの便利でカッコ良い構文/機能を10個、私が便利だなと思った順でご紹介していこうと思います。
ただ、こういった構文や機能を使う場合は以下のような利点/欠点がありますので、是非状況にあったものを使ってみて下さい。
利点:カッコ良くて、簡潔に書けて、理解しやすく、打ち込むのも楽。
欠点:知らない人には、何が書いてあるか分からない。適切に使わないと、かえって分かりにくくなる。
それでは早速、1位から紹介して行きます。
第1位 zip()
複数の要素に対して処理を繰り返す時に便利です。
以下の例では、‘a’, ‘b’, ‘c’のキー( key )と’apple’, ‘banan’, ‘coconut’の値( value )から辞書を作ります。keyとvalueをまとめて処理するので、見た目がスッキリしています。
- 準備
1 2 |
>>> key=['a','b','c'] >>> value = ['apple','banana','coconut'] |
- 実行
1 |
>>> dict_fruit= dict(zip(key,value)) |
- 結果
>>> dict_fruit{'a': 'apple', 'b': 'banana', 'c': 'coconut'}
上記を使わない場合は、以下のように、最初から作っておくのが良さそうですが、keyとvalueが沢山あると、これでは辛いですね。
- zipを使わない場合
1 2 3 |
>>> dict_fruit = {'a': 'apple', 'b': 'banana', 'c': 'coconut'} >>> dict_fruit {'a': 'apple', 'b': 'banana', 'c': 'coconut'} |
第2位 リスト内包表記
リスト内包表記を使うと、各要素に対する条件や操作を適用して、新しいリストを簡単に作れます。便利ですね。
- 実行
>>> num_list = [i**2 for i in range(10)]
- 結果
1 2 |
>>> num_list [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] |
上記を使わない場合は、以下のようになると思います。ちょっと面倒ですね。
- リスト内包表記を使わない場合
1 2 3 4 |
>>> num_list =[] >>> for i in range(10): ... num_list.append(i**2) ... |
第3位 3項演算子
何かの条件によって、変数へ代入する値を変えたい場合って、当然ありますよね。
3項演算子を使うと、以下のように1行で書けます。
- 準備
>>> a = 1
- 実行
>>> x ='even' if a % 2 == 0 else 'odd'
- 結果
1 2 |
>>> print(x) odd |
普通に書くと以下のような感じなので、3項演算子の方がスッキリしますね。
- 3項演算子を使わない場合
1 2 3 4 5 |
>>> if a % 2 == 0: ... x = 'even' ... else: ... x = 'odd' ... |
第4位 map()
リストの要素のそれぞれに処理を適用する場合に便利です。このような関数を引数とする関数は、難しく言うと「高階関数」(※2)と呼ばれます。map関数を使わなくても同様のコードは書けますが、面倒なので使わない場合の例は省略します。
- 準備
1 2 3 |
>>> fruits = ['apple','banana','coconut'] >>> fruits ['apple', 'banana', 'coconut'] |
- 実行
1 2 3 4 |
>>> def upper(word): ... return word.upper() ... >>> upper_fruits = list(map(upper, fruits)) |
- 結果
1 2 |
>>> upper_fruits ['APPLE', 'BANANA', 'COCONUT'] |
第5位 generator
next関数を呼ぶ度に、何かの処理をして値を返してくれます。最初に全部処理するのではなくて、必要になった時に初めて処理をするので、メモリなどのリソースを節約することができます。
- 準備
1 2 3 4 5 |
>>> def square_number(): ... for i in range(3): ... yield i**2 ... >>> square_generator = square_number() |
- 実行
1 2 3 4 5 6 7 8 |
>>> next(square_generator,None) 0 >>> next(square_generator,None) 1 >>> next(square_generator,None) 4 >>> next(square_generator,None) >>> |
第6位 enumerate()
forで繰り返し実行する場合に、要素だけでなくて、indexも欲しい場合がありますよね。そういった場合に、enumerateを使います。
- 準備
1 2 |
>>> fruits ['apple', 'banana', 'coconut'] |
- 実行
1 2 3 4 5 6 |
>>> for i, name in enumerate(fruits): ... print(i, name) ... 0 apple 1 banana 2 coconut |
第7位 glob()
あるパスの下の条件に合うファイルに、何かの処理をしたい場合は、これを使うと便利です。
- 実行
1 2 3 4 5 6 7 8 |
>>> import glob >>> for x in glob.glob('env/*'): ... print(x) ... env/bin env/include env/pyvenv.cfg env/lib |
第8位 lambda
第4位で出てきたmap関数を使うときに、「defで関数定義をするのが面倒くさい」と言う人には、lambda関数がおすすめ。1行で書けます。
- 準備
1 2 |
>>> fruits ['apple', 'banana', 'coconut'] |
- 実行
>>> upper_fruits = list(map (lambda x:x.upper(), fruits))
- 結果
1 2 |
>>> upper_fruits ['APPLE', 'BANANA', 'COCONUT'] |
第9位 count()
リストの要素の個数を数えるなんて簡単と思いますが、自分で関数を書くと結構大変。count関数を使えば、一発です。
- 準備
1 2 3 |
>>> fruits_bascket =['apple', 'apple', 'coconut', 'banana','apple','coconut'] >>> fruits_bascket ['apple', 'apple', 'coconut', 'banana', 'apple', 'coconut'] |
- 実行
1 2 |
>>> fruits_bascket.count('apple') 3 |
第10位 sorted()
リストのデータを処理していると、アルファベット順とかに並べたい場合がありますよね。sortedを使えば、以下のように簡単です。大規模で複雑なデータの場合は、pandas(3)を使った方が便利な機能が多くて良いと思います。
- 実行
1 2 3 |
>>> fruits_bascket ['apple', 'apple', 'coconut', 'banana', 'apple', 'coconut'] >>> sorted_fruits_bascket = sorted(fruits_bascket) |
- 結果
1 2 |
>>> sorted_fruits_bascket ['apple', 'apple', 'apple', 'banana', 'coconut', 'coconut'] |
あとがき
如何でしたでしょうか?
「知らなかった。」とか「知ってるけど、使ったことなかった。」という方は、相応しい場面で使ってみて下さい。カッコよくて見やすいプログラムになると思います。
「こんなの普段から使ってるよ。」という方は、かなりPythonを使いこなされていると思います。こういう考えもあるかと思っていただければ幸いです。
ここまでお読み下さり、ありがとう御座います。さてと、今晩は、Kaggle Masterを目指して、またコンペに挑戦しようかな。
*
GMOリサーチでは、WEBエンジニア(サーバーサイド、インフラ、フロントエンド)を随時募集しております。
興味のある方は、ぜひこちらからご応募ください!
詳しい募集要項など採用情報はこちら
参考文献/URL
- Python 3.9.1 ドキュメント: https://docs.python.org/ja/3/
- Pythonプログラミング入門:https://utokyo-ipp.github.io/
- Pandas: https://pandas.pydata.org/