【Python入門講座】5.関数とスコープ

目次

関数とは

これまでの講座で度々扱っている、print()やinput()といった、英単語()のようなものを関数と呼びます。

中学数学で習った、y = ax + b みたいな関数とはだいぶ違う物のように見えますね。

そうですね、ですが大まかにやっていることは同じです。数学の関数はxやyといったある値が変動することに対応し、変数の持つ値も変動します。プログラミングにおける関数も、引数と呼ばれる値が変動することで、返り値(戻り値)と呼ばれる結果が変動します。print関数も、()に入れる値や文字によって出力が変わりますよね?

確かに!

また、print()やinput()のように、元々プログラミング言語に組み込まれている関数を、組み込み関数(標準関数)と呼び、私たちが独自に定義する関数を独自関数と呼びます。

関数は引数を受け取り、定められた独自の処理を行い、その結果を戻り値(返り値)として返す命令のこと。

関数は、
・組み込み関数(標準関数) : プログラミング言語にあらかじめ組み込まれた関数
・独自関数 : 私たちが独自に定義する関数
の二種類に分けられる。


一度宣言した関数は繰り返し使用することができる為、複雑なコードを簡潔に可読性を高く(読みやすく)保つことができる。

独自関数

それでは早速、独自関数の定義方法について学びましょう。
定義方法は以下の通りです。

def 関数名(引数):
    処理
    return 戻り値

引数、戻り値は一つの関数内でそれぞれ複数個使用することができます。
戻り値を複数用いる場合、配列など、本講座で扱っていない内容が含まれるので割愛します。
気になった方は調べてみてください。

また、先ほどは関数の役割をイメージしやすい様に説明しましたが、引数、戻り値は必須ではありません。

引数、戻り値を使うこともできるってことですね!

・引数、戻り値は必ず必要ではない

グローバル宣言

変数はグローバル変数とローカル変数があります。
それぞれの説明は以下の通りです。

グローバル変数関数の外側で宣言された変数
関数内で参照することはできるが、関数内で値を代入することはできない。
ローカル変数関数の内側で宣言された変数
関数内で値を参照、代入することはできるが、関数の外では参照も代入もできない。

以下のサンプルコードの様にグローバル変数は、関数内で値を代入することができません。

global_num = 1 

def add_num(num):
    global_num += num
    print(global_num)

add_num(3)

この様に、グローバル変数に関数内で代入を行いたい場合、global宣言を用います。

global_num = 1 

def add_num(num):
    global global_num
    global_num += num
    print(global_num)

add_num(3)

・グローバル宣言
関数内で
global グローバル変数
の様に宣言することで、関数内でグローバル変数に値を代入できるようになる。

演習問題

前回の演習問題を関数を用いて改良してみましょう。
以下の部分を改良してください。

・「グー」「チョキ」「パー」以外が入力された場合、「不正な手が入力されました」と出力する関数を用いて行う
・「グー」「チョキ」「パー」のいずれかが入力された場合の判定、結果の出力を関数を用いて行う

他の条件等は前回と同様です。

解答例
def is_hand_valid(hand):
  if(hand == 'グー' or hand == 'チョキ' or hand == 'パー'):
    return False
  else:
    return True

def zyanken():
  my_hand = input('最初はグー、じゃんけん、ぽん!')
  if(is_hand_valid(my_hand)):
    print('不正な手が入力されました')
    return
  global opp_hand
  print('相手の手は',opp_hand,'です')
  if(my_hand == opp_hand):
    opp_hand = my_hand
    print('あいこです')
  elif((my_hand == 'グー' and opp_hand == 'チョキ') or (my_hand == 'チョキ' and opp_hand == 'パー') or (my_hand == 'パー' and opp_hand == 'グー')):
    opp_hand = my_hand
    print('勝ちです')
  else:
    opp_hand = my_hand
    print('負けです')

zyanken()

※あくまでも解答例であり、この記述法のみが正解ではありません。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次