記事ディレクトリ
機能紹介
機能(ファンクション)のご紹介
関数は Python の重要な概念であり、これを使用すると、ステートメントまたはステートメントのグループをカプセル化し、他の場所で繰り返し呼び出すことができます。これにより、コードの再利用性と保守性が向上します。関数に関する基本的な事項をいくつか示します。
- 関数はオブジェクトであり、Python 言語の標準タイプの 1 つです。
- 関数を作成するときは、def ステートメントを使用し、その後に関数名とパラメーター リスト、コロン、実行するステートメントを含む関数本体を続けます。
- 関数名は識別子の仕様に準拠している必要があり、文字、数字、アンダースコアを含めることができますが、数字で始めることはできません。
- 関数を定義しても、関数本体のステートメントはすぐには実行されません。関数の呼び出し後にのみ実行されます。
- 関数を呼び出すときに、実際のパラメータを関数に渡すことができます。
- 関数は値を返すことも、戻り値を持たないこともできます。
たとえば、いくつかの情報を出力する単純な関数 fn を定義できます。
def fn():
print('这是我的第一个函数!')
print('hello')
print('今天天气真不错!')
関数が定義されたら、この関数を呼び出すことができます。
fn()
これにより、関数内の 3 行のテキストが出力されます。
関数内で仮パラメータを指定することもできます。仮パラメータは、関数の定義時に実際のパラメータを受け取るために使用される変数です。次に例を示します。
def fn2(a, b):
print(a, '+', b, '=', a + b)
この関数を呼び出して引数を渡すことができます。
fn2(10, 20)
fn2(123, 456)
これにより、対応する結果が出力されます。
関数パラメータ
関数を定義するときは、関数名の後の () 内にさまざまな数の仮パラメータを定義し、,
複数の仮パラメータを区切ることができます。仮パラメータ (仮パラメータ) 仮パラメータの定義は関数内で変数を宣言することと同じですが、値は割り当てられません。実パラメータ (実パラメータ) 関数定義時に仮パラメータを指定した場合、関数呼び出し時に実パラメータも渡す必要があります。実パラメータは、対応する仮パラメータに割り当てられます。簡単に言うと、仮パラメータが複数ある場合、パラメータの場合は、いくつかの実パラメータを渡す必要があります。
演習 1:
任意の 3 つの数値の積を求めるために使用できる関数を定義します。
# 求任意三个数的乘积
def mul(a,b,c):
print(a*b*c)
演習 2:
異なるユーザー名に基づいて異なるウェルカム メッセージを表示できる関数を定義する
# 根据不同的用户名显示不同的欢迎信息
def welcome(username):
print('欢迎',username,'光临')
コードの実行例:
mul(1,2,3)
welcome('孙悟空')
関数を定義する 仮パラメータを定義する場合、仮パラメータのデフォルト値を指定できます。デフォルト値を指定した後、ユーザーがパラメーターを渡した場合、デフォルト値は無効になり、ユーザーがパラメータを渡さなかった場合は、デフォルト値が有効になります。
def fn(a = 5 , b = 10 , c = 20):
print('a =',a)
print('b =',b)
print('c =',c)
コードの実行例:
fn(1 , 2 , 3)
fn(1 , 2)
fn()
実際のパラメータを渡す方法:
- 位置パラメータ: 位置パラメータは、対応する位置の実パラメータを、対応する位置の仮パラメータにコピーします。最初の実パラメータは最初の仮パラメータに割り当てられ、2 番目の実パラメータは 2 番目の仮パラメータに割り当てられます...
fn(1 , 2 , 3)
- キーワード パラメータ: キーワード パラメータは、仮パラメータが定義されている順序ではなく、パラメータ名に直接基づいて渡すことができます。
fn(b=1 , c=2 , a=3)
位置パラメータとキーワードパラメータは混在可能ですが、キーワードと位置パラメータを混在させる場合は、位置パラメータを先に記述する必要があります。
fn(1,c=30)
def fn2(a):
print('a =',a)
# 函数在调用时,解析器不会检查实参的类型
# 实参可以传递任意类型的对象
b = 123
b = True
b = 'hello'
b = None
b = [1,2,3]
fn2(b)
fn2(fn)
def fn3(a , b):
print(a+b)
fn3(123,"456")
関数内の仮パラメータを再割り当てしても、他の変数には影響しません。しかし、仮パラメータがオブジェクトを実行する場合、仮パラメータを通じてオブジェクトを変更すると、そのオブジェクトを指すすべての変数に影響します。
def fn4(a):
# 在函数中对形参进行重新赋值,不会影响其他的变量
# a = 20
# a是一个列表,尝试修改列表中的元素
# 如果形参执行的是一个对象,当我们通过形参去修改对象时
# 会影响到所有指向该对象的变量
a[0] = 30
print('a =',a,id(a))
c = 10
c = [1,2,3]
fn4(c)
fn4(c.copy())
fn4(c[:])
print('c =',c,id(c))
可変長パラメータ
Python では、可変長のパラメーターを処理する必要がある状況によく遭遇します。可変長パラメーターとは、関数が定義されているときに、実際に呼び出されるときにいくつのパラメーターが渡されるかを決定することができないという事実を指します。では、この状況にどう対処すればよいのでしょうか? 次に、任意の数の数値を合計できる関数を定義する方法を紹介します。
def sum(*nums):
result = 0
for n in nums:
result += n
print(result)
上記のコードはsum
、アスタリスク (*) の付いた仮パラメータを使用する という名前の関数を定義してnums
いるため、任意の数のパラメータを受け取り、これらのパラメータをタプルに保存できます。次に、ループを使用してこのタプルを反復処理し、そのタプル内の数値を累積し、結果を出力します。
次に、この関数をテストしてみましょう。
sum(123, 456, 789, 10, 20, 30, 40)
実行後の出力結果は 1458 です。
アスタリスク付きパラメータ
上記の可変長パラメータに加えて、アスタリスク (*) の付いた仮パラメータを使用して可変長パラメータを処理することもできます。アスタリスクの付いた仮パラメータは 1 つだけであり、すべてのパラメータの最後に記述する必要があります。
def fn(*a):
print("a =", a, type(a))
上記のコードはfn
という名前の関数を定義しており、その仮パラメータはアスタリスクですa
。この関数を呼び出すと、すべての位置引数がタプルに保存され、出力されます。
テストしてみましょう:
fn(1, 2, 3, 4, 5)
実行後の出力結果は次のようになりますa = (1, 2, 3, 4, 5) <class 'tuple'>
。
アスタリスクの付いたパラメータは、他のパラメータと組み合わせて使用できます。たとえば、アスタリスク付きの仮パラメータと通常の位置パラメータの両方を使用できます。
def fn2(a, *b, c):
print('a =', a)
print('b =', b)
print('c =', c)
上記のコードはfn2
、という名前の関数を定義します。この関数の仮パラメータには、通常の位置パラメータa
、アスタリスク付きの仮パラメータb
、およびキーワード パラメータが含まれますc
。この関数が呼び出されると、最初の引数が割り当てられa
、残りの位置引数はb
タプルに保存され、c
キーワード引数を使用して渡す必要があります。
テストしてみましょう:
fn2(1, 2, 3, 4, c=5)
実行後の出力結果は次のようになります。
a = 1
b = (2, 3, 4)
c = 5
特殊な使用方法と注意事項
アスタリスクの付いた仮パラメータには、前に紹介した使用法以外にも特別な使用法や注意が必要な点があります。
まず、仮パラメータの先頭に直接アスタリスク (*) を記述する場合、すべてのパラメータをキーワード パラメータの形式で渡す必要があります。例えば:
def fn2(*, a, b, c):
print('a =', a)
print('b =', b)
print('c =', c)
上記のコードは、fn2
位置パラメータを持たない呼び出し関数を定義しており、すべてのパラメータはキーワード引数を使用して渡す必要があります。
テストしてみましょう:
fn2(a=3, b=4, c=5)
実行後の出力結果は次のようになります。
a = 3
b = 4
c = 5
さらに、アスタリスク付きの仮パラメータは位置パラメータのみを受け取ることができ、キーワード パラメータは受け取ることができません。次のコードはエラーを生成します。
def fn3(*a):
print('a =', a)
この関数を呼び出すと、どのメソッドを使用してもエラーが発生します。
fn3(1, 2, 3) # 错误!不能使用位置参数
fn3(a=1, b=2, c=3) # 错误!不能使用关键字参数
最後に、パラメーターのアンパック (アンパック) を通じて、シーケンスまたは辞書内の要素を実際のパラメーターとして関数に渡すこともできます。例えば:
def fn4(a, b, c):
print('a =', a)
print('b =', b)
print('c =', c)
t = (10, 20, 30)
fn4(*t) # 参数解包,相当于 fn4(10, 20, 30)
d = {
'a': 100, 'b': 200, 'c': 300}
fn4(**d) # 参数解包,相当于 fn4(a=100, b=200, c=300)
上記のコードは、パラメーターのアンパックを使用して、タプルと辞書の要素をそれぞれ関数に渡しますfn4
。
関数の戻り値
関数の戻り値とは、関数の実行が完了した後に返される結果を指します。Python では、return
ステートメントを使用して関数の戻り値を指定できます。関数は戻り値を直接使用することも、変数を通じて戻り値を受け取ることもできます。
戻り値の使用
複数の数値の合計を計算する関数の例を次に示します。
def sum(*nums):
# 定义一个变量,来保存结果
result = 0
# 遍历元组,并将元组中的数进行累加
for n in nums :
result += n
return result
r = sum(123, 456, 789)
上記のコードでは、sum
関数は複数のパラメーターを受け入れ、それらを加算して合計を取得し、return
ステートメントを通じてこの結果を返します。関数を呼び出すとき、関数の戻り値を出力するなど、関数の戻り値を直接使用できます。
print(r) # 输出结果为 1368
同時に、戻り値に対して他の数値への加算などの他の操作を実行することもできます。
print(r + 778) # 输出结果为 2146
関数は戻り値を 1 つだけ持つことができますが、この戻り値は任意のオブジェクト、または関数自体にすることができることに注意してください。
空の戻り値
関数内に 1 つだけが記述されている場合return
、または何も記述されていない場合はreturn
、暗黙的に返すことと同じですNone
。
def fn2():
a = 10
return
r = fn2()
print(r) # 输出结果为 None
上記コードではfn2
関数内で戻り値を指定せず、ステートメントを直接使用していますreturn
。return
その後に値がないため、暗黙的に返されますNone
。
関数の実行と戻り
関数がreturn
ステートメントを実行すると、関数はただちに終了し、return
戻り結果として次の値を呼び出し元に返します。同時に、関数の背後にあるコードはreturn
実行されなくなります。
def fn3():
print('hello')
return
print('abc')
r = fn3()
print(r) # 输出结果为 hello 和 None
上記のコードでは、ステートメントが関数の実行を終了しているため、in 関数fn3
は実行されません。関数の戻り値は、その後に値が続かないためです。print('abc')
return
fn3
None
return
関数の実行を早期に終了する
関数内でreturn
ステートメントを使用すると、関数の実行を早期に終了できます。return
ステートメントが見つかると、関数はただちに実行を終了し、指定された値を返します。
def fn4():
for i in range(5):
if i == 3:
return # 遇到 i 等于 3 的时候提前结束函数执行
print(i)
print('循环执行完毕!')
fn4()
上記のコードでは、関数はfn4
ループを使用して 0 から 4 までの数値を出力します。3 に等しい場合i
、ステートメントが実行されreturn
、関数はfn4
実行を直ちに終了します。したがって、ループ内の後続のコードと最終行の print ステートメントは実行されません。
ドキュメント文字列 (doc str)
Python では、docstring を記述することで関数に説明を追加できます。docstring は、関数の関数、パラメーター、戻り値、およびその他の情報を説明する関数定義内の文字列です。docstring を使用すると、help()
関数を使用して関数の説明を確認できます。
以下に関数の例を示します。
def fn(a:int,b:bool,c:str='hello') -> int:
'''
这是一个文档字符串的示例
函数的作用:。。。。。
函数的参数:
a,作用,类型,默认值。。。。
b,作用,类型,默认值。。。。
c,作用,类型,默认值。。。。
'''
return 10
上記のコードでは、関数にはfn
3 つのパラメータ と があり、a
それぞれ整数、ブール値、文字列です。このうち、パラメータにはデフォルト値があります。関数の戻り値は整数です。b
c
c
'hello'
関数を使用して関数の説明help()
を表示できます。fn
help(fn)
上記のコードを実行すると、関数のfn
ドキュメントが出力されます。
関数のドキュメント
関数のfn
ドキュメントは次のとおりです。
fn(a:int,b:bool,c:str='hello') -> int
这是一个文档字符串的示例
函数的作用:。。。。。
函数的参数:
a,作用,类型,默认值。。。。
b,作用,类型,默认值。。。。
c,作用,类型,默认值。。。。
説明ドキュメントでは、標準形式を使用して関数、パラメータ、戻り値を明確に説明します。関数の最初の行に直接文字列を記述すると、ドキュメント文字列として使用できます。
docstring を使用すると、help()
関数を通じて関数の説明を表示できます。たとえば、次のコードを使用して関数のfn
説明を表示できます。
help(fn)
上記のコードを実行すると、関数のfn
ドキュメントが出力されます。
docstring を通じて、関数の機能と使用法をより深く理解できるようになり、より良いコードを書くのに役立ちます。したがって、関数を作成するときは、コードをよりフレンドリーで理解しやすくするためにドキュメント文字列の追加を検討することをお勧めします。