データサイエンスのためのPython入門⑤〜文法まとめ2 関数〜

グローバルでAI開発者・データサイエンティストを目指す人向け
おすすめUdemy講座一覧

TOEIC300→海外就職の英語勉強法まとめ

こんにちは,米国データサイエンティストのかめ(@usdatascientist)です.

データサイエンスのためのPython入門第5回です(講座の目次はこちら).前回の記事に引き続き,今回もPythonの文法のおさらいをしていきます(今回で終わるので我慢してほしい...!)

Python経験者はサーっとコードだけ見て,知らない文法がないことを確認すればOKです.

自信がない方は説明も読んで理解しましょう.使ったことがない文法があれば,Jupyterで適宜自分でコードを書いて実行しましょう!

関数

関数って聞くと数学で習った二次関数(\(y = x^2)\)とかの関数を思い浮かべるかもしれません.\(x\)という箱があって,例えばそれに2とか0.1とか数字を入れると\(y\)が計算されるのが関数でしたね.

プログラミングも考え方は同じです.「引数」と呼ばれる箱に値を入れて「戻り値」が返ってきます(「返り値」と呼ぶ人もいます.どっちでもいいです.また,何も返ってこない関数もあります.).英語では引数のことをparameterと呼び,戻り値のことをreturnといいます.ちなみに自分はよくargumentparameterをごっちゃになりますが,\(x\)のことをparameter呼び,その\(x\)に代入する値(2とか0.1)のことをargumentと呼びます.

Pythonでは関数のことを英語でfunctionと言います.これもごっちゃにしがちですがmethodはクラスに定義している関数のことを言います.が,そんなお堅いこと言わず,誰もfunctionとmethodがごっちゃになってても気にしませんし気づきません.(クラスをご存じない方は気にしないでOKです!)

