Python学習ノート8―Python関数


関数は、単一の、または関連する機能を実現するためのコードセグメントを再利用するために組織されています.
関数は、アプリケーションのモジュール性とコードの再利用率を向上させることができます.Pythonはprint()のような多くの組み込み関数を提供しています.しかし、ユーザー定義関数と呼ばれる関数を自分で作成することもできます.
一、定義関数
関数コードブロックはdefキーワードで始まり、関数識別子名とカッコ()が続く.
任意の入力パラメータと引数は、カッコの中央に配置する必要があります.カッコ間でパラメータを定義できます.
関数の最初の行の文は、関数の説明を格納するためにドキュメント文字列を選択的に使用できます.
関数の内容はコロンで始まり、インデントされます.
Return[expression]は関数を終了し、呼び出し元に選択的に値を返します.式を持たないreturnはNoneを返すことに相当します.
構文:
def functionname( parameters ):
   "  _     "
   function_suite
   return [expression]

デフォルトでは、パラメータ値とパラメータ名は、関数宣言で定義された順序で一致します.
二、関数呼び出し
関数を定義するには、関数に名前を1つだけ与え、関数に含まれるパラメータとコードブロック構造を指定します.
この関数の基本構造が完成したら、別の関数で実行を呼び出すか、Pythonプロンプトから直接実行することができます.
def xaddy(x,y):     #    
    return x+y
print xaddy(1,2)    #    

実行結果は
3

三、パラメータ伝達
すべてのパラメータ(引数)はPythonで参照で渡されます.関数でパラメータを変更すると、この関数を呼び出す関数で元のパラメータも変更されます.例:
def a(x):
    x.append('adfa')
    return x
y=list('abcdef')
print y
print a(y)
print y

実行結果は
['a', 'b', 'c', 'd', 'e', 'f']
['a', 'b', 'c', 'd', 'e', 'f', 'adfa']
['a', 'b', 'c', 'd', 'e', 'f', 'adfa']

ここで、関数中のパラメータxは、変数yが指すアドレスを受信し、このメモリアドレスが格納する値は(['a','b','c','d','e','f'])関数体内で、関数実行x.append('adfa')は、実際にリストyの末尾に要素を追加し、次の例を見る.
def a(x):
    x=list('1234')
    return x
y=list('abcdef')
print y
print a(y)
print y

実行結果は
['a', 'b', 'c', 'd', 'e', 'f']
['1', '2', '3', '4']
['a', 'b', 'c', 'd', 'e', 'f']

上記の例では、関数aのパラメータは、実パラメータyから渡されたメモリアドレスを受信し、関数体ではxに値を再付与するので、xの値は変更され、実パラメータyの値は変更されない.
四、パラメータ
次は、関数を呼び出すときに使用できる正式なパラメータのタイプです.
必須パラメータ
名前付きパラメータ
デフォルトのパラメータ
ふていちょうパラメータ
    1.必須パラメータ
必須パラメータは、関数に正しい順序で入力する必要があります.呼び出し時の数は、宣言時と同じでなければなりません.
a()関数を呼び出すには、パラメータを入力する必要があります.そうしないと、構文エラーが発生します.
def a(x):
    print x
y=list('abcdef')
a()

実行結果は
Traceback (most recent call last):
  File "E:\Note\Python\test.py", line 4, in <module>
    a()
TypeError: a() takes exactly 1 argument (0 given)

    2.名前付きパラメータ
名前付きパラメータと関数呼び出しは密接に関係しており、呼び出し元はパラメータの名前で入力されたパラメータ値を決定します.Python解釈器はパラメータ名でパラメータ値を一致させることができるため、伝達されないパラメータや乱順パラメータをスキップすることができます.
def a(name,age):
    print 'name:'+name+',age:'+age
a(age='19',name='zhangsan')

実行結果は
name:zhangsan,age:19

    3.デフォルトのパラメータ
関数を呼び出すと、デフォルトのパラメータの値が入力されない場合は、デフォルトとみなされます.
def a(name,age='20'):
    print 'name:'+name+',age:'+age
a('zhangsan')

実行結果は
name:zhangsan,age:20

関数を定義する場合、デフォルトパラメータを使用する場合は、デフォルトパラメータを最後に、必須パラメータを前に配置します.そうしないと、関数を呼び出すときの実パラメータが必須パラメータに提供されるか、デフォルトパラメータに提供されるかは判断できません.
    4.ふていちょうパラメータ
当初宣言したときよりも多くのパラメータを処理する関数が必要かもしれません.これらのパラメータは不定長パラメータと呼ばれ、上記2つのパラメータとは異なり、宣言時には名前が付けられません.基本構文は次のとおりです.
def functionname([formal_args,] *var_args_tuple ):
   "  _     "
   function_suite
   return [expression]
def a(x,*y):
    print x
    print y
a(10)
print ''
a(10,20)
print ''
a(10,20,30)

実行結果は
10
()

10
(20,)

10
(20, 30)

不定長パラメータのタイプはメタグループであり,関数体では通常のメタグループのようにこのパラメータを使用できることがわかる.
アスタリスク(*)を付けた変数名には、名前の付いていないすべての変数パラメータが格納されます.マルチパスパラメータを選択しなくてもいいです.
不定長パラメータを定義する場合、メタグループのタイプであるメタパラメータの前に「*」を付けます.「*」を2つ追加すると、このパラメータのタイプは辞書です.
def a(x,**y):
    print x
    print y
a(10)
print ''
a(10,a=20)
print ''
a(10,a=20,b=30)

実行結果は
10
{}

10
{'a': 20}

10
{'a': 20, 'b': 30}

五、匿名関数
Lambdaキーワードで小型匿名関数を作成できます.この関数はdefで関数を宣言する標準手順を省略したことに由来する.
Lambda関数は、任意の数のパラメータを受信できますが、1つの式の値しか返されません.コマンドまたは複数の式を含めることはできません.
匿名関数はprintを直接呼び出すことはできません.lambdaには式が必要です.
Lambda関数は独自の名前空間を持ち、独自のパラメータリスト以外またはグローバル名前空間のパラメータにアクセスできません.
Lambda関数は1行しか書けないように見えますが、CまたはC++のインライン関数とは等しくありません.後者の目的は、小さな関数を呼び出すときにスタックメモリを消費せずに実行効率を向上させることです.
構文:lambda関数の構文には、次のように1つの文しか含まれません.
lambda [arg1 [,arg2,.....argn]]:expression
sum=lambda a,b:a+b
print sum(10,20)
print sum(100,200)

実行結果は
30
300

六、return文
return文[式]は関数を終了し、呼び出し元に選択的に式を返します.パラメータ値を持たないreturn文はNoneを返します.