関数は、単一または関連する機能を実装するために使用される、編成された再利用可能なコードセグメントです。

関数は、プログラムのモジュール性とコードの再利用率を向上させることができます。 Pythonがprint()などの多くの組み込み関数を提供することはすでにご存知でしょう。 ただし、ユーザーが自ら関数を作成することもできます。カスタム関数と呼ばれます。

関数を定義する

必要な機能を備える関数を定義できます。ルールは次のとおりです。

  • 関数コードブロックは、defキーワードで始まり、その後に関数識別子名と括弧()が続きます。
  • 入力した引数と独立変数は括弧の間に配置する必要があり、括弧を使用して引数を定義できます。
  • 関数の最初の行では、docstringを選択して使用します。それは関数の説明を格納するために使用されます。
  • 関数の内容はコロンで始まり、インデントされます。
  • return [式]で関数を終了し、オプションで呼び出し元に値を返します。式なしで返すことは、Noneを返すことと同じです。

構文

Pythonはdefキーワードを使用して関数を定義します。一般的な形式は、次のとおりです。

def関数名(引数リスト):
     関数本体

デフォルトでは、引数値と引数名は、関数宣言で定義された順序で合わせています。

実例

関数を使用して”Hello World!”を出力してみましょう。

#!/usr/bin/python3
def hello() :
    print("Hello World!")
hello()

より複雑な応用:関数内に引数変数を付く

実例(Python 3.0以降)

2つの数値を比較して、大きい方の数値を返します。

def max(a, b): 
    if a > b: 
        return a 
    else: 
        return b 

a = 4 
b = 5 
print(max(a, b))

上記の実例の出力結果は以下になります。

5

実例(Python 3.0以降)

#!/usr/bin/python3 

# 面積関数を計算する
def area(width, height): 
    return width * height 

def print_welcome(name): 
    print("Welcome", name) 

print_welcome("Visitor") 
w = 4 
h = 5 
print("width =", w, " height =", h, " area =", area(w, h))

上記の実例の出力結果は以下になります。

Welcome Visitor
width = 4  height = 5  area = 20

関数呼び出し

関数の定義:関数に名前を付け、関数に含まれる引数とコードブロック構造を指定します。

関数の基本構造が完成したら、別の関数で呼び出しするか、またはPythonコマンドプロンプトから直接実行できます。

次の例では、printme()関数を呼び出します。

実例(Python 3.0以降)

#!/usr/bin/python3
#関数を定義する
def printme( str ): 
    #導入した文字列を印刷する。
    print (str) 
    return 

# 関数を呼び出す
printme("ユーザーカスタム関数を呼び出す!")
printme("同じ関数をもう一度呼び出す")

上記の実例の出力結果は以下になります。

ユーザーカスタム関数を呼び出す
同じ関数をもう一度呼び出す

パラメータの受け渡し

Pythonでは、タイプはオブジェクトに属し、変数にはタイプがありません。

a=[1,2,3]

a="Florian"

上記のコードでは、[1,2,3]はList型、「Florian」はString型、変数aにはタイプがありません。これはオブジェクト(ポインタ)への単なる参照です。Listタイプのオブジェクトに指すことができますし、またはStringタイプのオブジェクトを指すこともできます。

変更できる(mutable)および変更できない(immutable)オブジェクト

Pythonでは、文字列、タプル、数値は変更できないオブジェクトですが、リスト、辞書などは変更できるオブジェクトです。

  • 変更できないタイプ:変数にa = 5を割り当てる、次にa = 10を割り当てます。これは実際に新しくint値オブジェクト10を生成し、それを指します。5は破棄され、aの値は変更されるのではなく、新しいaを生成します。
  • 変更できるタイプ:変数にla = [1,2,3,4]に割り当て、そしてla [2] = 5に割り当てます。それはリストlaの3番目の要素の値を変更することです。la自体は変更されず、その中の一部の値が変更されただけです。

Pythonの関数引数の受け渡し

  • 変更できないタイプ:整数、文字列、タプルなどのC ++値のような転送です。 たとえば、fun(a)の場合、aの値のみが渡され、オブジェクト自体は影響を受けません。 fun(a)内でaの値が変更されると、新しいaのオブジェクトが生成されます。
  • 変更できるタイプ:リストや辞書など、C ++の参照渡しに類似します。 たとえば、fun(la)は、実際にはla自体を渡し、変更後のfun(la)の外のも影響を受けます。
  • Pythonのすべてがオブジェクトです。厳密に言えば、値による受け渡しや参照による受け渡しとは言えません。オブ変更できないジェクトの受け渡しと変更できるオブジェクトの受け渡しと言うべきです。

Pythonは変更できないオブジェクトの受け渡しの実例

id()関数を使用して、メモリアドレスの変更を表示します。

