Python3の基本構文 第四回

関数 について

いままでは、いろいろ基本的なコードの簡単なものを紹介してきました。その一連の処理をもし、たびたび使うのであれば関数にしておき、使いたいときに
呼び出して使うのが良い方法です。関数は何?と思うかと思いますが、なにか数値なり文字列なりを入れると、関数内で処理を行い、return値(値)を返してくれる
ものだと思ってください。一回作成すれば、関数の中身を意識せずに利用できます。
x = y + 3 のようにyの値が決まれば x の値が決まるというものです!
関数を使うと、同じ処理を何度も書き直す必要がなくなるため、効率が良くなります。また、エラーの発見や修正も簡単になる利点があります。
 左のように関数の引数に値を渡すと、自動的に数値(計算結果)が出てきます。

関数内のreturnを使わない場合、戻り値は自動的にNoneになります。
関数を都度main.pyで記載するのではなく、別ファイルとしておくと良いかもしれません。その場合、main.pyと同じ階層にfunctionsファイル(関数ファイル)を
おく必要があります。



もしくは、別ディレクトリの場合は、検索pathを通す必要があります。

 こんな感じでimport します。

main.pyでは、上記に習って、importして使うことになります。

functions.pyで以下のgreet()関数を定義したとする。


以下のように使います!


関数を複数記載して、別ファイルを使う場合例えば上記functions.pyがモジュールと呼ばれるものとなります。

うんうん! だんだんプログラムらしい内容になってきました! 第一回から現在第四回ですが、第一回~第三回まで、理解出来なかった人は、
一旦後戻りして、理解してからの方が、良いです。(全体をざっくり見てからでも、良いかもーーー。恐れ入ります!)


関数とは

