1-14 Python関数

組織機能は、単一のを実装するために使用良い、再利用可能な、コードセグメント、または関連する機能であります

アプリケーションの機能モジュールが向上し、コードの再利用することができます。あなたはすでにPythonが、そのような()印刷など、多くの組み込み関数を、提供することを知っています。しかし、あなたはまた、ユーザー定義関数と呼ばれ、独自の関数を作成することができます。


関数の定義

あなたは自分自身の機能は、以下の簡単なルールで関数を定義することもできます。

  • 機能ブロックで  DEF  名と機能識別子括弧が続く、キーワードを開始  ()
  • 括弧内のすべての受信パラメータ及び引数はパラメータを定義するために使用することができる括弧の間、中央に配置されなければなりません。
  • 最初の文関数は、選択的に説明文字列を使用することができます - 機能命令を格納するため。
  • 機能の内容コロン、およびインデントを開始します。
  • 戻る[式]  エンド機能は、選択的に呼び出し元に値を返します。Noneを返すための発現同等ずに返します

文法

Pythonのカスタム関数はdefキーワード、次の一般的なフォーマットを使用しています:

DEF関数名(パラメータリスト):
    関数本体

デフォルトでは、パラメータ名とパラメータ値が一緒に関数宣言を一致させるために定義されています。

出力に関数を使用してみましょう「のHello World!」を:

>>>def hello() :
   print("Hello World!")
 
   
>>> hello()
Hello World!
>>>

より複雑なポイントのアプリケーション、機能パラメータ変数を取ります:

#!/usr/bin/python3
 
# 计算面积函数
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コマンドプロンプトから直接実行することができます呼び出すことができます。

呼ばれる以下の例  プリントミー()  関数:

#!/usr/bin/python3
 
# 定义函数
def printme( str ):
   # 打印任何传入的字符串
   print (str)
   return
 
# 调用函数
printme("我要调用用户自定义函数!")
printme("再次调用同一函数")

上記の出力の例:

我要调用用户自定义函数!
再次调用同一函数

パラメータの受け渡し

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

a=[1,2,3]

a="Runoob"

上記、[1,2,3]  リスト、入力「Runoob」は  型Stringであり、変数の型ではない、彼女は単にオブジェクト参照(ポインタ)であり、オブジェクトのタイプは、ポイントのリストであってもよいとすることができますString型のオブジェクトへのポインタです。

あなたは(変更可能)を変更することができますし、(不変)のオブジェクトを変更することはできません

Pythonでは、文字列、タプル、および数字は変更されず、リスト、辞書ので、それはオブジェクトを修正することができます。

  • 不変タイプ:変数の割り当て  、A = 5は、  次に割り当て  A = 10 intは実際に新しい値オブジェクト10が生成され、ポイントは、新たに等価である代わりの値を変更する、5を廃棄することせ。

  • 変数型:変数の割り当て  ラ= [1,2,3,4]  次に、割り当てられた  ラ[2] = 5つの  第三の要素の値の変化は、その内部の値の一部のみを移動しなかった自体にリストラ、ラを吸引これは修正されます。

Pythonのパラメータ転送機能:

  • :不変型、整数、文字列、タプルとして類似値渡さC ++、。値ファン(A)は、被験者自身の唯一の伝達は影響を及ぼしません。そのような修飾の楽しみの(A)内部値が、他にコピーされたオブジェクトを変更するには、それ自体に影響を与えません。

  • 変数タイプ:参照によって渡され、C ++と同様に、このようなリスト、辞書など。楽しい(ラ)としては、過去にラ本当のパスを吸引し、ラ・外改訂の楽しみにも影響を与えることが

パイソン、すべてのものがオブジェクトである、我々はパス不変オブジェクトを言うと、変数のオブジェクトを渡す必要があり、参照によって渡された値の厳密な意味を言うか、渡すことはできません。

パイソン質量不変オブジェクト・インスタンス

#!/usr/bin/python3
 
def ChangeInt( a ):
    a = 10
 
