Python 基礎 第12回 関数応用編

目次

関数の応用的な使い方

前回の記事では Python における関数の基本的な定義方法、呼び出し方と引数、戻り値について紹介しました。今回はもう少し複雑な関数の使い方について紹介していきます。

その他の Python の記事はこちらから。

複数の戻り値

引数を複数渡すことができることは前回の記事で紹介しましたが、戻り値で返すことが出来る値は1つのみです。
にも関わらず下記のような記述が出来ます。

def int_plus_minus(num1, num2):
  plus_answer = num1 + num2
  minus_answer = num1 - num2
  return plus_answer, minus_answer
  
answer = int_plus_minus(15, 10)
print(answer)

今回の関数int_plus_minusは、引数で受け取った2つの値から「足した値」「引いた値」を計算して返却します。return 文に注目してください。2つの値を返却しているように見えます。このコードの実行結果は下記のようになります。

(25, 5)

実は、return文で返されるplus_answer, minus_answerはタプルに格納されて返却されています。2つの要素が格納されたタプルという1つの値を返しているということになります。タプルの使い方について少し深掘ってみましょう。
下記のような使い方ができます。

tuple_data = 10,20,30
data1,data2,data3 = tuple_data
print(data1, data2, data3)

上記のコードを実行すると、

10 20 30

とターミナルに出力されます。まずは1行目から見てみましょう。変数名 = 値1, 値2, 値3… という定義を記述すると、カンマ(, )で区切られた値を1つの要素としてタプルが生成されます。

2行目では、タプルに格納されている要素数と同じ数の変数を = 演算子の左辺に記述することでタプルに格納されている要素を分解して1つ1つをint型の変数として再定義することが出来ます。

したがって、print( )で別々の変数として出力処理が出来ているというコードになっています。

このタプルの使用方法を応用すれば、関数の戻り値を以下のように扱うことも可能です。

def int_plus_minus(num1, num2):
  plus_answer = num1 + num2
  minus_answer = num1 - num2
  return plus_answer, minus_answer
  
plus_answer, minus_answer = int_plus_minus(15, 10)
print(plus_answer, minus_answer)

このように記載することで、タプル型でreturnされている値をそれぞれ変数 plus_answer と変数 minus_answer に格納することが出来ます。

ローカル変数

関数の中で変数などを定義したり、使う場合は注意が必要です。下記のコードを見てみましょう。

def greeting(name):
  print(name,"です。よろしくお願いします。")
  
greeting("太郎")
print(name) # ここでエラーが発生

関数を実行しているため、一度呼び出してしまえば変数nameがその後使えるというと思ってしまいますが、このコードを実行すると「変数nameが未定義」というエラーが出てしまいます。

基本的には、「関数の中と外は別の世界」だという風に認識しておく必要があります。下記のコードも見てみましょう。

def greeting():
  name = "太郎"
  print(name,"です。よろしくお願いします。")

name = "次郎"
greeting()
print(name) 

上記のコードを実行すると、

太郎 です。よろしくお願いします。
次郎

と出力されます。関数を呼び出す前にname = “二郎”と定義した後、関数greeting( )を呼び出すと、処理の途中でname = “太郎”と再定義されているように思えます。しかしながら最後のprint( )で出力されるのは「次郎」となっており、関数での再定義が関数の外の変数nameに反映されていないことが確認されます。

「関数の中と外は別の世界」と記載しましたが、関数内で定義している変数nameと関数の外で定義している変数nameは全く別のものととらえる必要があります。関数内で定義した変数nameのように、関数内で名前が決められ、値の代入が行われる変数を、「ローカル変数」と呼びます。

グローバル変数

さっそくですが、以下のコードを見てみましょう。

def greeting():
    print(name,"です。よろしくお願いします。")

name = "次郎"
greeting()

このコードはエラーが起きず、ターミナルには、

次郎 です。よろしくお願いします。

と出力されます。「関数の中と外は別世界」のはずなのに、関数の外で定義された変数nameが関数内の処理で使用することが出来ています。

この理由は、関数内の処理で変数nameが使用されているにも関わらず関数内で変数nameの定義がされていないためです。この場合、関数の外で定義されている変数nameが強制的に「グローバル変数」として扱われます。

また、「グローバル変数」は明示的に宣言することが出来ます。下記のコードをご覧ください。

def greeting():
    global name
    name = "太郎"
    print(name,"です。よろしくお願いします。")

greeting()
print(name)

global 変数名

と宣言することによって、その変数は関数の中と外どちらでも使用することが出来るようになります。

「グローバル変数」は関数の中でも外でも使用することが出来ます。しかしながら、グローバル変数を多用してしまうと関数の中と外でどの変数を定義したのか管理することが難しくなるため、あまり推奨されていません。

「ローカル変数」と「グローバル変数」によって、関数の中と外での変数名が通用する範囲について紹介しました。このように変数名が通用する範囲のことを「スコープ」と呼んでいます。

関数を扱うにあたっては、この「スコープ」を把握しながらコーディングを進めていくことが重要になっていきます。

(Visited 85 times, 1 visits today)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社NEUGATEは、都内で企業研修や職業訓練を運営している会社です。主に、IT系の教育事業に力を入れています。
この記事は、株式会社NEUGATEの教育事業部が執筆をしています。

企業ホームページ:https://neugate.co.jp/

コメント

コメントする

目次