Python 3関数

33836 ワード

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

デフォルトでは、パラメータ値とパラメータ名は、関数宣言で定義された順序で一致します.例:関数を使用して「Hello World!」を出力します.
>>>def hello() :
   print("Hello World!")
 
   
>>> hello()
Hello World!
>>>

より複雑な点の適用、関数にはパラメータ変数が付きます.
#       
def area(width, height):
    return width * height
 
def print_welcome(name):
    print("Welcome", name)
 
print_welcome("Runoob")
w = 4
h = 5
print("width =", w, " height =", h, " area =", area(w, h))

上記の例は、結果を出力します.
Welcome Runoob
width = 4  height = 5  area = 20

##関数呼び出し定義関数:関数に名前を付け、関数に含まれるパラメータとコードブロック構造を指定します.この関数の基本構造が完成したら、別の関数で実行を呼び出すか、Pythonコマンドプロンプトから直接実行することができます.次の例ではprintme()関数が呼び出されます.
#!/usr/bin/python3
 
#     
def printme( str ):
   #           
   print (str)
   return
 
#     
printme("           !")
printme("        ")

上記の例は、結果を出力します.
           !
        

##パラメータはpythonに渡され、タイプはオブジェクトに属し、変数にはタイプがありません.
a=[1,2,3]

a="Runoob"

上記のコードでは、[1,2,3]はListタイプ、「Runoob」はStringタイプであり、変数aはタイプがなく、彼女は1つのオブジェクトの参照(1つのポインタ)であり、Listタイプのオブジェクトを指すか、Stringタイプのオブジェクトを指すかである.変更可能(mutable)オブジェクトと変更不可(immutable)オブジェクトはpythonでstrings,tuples,numbersは変更不可オブジェクトでありlist,dictなどは変更可能なオブジェクトである.可変タイプ:変数付与a=5の後にa=10を付与し、ここでは実際にint値オブジェクト10を新たに生成し、aを指し示すが、5は破棄され、aの値を変更するのではなく、新たにaを生成したことに相当する.可変タイプ:変数付与la=[1,2,3,4]後の再付与la[2]=5はlist laの3番目の要素値を変更し、自身laは動かず、その内部の一部の値が変更されただけである.python関数のパラメータ転送:可変タイプ:整数、文字列、メタグループなどのc++のような値転送.fun(a)のように,伝達されるのはaの値だけであり,aオブジェクト自体に影響を及ぼさない.例えばfun(a)内部でaの値を変更し、別のコピーされたオブジェクトを変更するだけで、a自体に影響を与えません.可変タイプ:リスト、辞書などのc++のような参照伝達.fun(la)のように、laを実際に渡すと、修正後のfun外部のlaも影響を受けpythonのすべてがオブジェクトになります.厳密には値伝達か参照伝達かは言えません.可変オブジェクトと可変オブジェクト##pythonの可変オブジェクトの実例と言えます.
def ChangeInt( a ):
    a = 10
 
b = 2
ChangeInt(b)
print( b ) #     2

インスタンスにはintオブジェクト2があり、その変数がbであることを指す.ChangeInt関数に渡すと、変数bが値伝達でコピーされ、aとbは同じIntオブジェクトを指し、a=10の場合、int値オブジェクト10が新たに生成され、aがそれを指す.可変オブジェクトインスタンス可変オブジェクトが関数でパラメータを変更すると、この関数を呼び出す関数で元のパラメータも変更されます.例:
#       
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()関数を呼び出すには、パラメータを入力する必要があります.そうしないと、構文エラーが発生します.
#!/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()呼び出し時にパラメータ名を使用します.
#!/usr/bin/python3
 
#      
def printme( str ):
   "          "
   print (str)
   return
 
#  printme  
printme( str = "    ")

上記の例は、結果を出力します.
    

次の例では、関数パラメータの使用に指定した順序を使用する必要がないことを示します.
#!/usr/bin/python3
 
#      
def printinfo( name, age ):
   "          "
   print ("  : ", name)
   print ("  : ", age)
   return
 
#  printinfo  
printinfo( age=50, name="runoob" )

上記の例は、結果を出力します.
  :  runoob
  :  50

###デフォルトパラメータ関数を呼び出す場合、パラメータが渡されていない場合は、デフォルトパラメータが使用されます.次の例でageパラメータが入力されていない場合は、デフォルト値を使用します.
#!/usr/bin/python3
 
#      
def printinfo( name, age = 35 ):
   "          "
   print ("  : ", name)
   print ("  : ", age)
   return
 
#  printinfo  
printinfo( age=50, name="runoob" )
print ("------------------------")
printinfo( name="runoob" )

上記の例は、結果を出力します.
  :  runoob
  :  50

###不定長パラメータ当初の宣言よりも多くのパラメータを処理できる関数が必要かもしれません.これらのパラメータは不定長パラメータと呼ばれ、上記2つのパラメータとは異なり、宣言時には名前が付けられません.基本文法は次の通りです.
def functionname([formal_args,] *var_args_tuple ):
   "  _     "
   function_suite
   return [expression]

アスタリスク*を付けたパラメータはメタグループ(tuple)としてインポートされ、名前のない変数パラメータはすべて保存されます.
#!/usr/bin/python3
  
#       
def printinfo( arg1, *vartuple ):
   "         "
   print ("  : ")
   print (arg1)
   print (vartuple)
 
#   printinfo   
printinfo( 70, 60, 50 )

上記の例は、結果を出力します.
  : 
70
(60, 50)

関数呼び出し時にパラメータが指定されていない場合は、空のメタグループです.関数に名前のない変数を渡さないこともできます.次の例を示します.
#!/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

もう1つは、パラメータに2つのアスタリスク**を付ける基本的な構文です.
def functionname([formal_args,] **var_args_dict ):
   "  _     "
   function_suite
   return [expression]

アスタリスク**を2つ追加したパラメータは、辞書としてインポートされます.
#!/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 "", 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

次の例を示します.
#!/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文の使用方法を示します.
#!/usr/bin/python3
 
#       
def sum( arg1, arg2 ):
   #   2     ."
   total = arg1 + arg2
   print ("    : ", total)
   return total
 
#   sum  
total = sum( 10, 20 )
print ("    : ", total)

上記の例は、結果を出力します.
    :  30
    :  30

##強制位置パラメータPython 3.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