実例(Python 3.0以降)

def change(a): 
    print(id(a)) 
    a=10 
    print(id(a)) 

a=1 
print(id(a)) 
change(a)

上記の実例の出力結果は以下になります。

4379369136
4379369136
4379369424

関数が呼び出される前後で、仮引数と実際の引数が同じオブジェクトを指していることがわかります(オブジェクトIDは同じです)。関数内の仮引数を変更した後、仮引数は異なるIDを指します。

変更できるオブジェクトの受け渡しの実例

変更できるオブジェクトは関数内の引数を変更すると、この関数内で元の引数も変更されます。

実例(Python 3.0以降)

#!/usr/bin/python3 
# 書き込み可能な関数の説明 
def changeme( mylist ): 
    "導入リストの変更" 
    mylist.append([1,2,3,4]) 
    print ("関数内の値: ", mylist) 
    return 

# changeme関数を呼び出す
mylist = [10,20,30] 
changeme( mylist ) 
print ("関数外の値: ", mylist)

関数に渡されたオブジェクトと、最後に新しいコンテンツが追加されたオブジェクトは、同じ参照を使用します。 したがって、出力結果は次のようになります。

関数内の値:  [10, 20, 30, [1, 2, 3, 4]]
関数外の値:  [10, 20, 30, [1, 2, 3, 4]]

引数

以下は、関数を呼び出すときに使用できる引数のタイプです。

  • 必要な引数
  • キーワード引数
  • デフォルト引数
  • 可変長引数

必要な引数

必要な引数は、正しい順序で関数に渡される必要があります。 呼び出されたときの数量は、宣言されたときと同じでなければなりません。

printme()関数を呼び出すには、引数を渡す必要があります。そうしないと、構文エラーが発生します。

実例(Python 3.0以降)

#!/usr/bin/python3 

#書き込み可能な関数の説明 
def printme( str ): 
    "導入する文字列を印刷する" 
    print (str) 
    return 

# printme関数を呼び出し、引数を追加されるとエラーが報告される
printme()

上記の実例の出力結果は以下になります。

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    printme()
TypeError: printme() missing 1 required positional argument: 'str'

キーワード引数

キーワード引数は関数呼び出しと密接に関連しています。関数呼び出しはキーワード引数を使用して、渡された引数の値を決定します。

キーワード引数を使用して、Pythonインタープリターが引数の値を引数名と照合できるため、関数呼び出し際の引数の順序が宣言時に一致しなくても結構です。

次の例では、関数printme()を呼び出すときに引数名を使用しています。

実例(Python 3.0以降)

#!/usr/bin/python3 
#書き込み可能な関数の説明 
def printme( str ): 
    "導入する文字列を印刷する" 
    print (str) 
    return 

#printme関数を呼び出す 
printme( str = "初心者チュートリアル")

上記の実例の出力結果は以下になります。

初心者チュートリアル

次の実例では、関数の引数の使用に指定された順序が必要ないことを示しています。

実例(Python 3.0以降)

#!/usr/bin/python3 

#書き込み可能な関数の説明
def printinfo( name, age ): 
    "導入する文字列を印刷する" 
    print ("名前: ", name) 
    print ("年齢: ", age) 
    return 
# printinfo関数を呼び出す 
printinfo( age=50, name="Florian" )

上記の実例の出力結果は以下になります。

名前:  Florian
年齢:  50

デフォルト引数

関数を呼び出すときに引数が渡されない場合は、デフォルトの引数が使用されます。 次の例ではage引数が渡されない場合、デフォルト値が使用されます。

実例(Python 3.0以降)

#!/usr/bin/python3 

#書き込み可能な関数の説明 
def printinfo( name, age = 35 ): 
"導入する文字列を印刷する" 
print ("名前: ", name) 
print ("年齢: ", age) 
return 

# printinfo関数を呼び出す 
printinfo( age=50, name="Florian" ) 
print ("------------------------") 
printinfo( name="Florian" )

上記の実例の出力結果は以下になります。

名前:  Florian
年齢:  50
------------------------
名前:  Florian
年齢:  35

可変長引数

最初に宣言されたよりも多くの引数を処理できる関数が必要になる場合があります。 これらの引数は不定長引数と呼ばれ、上記の2種類の引数とは異なり、宣言時に名前が付けられません。 基本的な構文は次のとおりです。

def functionname([formal_args,] *var_args_tuple ):
   "関数_テキスト文字列"
   function_suite
   return [expression]

アスタリスク*が付いた引数は、タプルの形式で導入され、名前のないすべての変数引数が保管されます。

実例(Python 3.0以降)

#!/usr/bin/python3 

# 書き込み可能な関数の説明 
def printinfo( arg1, *vartuple ): 
    "導入する文字列を印刷する" 
    print ("出力: ") 
    print (arg1) 
    print (vartuple) 