これまで 関数とは Python が準備してくれるもので 開発者はそれを呼び出すだけとのイメージでした。しかし 実はオリジナルを関数を自分で作ることもできます。
自分でも 関数を作れるようになるとプログラムを複数の部品に分割できるようになります。 例えば1つの長い処理を機能ごとにある程度 分割して複数の関数に分け それぞれの処理を
担当させます。
プログラムを複数の部品に分けることを 部品化と言います。プログラムを 部品化するとどの処理がどのような機能になっているのか プログラムをすっきりと
見通せるようになり全体を把握するのが楽になります。
結果の出力がおかしいという不具合や 計算方法を変更したりという要望にもその機能を担当する関数だけを修正すれば対応できるので、ソースコードを変更する範囲を限定できます。
関数は何度でも呼び出せます。
何度も行う処理を関数にしておけば、あちこちに同じ処理を記述する必要がなくなり コーディングミスを軽減できるだけでなく全体のコード、行数が減り コンパクトなプログラムになります。
そんなワケで、ここでは関数を紹介いたします。
関数の例)
例えば、MySQLに接続するところまでを関数にしておき、何回もuserIDやPasswordをコーディングしなくても良いようにするとか。
下記に一旦、例を書き出します。(MySQL(RDBMS(データベース))は、まだ説明してないので、さらりと流してコードを読んでみて下さい。

MySQLに接続

 

こんなイメージと思ってください!

  部品化のメリット 
 1  プログラム全体の見通しが良くなり 処理を把握しやすくなる。
 2  機能ごとに関数を記述するため修正 範囲を限定できる。 これは プログラムの保守性が向上するということと可読性が向上するということです。
 3  何度も使う機能を関数にまとめることで プログラミングの作業効率が上がる。

自身で作成する関数を使うには 定義 と呼び出しの2つが必要になります。

関数の名前の付け方の注意点
Pythonでは、ある 関数がすでに存在している状態で全く同じ名前の関数を定義することが許されています。関数などの名前が重複した状態を一般的に名前の衝突と言います。
関数名が衝突すると関数の定義が上書きされます。うっかり、すでに提供されている関数名、例えば input('文字列')という名前の関数を自分で定義してしまうと
Pythonが標準で提供しているinput関数が使えなくなってしまいます。

関数名の衝突による上書き
すでに定義されている関数と同じ名前をつけると以前の関数は 呼び出せなくなるんです。(上書きされるということです!)

関数の定義と呼び出し

 

ローカル変数と独立性について

関数の中で定義された変数はその関数の中でしか使えないです。ローカル変数は、特定の関数やブロック内でのみ定義され、使用される変数のことです。
この変数は、そのスコープ(範囲)内でのみアクセス可能であり、外部からは直接アクセスできません。
その関数内部で使用している関数の中に他の関数や、変数で使われている 同じ名前があったとしても全く無関係な 別の存在として扱われます。
関数が、その内部でどのような変数を準備してどのように処理するかを システムは気にしていません。外の世界から関数内の変数に直接アクセスする権限がないということです。
関数の中で定義された変数をローカル変数と言います。プログラミングの世界では グローバル変数をあまり使わずローカル変数で処理することが重要となります。

 

function_aのx: 5
function_bのx: 15

同じ名前の変数 x が使われていますが、それぞれが別のスコープ内で管理されているため、互いに影響を与えません。

関数呼び出しの引数

関数にデータを渡さなければいけない場合があります そのような時は 関数の呼び出しの時に引数を使ってデータを送ることができます。
引数として渡せるデータは数値や 文字列はもちろん コンテナ も 引き渡すことができます。

1. 必須引数
関数を呼び出す際に、必ず値を指定する必要がある引数です。


2. デフォルト引数
関数定義時にデフォルト値を設定しておくことで、引数が指定されない場合にデフォルト値が適用されます。


3. 可変長引数
複数の引数を受け取る必要がある場合に使用します。 *args または **kwargs を使います。

位置引数の可変長 *args
*args を使うことで、任意の数の位置引数を受け取ることができます。
*argsを使うと、関数が任意の数の位置引数を受け取ることができます。
引数はタプルとして関数内で扱われます。


キーワード引数の可変長 **kwargs
**kwargsを使うと、関数が任意の数のキーワード引数(名前付き引数)を受け取ることができます。
キーワード引数は辞書として関数内で扱われます。


**kwargsは辞書形式で渡されるため、引数名と値のペアを簡単に扱うことができます。また、キーワード引数は順番に依存せず、引数名で直接アクセスできます。

*args と kwargs を組み合わせる
*argsと**kwargsを組み合わせて使うことで、位置引数とキーワード引数を同時に柔軟に扱うことができます。
留意点 関数定義では、 *argsを**kwargs より前に記述する必要があります。

戻り値

関数には関数を実行した後に何かを出力する機能があります。これを戻り値と言います。
関数の最後に return文を追加します。関数の一番最後の行にreturn文を追加することがよくあります。
戻り値には、数値や 文字列の他、リストやディクショナリ などのコンテナを指定できます。ただし 引数は複数の利用が許されていますが、 戻り値として返せる値は1つだけと
いうことが重要です。
関数定義の最後に明示的なreturn文が登場しない場合は、return None という記述をしたものとみなされます。
Noneは、Python のでは、何もない状態を意味するために、準備された特殊な値です 。print 関数など 返すべき 戻り値が特にない関数はNoneを返しています。


上記のように、戻り値を変数に代入も出来ます。
sum_result = add_numbers(10, 20)

グローバル変数とその性質について

グローバル変数は、全ての関数から参照してデータを利用できます。正しい 同名のローカル変数 がある場合 ローカル変数 が優先して利用されます。
グローバル変数を濫用してはだめです。
グローバル変数は便利ですけど、開発者の混乱やミスを招きやすいという 副作用があります。自分1人だけの開発では問題になりにくいですが、チームでの開発や
大きな開発には向きません。従って なるべく ローカル変数を使うように心がけましょう。


出力


まとめ

関数はあらかじめ準備されたものだけではなく 自分でも作れる
関数を用いて処理を 部品化すると可読性や 保守性 作業効率が向上する。
関数は 部数人で運用するためにぜひ使った方が良い。
定義された関数は何度でも呼び出せる。

関数は 仮引数を表明して実行時にデータを受け取ることができる。
仮引数にはデフォルト値や 可変長引数を定めることができる。

return文で、関数の実行を終了して呼び出し元に戻り値を返せる。
戻り地には整数や文字列コンテナを一つだけ 指定できる。タプル や dictionari も渡せるがただ一つだけです。
呼び出し元では 代入文によって 変数に 戻り値を受け取ることができる。

関数の外で定義された変数をグローバル変数関数の中で定義された変数をそのローカル変数という。
ローカル変数は 原則として 関数の外から 読み書きできない。
グローバル変数の参照に制限はないが代入にはglobal文が必要である。
グローバル変数の利用は小さなプログラムを作る目的以外では推奨されないと思っていただいてオッケーです。