b = 2
ChangeInt(b)
print( b ) # 结果是 2

例えば、新しい変数bを、同じintオブジェクトにAとB点、A = 10、コピーされた伝統的な値として、ChangeInt関数に渡され、その変数B、を指し、オブジェクト2がint型int型の値オブジェクト10を生成し、それにポイントをしましょう。

オブジェクトのインスタンス変数の送信

変更可能なオブジェクトは、関数のパラメータを変更し、その後、関数は、この関数を呼び出し、元のパラメータが変更されました。例えば:

#!/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]]

パラメータ

以下は、関数を呼び出す際に、正式なパラメータの型を使用することができます:

  • 必須パラメータ
  • キーワード引数
  • デフォルトパラメータ
  • 可変長パラメータ

必須パラメータ

正しい順序で関数に渡されるために必要なパラメータ。呼の数と同じにするときに宣言しなければならないとき。

プリントミー()関数を呼び出し、あなたはパラメータを渡す必要があります、または構文エラーが以下となります。

#!/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インタプリタは、パラメータ名とパラメータ値を一致させるための関数呼び出し文の秩序パラメータは、矛盾しています。

次の例では、()関数を呼び出してプリントミーパラメータ名を使用しています。

#!/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

デフォルトパラメータ

関数を呼び出すときにパラメータが渡されない場合、デフォルトのパラメータが使用されます。次の例なしの着信年齢パラメータ、デフォルト値の場合:

#!/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
------------------------
名字:  runoob
年龄:  35

可変長パラメータ

あなたは、元の文よりも多くのパラメータを扱うことができる機能が必要な場合があります。これらのパラメータは、宣言を命名しない、可変長パラメータ、および異なる2種類のパラメータと呼ばれます。次のように基本的な構文は次のとおりです。

def functionname([formal_args,] *var_args_tuple ):
   "函数_文档字符串"
   function_suite
   return [expression]

プラスアスタリスク*パラメータは、タプル(タプル)、およびすべての変数無名のパラメータのストレージとして導入されます。

#!/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

もう一つは、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 "<stdin>", line 1, in <module>
TypeError: f() takes 2 positional arguments but 3 were given
>>> f(1,2,c=3) # 正常
6
>>>

無名関数

匿名関数を作成するために、ラムダを使用してのpython。

もはやこの標準のフォームDEFステートメントを使用しないことを意味している匿名の、いわゆる、機能を定義します。

  • ただ、ラムダ式、関数本体はDEFよりもはるかに簡単です。
  • ラムダ式は、代わりにコードブロックの本体です。私たちは、ラムダ式に限定されたロジックをパッケージ化することができます。
  • ラムダ関数は、独自の名前空間を持ち、独自のパラメータリストやグローバル名前空間のパラメータの外にアクセスすることはできません。
  • ラムダ関数のルックスは、単一の行を書きますが、動作効率を高めるために小さな関数を呼び出すときに、スタックメモリを占有しないことを目指しCまたはC ++インライン関数に相当することはできませんが。

文法

次のようにラムダ関数の構文は、一つだけのステートメントが含まれています。

ラムダ[引数1 [、ARG2、..... ARGN]]:式

例を以下に示します。

#!/usr/bin/python3
 
# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2
 
# 调用sum函数
print ("相加后的值为 : ", sum( 10, 20 ))
print ("相加后的值为 : ", sum( 20, 20 ))

上記の出力の例:

30:加算した値
付加価値を40

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は、プログラム内の変数にアクセスできる任意の位置にない場合、アクセスは、変数が割り当てられている場所に依存します。

変数のスコープは、特定の変数名がアクセス可能なプログラムの部分を決定します。Pythonのスコープ、つまり4種類、合計:

  • L(ローカル)ローカルスコープ
  • 閉鎖機能外部E(囲い)関数
  • G(グローバル)グローバルスコープ
  • B(内蔵)スコープ(組み込み関数モジュールの範囲)を内蔵

