目次
1.機能紹介
多くの場合, 関数を繰り返し適用する必要があります. 例えば, ウェブページをデザインするとき, 私たちは "login" 関数を繰り返し使用します. 関数として書いてカプセル化し, いつでも呼び出せるようにすることができます.これにより、プログラムの可読性がある程度向上し、次数がより明確に見えるようになります。
第二に、関数の定義
関数の使用は、最初に定義し、後で呼び出すという原則に従う必要があります。関数の定義は、あらかじめ関数本体のコードを保存しておき、関数名にメモリアドレスを代入することに相当し、関数名はこのコードへの参照であり、変数の定義と同様です。事前定義なしで関数を呼び出すことは、存在しない変数名を参照することと同じです。
def 函数名(参数1,参数2,...):
"""文档描述"""
函数体
return 值
上記の定義について注意すべき点がいくつかあります。
1. def: 関数を定義するキーワード。
2. 関数名: 関数名は、関数本体のコードへの参照である関数のメモリ アドレスを指します。関数の命名は、関数の機能を反映する必要があります。
3. ブラケット: パラメータはブラケット内で定義されます. パラメータはオプションであり, パラメータの型を指定する必要はありません.
4. コロン: 括弧の後にコロンを追加し、次の行で関数本体のコードのインデントを開始します。
5.「ドキュメントの説明」「」:関数の機能、パラメーターの紹介、およびその他の情報を説明するドキュメントは必須ではありませんが、関数の読みやすさを向上させるために追加することをお勧めします。
6. 関数本体: ステートメントと式で構成されます。
7. 戻り値: 関数の戻り値を定義します。戻り値はオプションです。
#有参函数
def my_min(x,y):
res=x if x < y else y
return res
#无参函数
def interactive():
user=input('user>>: ').strip()
pwd=input('password>>: ').strip()
return (user,pwd)
パラメータ化された関数を使用するか、パラメータ化されていない関数を使用するかは、主にニーズに依存します
関数本体が pass の場合は、何もしないことを意味し、これを空関数と呼びます。通常、空の関数を定義すると便利です。これは、プログラム設計の開始時に、プログラムが完了する必要がある関数を検討し、すべての関数をリストして、関数の「プレースホルダー」として pass を使用する必要があることが多いためです。プログラムを構成する本体アーキテクチャは即時で、明快で、読みやすいものです。
3. 関数呼び出し
関数の使用は定義フェーズと呼び出しフェーズに分けられます.関数を定義するときは, 構文だけが検出され, 関数本体のコードは実行されません.関数名は括弧付きで呼び出され, 関数本体のコードは実行されます.関数本体は、関数が呼び出されたときにのみ実行されます。
#定义阶段
def foo():
print('in the foo')
bar()
def bar():
print('in the bar')
#调用阶段
foo()
関数本体コードの実行結果を呼び出し元に返す必要がある場合は, return を使用する必要があります. return の後に値がない場合や return を直接省略した場合, デフォルトでは None が返されます. return の戻り値には値がありません.型の制限、および複数の戻り値を tuple に配置できます。
return は関数の終わりのサインです.関数には複数の return が存在する可能性がありますが, 関数は 1 回の実行で終了し, return の後に定義された値がこの呼び出しの結果として返されます.
>>> def test(x,y,z):
... return x,y,z #等同于return (x,y,z)
...
>>> res=test(1,2,3)
>>> print(res)
(1, 2, 3)
4. 正式参加と実際のパラメータ
関数パラメーターは、仮パラメーターと実パラメーターに分けられ、仮パラメーターと実パラメーターと呼ばれます。仮パラメーターは、関数を定義するときに括弧内に宣言されるパラメーターです。仮パラメータは基本的に変数名であり、外部から値を受け取るために使用されます。
5. 正式な参加と実際のパラメーターの使用
5.1 位置パラメータ
1. 関数を定義するとき、仮パラメータは左から右に順番に定義されます。これは位置パラメータと呼ばれます。この形式で定義されたすべての仮パラメータは、値によって渡される必要があります。
2. 関数を呼び出すとき, 実パラメータは左から右に順番に定義されます, これは定位置パラメータと呼ばれます. この形式で定義されたすべての実パラメータは, 左から右の順に仮パラメータに対応します.
5.2 キーワード引数
関数を呼び出すとき、実パラメータはキー=値の形式にすることができ、これはキーワード パラメータと呼ばれます. この形式で定義された実パラメータは、左から右の順序で定義されていない場合がありますが、それでも可能です.パラメータを割り当てるときは、関数を呼び出すときに、位置またはキーワードによって実際のパラメータを混在させることもできることに注意してください。仮パラメータに値を繰り返し代入することはできません
5.3 デフォルトのパラメータ
関数を定義するとき, 仮パラメータには値が代入されています. この種の仮パラメータはデフォルトパラメータと呼ばれます. 関数が複数のパラメータを持つ場合, 値が頻繁に変化するパラメータを定位置パラメータとして定義する必要があります.値の変化が少ないパラメータ デフォルトのパラメータとして定義されています。たとえば、学生情報を登録する関数を作成する場合、ほとんどの学生が男性である場合、仮パラメータの性別をデフォルト パラメータとして定義できます。
パラメーター sex には、定義時に値が割り当てられています。つまり、呼び出し時に sex に値を割り当てる必要がないため、関数呼び出しの複雑さが軽減されます。
注: 1. デフォルト・パラメーターは、位置パラメーターの後にある必要があります 2. デフォルト・パラメーターの値は、関数定義フェーズで一度だけ割り当てられます
>>> x=1
>>> def foo(arg=x):
... print(arg)
...
>>> x=5 #定义阶段arg已被赋值为1,此处的修改与默认参数arg无任何关系
>>> foo()
1
通常、デフォルト パラメータの値は不変型に設定する必要があります
>>> def foo(n,arg=[]):
... arg.append(n)
... return arg
...
>>> foo(1)
[1]
>>> foo(2)
[1, 2]
>>> foo(3)
[1, 2, 3]
5.4 可変長パラメータ
主に * と ** の使い方です。詳細な説明については、以前のブログを参照してください: * と ** の使用
5.5 併用
要約すると、上記のすべてのパラメーターは任意の組み合わせで使用できますが、定義の順序は、位置パラメーター、デフォルト パラメーター、*args、**kwargs でなければなりません。変数パラメータ *args とキーワード パラメータ *kwargs は通常組み合わせて使用されます. 関数の仮パラメータが args と **kwargs である場合, 関数は任意の形式と長さのパラメータを受け取ることができることを意味します.
>>> def wrapper(*args,**kwargs):
... pass
...
6. 名前空間
名前空間は、名前とオブジェクト間のマッピング/バインディング関係が格納される場所です。x=3 の場合、Python はオブジェクト 3 を格納するためのメモリ空間を適用し、名前 x と 3 の間の結合関係を名前空間に格納します。delx は結合関係をクリアすることを意味します。
6.1 組み込みの名前空間
Python インタープリターの起動/シャットダウンで生成/リサイクルされるため、最初に読み込まれる名前空間であり、組み込み関数名などの組み込み名を格納するために使用されます。
6.2 グローバル名前空間
Python ファイルの実行の開始/完了と共に生成/リサイクルされます。これは 2 番目にロードされる名前空間であり、ファイルの実行中に生成された名前は、次のようにこの名前空間に格納されます。
6.3 ローカル名前空間
関数の呼び出し/終了で一時的に生成/リサイクルされ、関数の仮パラメーターと関数で定義された名前がこの名前空間に格納されます
名前空間のロード順序は、組み込み名前空間 -> グローバル名前空間 -> ローカル名前空間であり、名前を見つけるには、3 つの名前空間のいずれかから見つける必要があり、検索順序は、ローカル名前空間 -> ビューロー名前空間です。 -> 組み込みの名前空間。
7. 範囲
名前の範囲に応じて、3 つの名前空間は 2 つの領域に分けることができます。
1. グローバル スコープ: グローバル名前空間と組み込み名前空間の名前はグローバル スコープに属し、このスコープの名前はグローバルに存続し (削除されない限り、そうでなければファイル実行プロセス全体に存続します)、グローバルに有効です (任意の位置で)に使える);
2. ローカル スコープ: ローカル名前空間にある名前は、ローカル スコープに属します。この範囲の名前は一時的に残り (つまり、関数が呼び出されたときに一時的に生成され、関数呼び出しの終了後に解放されます)、ローカルで有効です (関数内でのみ使用できます)。
スコープの優先度
ローカル スコープで名前を検索する場合、開始位置はローカル スコープなので、最初にローカル ネームスペースを検索し、見つからない場合はグローバル スコープに移動して検索します。最初にグローバル ネームスペースを検索し、見つからない場合は次に検索します。組み込みの名前空間を検索し、最後にすべての名前空間が見つからない場合、例外がスローされます
x=100 #全局作用域的名字x
def foo():
x=300 #局部作用域的名字x
print(x) #在局部找x
foo()#结果为300
x=100
def foo():
x=300 #在函数调用时产生局部作用域的名字x
foo()
print(x) #在全局找x,结果为100
ヒント:組み込み関数 locals() と globals0 を呼び出して、それぞれローカル スコープとグローバル スコープの名前を表示できます。結果はすべて辞書形式です。グローバル スコープで見た locals0 の結果は globals() と同じです
実パラメータの値が変数型の場合、関数本体で値を変更すると元の値がそのまま反映される
num_list=[1,2,3]
def foo(nums):
nums.append(5)
foo(num_list)
print(num_list)
#结果为
[1, 2, 3, 5]
ネストされたマルチレベル関数の場合、nonlocal キーワードを使用して、外側のネストされた関数定義 (非グローバル) のスコープから名前を宣言します。
def f1():
x=2
def f2():
nonlocal x
x=3
f2() #调用f2(),修改f1作用域中名字x的值
print(x) #在f1作用域查看x
f1()
#结果
3