Python : 関数
参考書籍 : Python実践入門, Python3スキルアップ教科書
・関数の基本の構文
def 関数名(引数1, 引数2, ...): 処理 return 戻り値
関数の命名規則の基本は、小文字とアンダースコア
・引数のデフォルト値
関数の引数には、デフォルト値をもたせられる
def print_page(content="no content"): print(content) print_page() # デフォルト値が利用される
デフォルト値のある仮引数とない引数を使う関数は、デフォルト値のある仮引数を後ろに置く必要がある
def check_num(number, max_number=10): return number < max_number
・関数オブジェクト
Pythonでは関数もオブジェクトである。
print(type(print_page)) # <class 'function'> f = print_page # オブジェクトなので変数に代入できる、関数を引数や戻り値にもできる f()
・戻り値
関数の戻り値は、return文で指定できる。
return文のない関数は、戻り値がNoneになる
r = print_page() # 戻り値がない関数の戻り値はNone print(r)
・mutableなオブジェクトの受け渡し
mutableな引数を関数内で変更すると、そのオブジェクトが変更される
def append_data(items, data): items.append(data) items = ["aaa", "bbb"] append_data(items, "ccc") print(items) # ['aaa', 'bbb', 'ccc']
・位置引数とキーワード引数
位置引数 : 仮引数名を指定しない実引数の受け渡し。呼び出し側で指定した順番に、関数の引数に渡される
キーワード引数 : 仮引数名を指定した実引数の受け渡し
def print_args(arg1, arg2): print(arg1) print(arg2) print_args("Hello", "World") # 位置引数 print_args(arg2="World", arg1="Hello") # キーワード引数
位置引数とキーワード引数は組み合わせて使用できる。
その時、位置引数を先に書き、その後ろにキーワード引数を書く
print("Hello", end=" ") print("World!")
・可変長引数
可変長の位置引数を受け取るには、引数の前に*をつける
def print_args(*args): for arg in args: # argsは位置引数のタプル print(arg)
可変長のキーワード引数は、引数の前に**をつける
def print_keyword_args(**kwargs): for k, v in kwargs.items(): # argsは位置引数のタプル print(str(k) + " : " + str(v))
・キーワードのみ引数と位置のみ引数
呼び出し時に仮引数名を強制する、キーワードのみ引数を利用できる。
print()の引数endなどはキーワードのみ引数
強制したい引数の前に*, をつける
def keyword_only(*, arg): print(arg) # keyword_only("aaa") # error keyword_only(arg="aaa")
呼び出し時に仮引数名を指定するとエラーになる、位置のみ引数も利用できる
abs()の引数nは位置のみ引数
位置のみにしたい引数の前に/, をつける。
def positional_only(/, arg): print(arg) positional_only("aaa") # positional_only(arg="aaa") # error
・コンテナのアンパック
コンテナに*をつけて引数に渡すことで、コンテナをアンパックして引数に渡すことができる
items = [1, 2, "aaa"] print_args(*items)
・変数のスコープ
関数内部で宣言された変数は、ローカル変数となり、外部からアクセスできない。
グローバル変数と同名の変数を関数内で使用すると、同名のローカル変数が作成される。
g = 1 def scope_test(): g = 10 print(g) scope_test() # 10 print(g) # 1
関数内からグローバル変数にアクセスするには、global宣言を行う
g = 1 def scope_test(): global g g = 10 print(g) scope_test() # 10 print(g) # 10