Pythonでは以下のようにして関数を定義します.

  1. def function_name(param1, param2): で関数を定義します. () の中に引数を入れていきます.引数がない関数も当然あります. def function_name(param1='default1', param2='default2'): のように引数に = をつけることでデフォルト値を指定することもできます.その場合,デフォルト値を定義している引数は後ろにします.例えば (param1, param2='default2') みたいな
  2. '''""" (クオテーション3つ)で囲めば複数行のコメントを書けます.(第3回で紹介した通り,改行の文字列とすることもできます.)第2回で紹介した通り,関数を呼ぶときにShift + Tabでこのコメントの内容を見ることができます.小さい関数であれば不要ですが,大きめの関数や,みんなが使うようなutil関数の場合はなるべく作りましょう.使う人が「この関数がなにをするのか」,「どういう引数をとるのか」などわかるといいです.私はよく使い方のSampleを書いたりします.
  3. 処理を書きます.インデントするのを忘れないように..
  4. 返すものがあれば return のあとに返す変数や値を書きます.複数ある場合は return 変数1, 変数2 とします.そうするとタプルで返されます.

関数をcall(実行)するときは 関数名(引数) で関数をcallします.引数は,定義された順番通りに入れましょう.引数が多いときは function_name(param1=arg1, param2=arg2) のように,どのparameterにどのargumentを入れるかを明記しましょう.見やすいです.この場合順番通りである必要ありません.戻り値があれば値が返ってくるので,普通は変数に代入します.

関数を作ることで,これを使いまわせるので同じ処理を何回も書く必要がなくなります.便利だしコードが綺麗になってデバッグもしやすいのでどんどん作るようにしましょう.

lambda関数

ラムダ関数と読みます.Pythonを使ったことがある人でも,自信ない人多いと思います.lambda関数はデータサイエンスでPythonを使うなら必須の文法なので必ず覚えましょう.

lambda関数は,一行で終わるような小さい関数で,名前もつけるまでもないときに使う表現です.データサイエンスでは,「全てのデータにちょっとした処理をしたい」時があり,そのときにlambda関数を書くケースが多いです.

まず,以下のような関数があるとします.pathからファイル名を取得する関数です. .split() 関数は引数で文字列を区切ってリストで返します.pathは /で区切ったら最後の要素がファイル名になるので.最後のindexである -1 でアクセスします.この流れはデータサイエンスではよく使うので覚えておきましょう.

それでは,lambda関数の作り方を紹介します.まず,以下の関数を見てください.

この関数,実は一行で書いても同じです.

こんな一行のために関数名なんていらんでしょ!ってことでdef 関数名と()括弧,returnを省いて,lambdaをつけるとlambda関数の出来上がりです.

lambda関数は lambda 引数: 戻り値 の形をとります.めっちゃシンプル! これだけだと関数オブジェクトなので,上の例ではこれを変数 x に代入してcallしました.実際は変数に入れて使うよりは他の関数の引数にそのまま入れて使うことが多いです.(Pythonでは関数もオブジェクトです.なので引数に関数をとることも可能) データサイエンスでは,今後出てくるpandasというパッケージの .apply() 関数でよく使うので頭の片隅に入れときましょう.

(追記:apply関数についての記事を書きました!↓

データサイエンスのためのPython入門17〜DataFrameの重要関数(apply, unique, value_counts)を超わかりやすく解説〜

*argsと**kwargs

  • *args

これも使ったことない人多いんじゃないかなと思います.引数の数が決まってないときに使います.例えば↓な感じです.

引数に *args を指定すると,関数をcallするときに好きなだけ引数を入れることができます.どんなデータタイプでもOKです.

関数の中では args にタプルで保存されているので,そこにアクセスすることで引数を取り出せます.

でも,これだとfor文で回すくらいのことしかできないです.そこで,次に紹介する **kwargs という *args のDictionary版を使うことが多いです.

  • **kwargs

「keyword arguments 」の略で,引数がタプルではなくてdictionaryになります.argsがタプル,kwargsがkeywordつきのdictionaryと言ったイメージですね.関数を呼ぶときに function(param1=value1, param2=value2) という具合でkeywordとvalueを指定します.

これは引数がたくさんあるときに使います.引数が増えると関数を定義するときにみにくくなるので,一旦 **kwargs として関数内で引数を変数に代入します.こんな感じです↓

kwargs.get(key) でそのkeyのvalueを取り出すことができます.もちろんkwargsはdictionaryなので kwargs[key] でvalueを取ってこれますが,そのkeyが引数として渡されていない可能性もあり,その場合エラーになってしまうので .get() を使います.もしそのkeyがない場合はNoneが返されエラーにはなりません. .get() にもう一つ引数を渡すことでデフォルトの値を指定できます.引数が多い場合はこのようにして引数を管理すると綺麗になります.

ちなみにargsとかkwargsの名前は実はなんでもOK.ただ,慣習的にリストには args ,dictonaryに kwargs を使うし,他の名前を使うことはほぼありません.

まとめ

これで一通りPythonまとめは終わりです!

ほんとはもっと知っておかないといけない文法はありますが,今回の講座は「データサイエンスのための」Pythonということで,あまりPythonに深入りはしません!

余力があれば初心者向けPython講座を作ってもっと体系的・網羅的にPythonを学習したいと思います.

また,Pythonはオブジェクト指向という言語の仲間ですが,今回の講座ではオブジェクト指向は一旦外そうかなと思ってます.理由は,「オブジェクト指向は必須ではないし,知らない読者も多いし,オブジェクト指向の基礎を記事にするとそれだけでかなりの量になりそうだから」です.

私はオブジェクト指向推奨派で絶対使うべきだし,業務で開発する際には基本オブジェクト指向で書きます.ただ,データサイエンスのPythonを学ぶ上で必須かというとそうでもないので今回は割愛しようかなと.余力があったらオブジェクト指向は別のPython講座で説明したいなと思ってます.

それでは,次回からついにデータサイエンスに必要なモジュールを扱います.第一弾はNumpyです!変な名前ですが,一気にPythonでできることが広がるので楽しいですよ!

追記)次回記事書きました.↓

データサイエンスのためのPython入門⑥〜はじめてのNumpy〜