# printinfo関数を呼び出す
printinfo( 70, 60, 50 )

上記の実例の出力結果は以下になります。

出力
70
(60, 50)

関数の呼び出し時に引数が指定されていない場合、それは空のタプルです。 次の例のように名前のない変数を関数に渡さないようにします。

実例(Python 3.0以降)

#!/usr/bin/python3 
# 書き込み可能な関数の説明 
def printinfo( arg1, *vartuple ): 
    "導入する文字列を印刷する" 
    print ("出力: ") 
    print (arg1) 
    for var in vartuple: 
        print (var) 
    return 

# printinfo関数を呼び出す 
printinfo( 10 ) 
printinfo( 70, 60, 50 )

上記の実例の出力結果は以下になります。

出力:
10
出力:
70
60
50

2つのアスタリスク**が付いた引数もあります。基本的な構文は次のとおりです。

def functionname([formal_args,] **var_args_dict ):
   "関数_テキスト文字列"
   function_suite
   return [expression]

2つのアスタリスク**が付いた引数は、辞書として導入されます。

実例(Python 3.0以降)

#!/usr/bin/python3 

# 書き込み可能な関数の説明
def printinfo( arg1, **vardict ): 
    "導入する文字列を印刷する" 
    print ("出力: ") 
    print (arg1) 
    print (vardict) 

# printinfo関数を呼び出す 
printinfo(1, a=2,b=3)

上記の実例の出力結果は以下になります。

出力:
1
{'a': 2, 'b': 3}

以下のように、関数を宣言するとき、引数のアスタリスク*は単独で表示できます。

def f(a,b,*,c):
    return a+b+c

アスタリスク*の後の引数が単独で表示される場合は、キーワードとともに導入する必要があります。

>>> def f(a,b,*,c):
...     return a+b+c
... 
>>> f(1,2,3)   # エラー
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() takes 2 positional arguments but 3 were given
>>> f(1,2,c=3) # エラー
6
>>>

無名関数

Pythonはlambdaを使用して無名関数を作成します。

いわゆる無名とは、関数がdefステートメントなどの標準形式で定義されなくなったことを意味します。

  • lambdaは単なる式であり、関数本体はdefよりはるかに簡単です。
  • lambdaの本体は式であり、コードブロックではありません。lambda式には限られたプログラムが書き込みます。
  • lambda関数には独自の名前空間があり、引数リストの外部または全域の名前空間内の引数にアクセスできません。
  • lambda関数は1行しか書き込むことができませんが、CまたはC ++インライン関数と同等ではありません。後者の目的は、小さな関数を呼び出すときにスタックメモリを占有しないため、操作効率が向上することです。

構文

lambda 関数の構文には、次のように1つのステートメントしか含まれていません。

lambda [arg1 [,arg2,…..argn]]:expression

実例は以下になります。

実例(Python 3.0以降)

#!/usr/bin/python3 
# 書き込み可能な関数の説明 
sum = lambda arg1, arg2: arg1 + arg2 

# sum関数を呼び出す 
print ("加算した後の値 : ", sum( 10, 20 )) 
print ("加算した後の値 : ", sum( 20, 20 ))

上記の実例の出力結果は以下になります。

加算した後の値:  30
加算した後の値:  40

returnステートメント

return [式]ステートメントは、関数を終了し、オプションで式を呼び出し元に返すために使用されます。引数値のないreturnステートメントはNoneを返します。 前の例では、値を返す方法を示していません。次の例は、returnステートメントの使用方法を示しています。

実例(Python 3.0以降)

#!/usr/bin/python3 
#書き込み可能な関数の説明
def sum( arg1, arg2 ): 
    # 2つの引数の合計を返す." 
    total = arg1 + arg2 
    print ("関数内 : ", total) 
    return total 

# 合計関数を呼び出す
total = sum( 10, 20 ) 
print ("関数外 : ", total)

上記の実例の出力結果は以下になります。

関数内:  30
関数外:  30

位置引数

Python3.8は、関数仮引数/を追加して、関数仮引数が指定された位置引数を使用する必要があり、キーワード引数形式を使用できないことを示しています。

次の例では、仮引数aとbは指定された位置引数を使用する必要があり、cまたはdは位置仮引数またはキーワード仮引数であり、eまたはfはキーワード引数である必要があります。def f(a, b, /, c, d, *, e, f):

print(a, b, c, d, e, f)

以下の使用方法が正しいです。

f(10, 20, 30, d=40, e=50, f=60)

次の使用方法ではエラーが発生します。

f(10, b=20, c=30, d=40, e=50, f=60) # bはキーワード引数の形式を使用できない
f(10, 20, 30, 40, 50, f=60) # eはキーワード引数の形式を使用する必要がある
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です