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