Python関数の使い方

7071 ワード

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

デフォルトでは、パラメータ値とパラメータ名は、関数宣言で定義された順序で一致します.例は、文字列を入力パラメータとして標準表示装置に印刷する簡単なPython関数です.
def printme( str ):
   "                "
   print str
   return

関数呼び出し定義関数は、関数に名前を1つだけ与え、関数に含まれるパラメータとコードブロック構造を指定します.この関数の基本構造が完成したら、別の関数で実行を呼び出すか、Pythonプロンプトから直接実行することができます.次の例ではprintme()関数が呼び出されます.
#!/usr/bin/python
# -*- coding: UTF-8 -*-

#     
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可変オブジェクトインスタンスの転送
#!/usr/bin/python
# -*- coding: UTF-8 -*-

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がそれを指す.可変オブジェクトインスタンスの転送
#!/usr/bin/python
# -*- coding: UTF-8 -*-

#       
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/python
# -*- coding: UTF-8 -*-

#      
def printme( str ):
   "          "
   print str
   return

#  printme  
printme()

上記の例は、結果を出力します.
Traceback (most recent call last):
  File "test.py", line 11, in 
    printme()
TypeError: printme() takes exactly 1 argument (0 given)

キーワードパラメータキーワードパラメータは関数呼び出しと密接に関係しており、関数呼び出しはキーワードパラメータを使用して入力されたパラメータ値を決定します.キーワードパラメータを使用すると、Python解釈器がパラメータ名でパラメータ値を一致させることができるため、関数呼び出し時のパラメータの順序が宣言時と一致しないことができます.次の例では、関数printme()呼び出し時にパラメータ名を使用します.
#!/usr/bin/python
# -*- coding: UTF-8 -*-

#      
def printme( str ):
   "          "
   print str
   return

#  printme  
printme( str = "My string")

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

次の例では、キーワードパラメータの順序をより明確に示すことはできません.
#!/usr/bin/python
# -*- coding: UTF-8 -*-

#      
def printinfo( name, age ):
   "          "
   print "Name: ", name
   print "Age ", age
   return

#  printinfo  
printinfo( age=50, name="miki" )

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

デフォルトパラメータが関数を呼び出すと、デフォルトパラメータの値が入力されない場合は、デフォルト値とみなされます.次の例では、ageが入力されていない場合、デフォルトのageが印刷されます.
#!/usr/bin/python
# -*- coding: UTF-8 -*-

#      
def printinfo( name, age = 35 ):
   "          "
   print "Name: ", name
   print "Age ", age
   return

#  printinfo  
printinfo( age=50, name="miki" )
printinfo( name="miki" )

上記の例は、結果を出力します.
Name:  miki
Age  50
Name:  miki
Age  35

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

アスタリスク(*)を付けた変数名には、名前の付いていないすべての変数パラメータが格納されます.不定長パラメータの例は次のとおりです.
#!/usr/bin/python
# -*- coding: UTF-8 -*-

#       
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

匿名関数pythonはlambdaを使用して匿名関数を作成します.Lambdaはただの式で、関数体はdefよりずっと簡単です.Lambdaの本体はコードブロックではなく式です.限られた論理をlambda式にカプセル化できるだけです.Lambda関数は独自のネーミングスペースを持ち、独自のパラメータリスト以外またはグローバルネーミングスペース内のパラメータにアクセスできません.Lambda関数は1行しか書けないように見えますが、CまたはC++のインライン関数とは等しくありません.後者の目的は、小さな関数を呼び出すときにスタックメモリを消費せずに実行効率を向上させることです.構文lambda関数の構文には、次のように1つの文しか含まれません.
lambda [arg1 [,arg2,.....argn]]:expression

次の例を示します.
#!/usr/bin/python
# -*- coding: UTF-8 -*-

#       
sum = lambda arg1, arg2: arg1 + arg2

#   sum  
print "       : ", sum( 10, 20 )
print "       : ", sum( 20, 20 )

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

return文return文[式]は関数を終了し、呼び出し元に式を選択的に返します.パラメータ値を持たないreturn文はNoneを返します.前の例では数値を返す方法を示していませんが、次の例ではどうすればいいかを示します.
#!/usr/bin/python
# -*- coding: UTF-8 -*-

#       
def sum( arg1, arg2 ):
   #   2     ."
   total = arg1 + arg2
   print "    : ", total
   return total

#   sum  
total = sum( 10, 20 )

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

変数役割ドメイン1つのプログラムのすべての変数は、どの場所でもアクセスできるわけではありません.アクセス権は、この変数がどこで付与されるかを決定します.変数の役割ドメインは、どのプログラムでどの特定の変数名にアクセスできるかを決定します.2つの最も基本的な変数役割ドメインは、グローバル変数ローカル変数グローバル変数とローカル変数定義関数内部の変数がローカル役割ドメインを持ち、関数外のグローバル役割ドメインを持つことを定義します.ローカル変数は宣言された関数の内部にのみアクセスでき、グローバル変数はプログラム全体にアクセスできます.関数を呼び出すと、関数内で宣言されたすべての変数名が役割ドメインに追加されます.次の例を示します.
#!/usr/bin/python
# -*- coding: UTF-8 -*-

total = 0 #         
#       
def sum( arg1, arg2 ):
   #  2     ."
   total = arg1 + arg2 # total        .
   print "         : ", total
   return total

#  sum  
sum( 10, 20 )
print "         : ", total

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