python

【python】関数とローカル変数とグローバル変数

ここでは、関数を説明します。pythonはオブジェクト指向言語であり命令型プログラミング(手続き型プログラミング) でもあるので関数とメソッドの両方を持っています。関数とメソッドは似ているが別ものです。

・関数・・・単独で呼び出す(print(),int(),map()など、、)

・メソッド・・・変数や値につけて呼び出す(リスト名.append(),リスト名.sort()など、、)

関数の定義方法

関数の定義方法
def function(arg1, ..., argN): 
    # ここに関数の内容を書く 
    return 戻り値  # この行が実行されると関数の実行が終了します 
    y = 1 # この行は実行されない

arg1は引数で0個の場合もあります。関数が返却値(何か計算した値など)を返すときは return 文を利用します。 return 文が実行されると、ただちに関数の実行は終了します。

関数で引数リストを受け取る
def hoge(a, b, *vars):
    print(a, b, vars)
print(1, 2, 3, 4, 5, 5, 6, 8, 9, 0)
#出力:1 2 (3, 4, 5, 5, 6, 8, 9, 0)
関数でキーワード引数を受け取る
def hoge(a, b, **vars):
    print(a, b, vars)


#print(1, 2, c=2, d=3, e=4) #エラー
hoge(1, 2, c=2, d=3, e=4)  # 出力:1 2 {'c': 2, 'd': 3, 'e': 4}

通常は次のようなエラーが出ます。

print(1, 2, c=2, d=3, e=4)
TypeError: ‘c’ is an invalid keyword argument for print()

関数に説明をつける

関数の本体に書く一行目を文字列リテラルにすることができます。これをドキュメンテーションと言い、通常、その関数が何を行うかの説明を書いておきます。

# 引数を1つ取ってそのまま返す関数の定義 
def square(x): 
    """xの2乗を返す関数""" 
    return x**2
任意個数の引数を定義する

引き数を任意の個数だけ欲しい時には、引数の前に*をつける

def add_all(*args):
  result = 0;
    for i in args:
      result += i
  return result
関数にデフォルト値を持たせて定義する

引数にデフォルト値を持たせることができ、定義するときは kwarg=value の形式で引数を追加します。この関数を呼び出す時は、suffixは省略できデフォルト値が使われる
kwarg=value という形式の キーワード引数を使って、関数を呼び出すことができます。

# suffixはデフォルト値を持つ 
def my_print(txt, suffix="!"): 
    print(txt + suffix)
 
my_print('Hi')#出力:Hi! 
my_print('What', '?') #出力:what? 
my_print(txt='Hi') #上の my_print('Hi') と同じ 
my_print(txt='What', suffix='?') # 上の my_print('What', '?') と同じ 
my_print(suffix='!', txt='Hi') #出力:Hi! これはOK 
my_print(suffix='!', 'Hi') # これはNG 以下のようなエラーコード
File "<ipython-input-14-c71b62169349>", line 1
my_print(suffix='!', 'Hi') # これはNG
                   ^
SyntaxError: positional argument follows keyword argument
再帰関数

以下のプログラムは、引数でnを受け取りnの階乗を計算する再帰関数になります

def recure_fancutorial(n):
    if n < 1:
        return 1
    return n * recure_fancutorial(n-1)

再帰関数とはプログラミングの手法の1つで、プログラムの中に自分自身の呼び出しが含まれ ているものを言います。 再帰関数は、ループ関数と同様に、同様な処理を複数回行う場合に利用されますが、より複 雑な問題を簡単な問題に置き換えて処理できると言われています。再帰関数は以下のような 場面で利用されています。 再帰関数を使ってかけることはだいたいループ関数を使って再現できますが、今後絶対に必 要になってくるので慣れておくようにしましょう。

関数の呼び出し方

関数を呼び出して計算結果を使う
def square(x):
    """xの2乗を返す関数""" 
    return x**2 

y = square(2) 
print(y) #出力:4

グローバル変数とグローバル変数

関数の引数は変数と同じです。

グローバル変数
gvar = 'hoge' #グローバル変数
 
def gfunc():
    print(gvar)

gfunc()#出力:hoge
print(gvar) #出力:hoge
ローカル変数
def lfunc():
    lvar = 'hoge' #ローカル変数
    print(lvar)
    #lvarはここまでが生存範囲

lfunc() #出力:hoge
print(lvar) #エラー:lvarが生存範囲外であるためエラーが起きる
関数の中からグローバル変数を書き換える
gvar = 'hoge'
 
def testfunc():
    gvar = '0123'
    print(gvar)
 
print(gvar)  #出力:hoge
testfunc()   #出力:0123
print(gvar)  #出力:hoge
gvar = 'hoge'
 
def testfunc():
    global gvar
    global var
    var = aiu
    gvar = '0123'
    print(gvar)
 
print(gvar) #出力:hoge
testfunc()  #出力:0123
print(gvar) #出力:0123
print(var)  #エラー:NameError: name 'var' is not defined

global宣言を使うことで、書き換えることができ、グローバル変数になり変数が使えるようになります。ただし、グローバルで宣言していない変数をglobal修飾子をつけ、宣言してもグローバルで宣言されないので、そこには注意が必要です。