Lへ - > E - > G - ルール> B・ルックアップ、すなわち:ローカルで見つからない、外側の部分に局所的な(例えば、閉鎖)を見つけるでしょう、あなたはグローバル、追加を見つけるために見つけることができません内蔵の表情。

g_count = 0  # 全局作用域
def outer():
    o_count = 1  # 闭包函数外的函数中
    def inner():
        i_count = 2  # 局部作用域

内蔵スコープ組み込みと呼ばれる標準モジュールによって達成されますが、変数名自体は範囲に組み込まれていないので、あなたがそれを使用する前にファイルをインポートする必要があります。Python3.0では、変数を定義済みのものを最終的に確認するために、次のコードを使用することができます。

>>> import builtins
>>> dir(builtins)

のみPythonモジュール(Module1の)、新しいスコープを導入する前に、クラス(クラス)と機能(DEF、ラムダ)、コードの他のブロック(例えば、IF / ELIF / ELSE /、/しばらくの間、等、を除い/試してください)新しいスコープを導入していない、これらのステートメント内で定義されている変数は、外部には、次のコードを訪問することができます。

>>> if True:
...  msg = 'I am from Runoob'
... 
>>> msg
'I am from Runoob'
>>> 

メッセージ変数はブロック場合の例で定義されているが、まだ外にアクセスできるようにしています。

MSGは、関数内で定義されている場合、それはローカル変数ではなく、外部からのアクセスは以下のとおりです。

>>> def test():
...     msg_inner = 'I am from Runoob'
... 
>>> msg_inner
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'msg_inner' is not defined
>>> 

与えられる情報の観点から、それは、msg_inner定義されていないと説明し、それはローカル変数であるため、使用することができない、唯一の関数内で使用することができます。


グローバルとローカル変数

これは、ローカルスコープを有するものとして定義され、関数の外に定義された変数の関数内のグローバルスコープを有します。

ローカル変数は、そのアクセス関数内で宣言することができ、プログラム全体の範囲内でグローバル変数にアクセスすることができます。関数を呼び出すときに、関数名の中に宣言されたすべての変数がスコープに追加されます。例を以下に示します。

#!/usr/bin/python3
 
total = 0 # 这是一个全局变量
# 可写函数说明
def sum( arg1, arg2 ):
    #返回2个参数的和."
    total = arg1 + arg2 # total在这里是局部变量.
    print ("函数内是局部变量 : ", total)
    return total
 
#调用sum函数
sum( 10, 20 )
print ("函数外是全局变量 : ", total)

上記の出力の例:

函数内是局部变量 :  30
函数外是全局变量 :  0

グローバルとローカル以外のキーワード

あなたは内部変数外側のスコープの範囲を変更したい場合は、グローバルとローカル以外のキーワードを使用する必要があります。

次の例では、グローバル変数numのを変更します。

num = 1
def fun1():
    global num  # 需要使用 global 关键字声明
    print(num) 
    num = 123
    print(num)
fun1()
print(num)

上記の出力の例:

1
123
123

ネストされたスコープ変更する(囲み範囲を、外側の非グローバルスコープ)変数ローカルでないキーワードは、以下の例のように、必要とされます。

 
def outer():
    num = 10
    def inner():
        nonlocal num   # nonlocal关键字声明
        num = 100
        print(num)
    inner()
    print(num)
outer()

上記の出力の例:

100 
100

別の特殊なケースがあり、次のコードが実行されると仮定します。

#!/usr/bin/python3
 
a = 10
def test():
    a = a + 1
    print(a)
test()

上記のプログラムは、次のエラーメッセージが実行されます。

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    test()
  File "test.py", line 5, in test
    a = a + 1
UnboundLocalError: local variable 'a' referenced before assignment

テストの機能は、ローカルを使用しているため、ローカルスコープのためのエラーメッセージは、誤って引用、未定義は、変更することができません。

グローバル変数の変更、関数のパラメータを通過され、通常の実行結果が出力されます。

a = 10
def test(a):
    a = a + 1
    print(a)
test(a)

実行出力は次のようになります。

11

おすすめ

転載: blog.csdn.net/u012717715/article/details/91962037