関数とは何ですか
必要なときに呼び出せる、準備されたコードの束
コードの繰り返しによる欠点: 冗長性、保守性の低下
したがって、複数行のコードを 1 つの全体にまとめるには、次の関数を使用します。
Python では、キーワード def を使用して関数を宣言します
関数を定義しても、自動的には実行されません
関数名(パラメータ)を使用して呼び出す必要があります
関数名も識別子です
数字、文字、アンダースコアで構成され、数字で始めることはできず、大文字と小文字が厳密に区別されます。キーワードは使用できません
命名規則に従い、アンダースコアを使用して接続します。名前が示すように、関数によって実行されるロジックは関数の名前と一致していることが望ましいです。
関数パラメータ
関数が宣言されるとき、括弧内のパラメータは仮パラメータ、または略して仮パラメータと呼ばれます。
仮パラメータの値は不定であり、プレースホルダとしてのみ使用されます。
関数を呼び出すときに、仮パラメータを渡すことができます
関数の呼び出し時に渡されるパラメータは、操作に含まれる実際のデータであり、これを実パラメータと呼びます。
関数を呼び出すと、実パラメータと仮パラメータが 1 対 1 に対応して渡されます。
変数名を指定して、実パラメータを仮パラメータに渡すこともできます。
関数の戻り値
戻り値は関数の実行結果ですが、すべての関数が戻り値を持つ必要があるわけではありません
def add ( a, b) :
c = a+ b
return c
result = add( 1 , 2 )
print ( result ** 4 )
関数のドキュメント
関数本体で 3 つの引用符のペアを使用して、関数の説明を示します。
def add ( a, b) :
"""
a: 第一个参数
b: 第二个参数
该函数返回两个数字相加的结果
"""
return a+ b
関数を作成するときは、仮パラメータの後に int を追加して、渡す実際のパラメータの型を指定します。
def add ( a: int , b: str ) :
pass
関数呼び出し関数
関数 2 では関数 1 を直接呼び出すことができます。関数 2 を呼び出すと、関数 2 のコード内の関数 1 の位置に従って関数 1 が呼び出されます。デモンストレーションは次のとおりです。
def function_1 ( ) :
print ( '函数1开始了' )
print ( '函数1结束了' )
def function_2 ( ) :
print ( '函数2开始了' )
print ( '开始调用函数1' )
function_1( )
print ( '函数1调用结束' )
print ( '函数2结束了' )
function_2( )
def fac ( n) :
x = 1
for i in range ( 1 , n+ 1 ) :
x *= i
return x
def sum ( m) :
x = 0
for i in range ( 1 , m+ 1 ) :
x += fac( i)
return x
print ( sum ( 5 ) )
グローバル変数とローカル変数
Python は関数を使用してスコープを分離できます
関数の外部で定義された変数はグローバル変数であり、py ファイル全体からアクセスできます。
関数内で定義された変数はローカル変数です。ローカル関数であり、関数内でのみ使用できます。
組み込み関数 globals() locals() は、関数内のグローバル変数とローカル変数を出力できます。
a = 100
word = 'hello'
def test ( ) :
b = 80
a = 10
print ( a)
global word
word = 'thank'
print ( word)
print ( 'locals = {},globals = {}' . format ( locals ( ) , globals ( ) ) )
test( )
print ( a)
print ( word)
関数の複数の戻り値
return は関数の終了を示します
通常の状況では、関数は最大でも 1 つの return ステートメントのみを実行します。
特殊な場合 (finally ステートメント)、next 関数は複数の return ステートメントを実行することがあります。
def test ( a, b) :
x = a // b
y = a % b
return x, y
print ( test( 12 , 5 ) )
デフォルトパラメータの使用
一部の関数のパラメータは、パラメータを渡す場合は渡されたパラメータを使用し、パラメータを渡さない場合はデフォルト値を使用します。
print ( 'hello' , end = '' )
print ( '你好' )
仮パラメータのデフォルト値の設定方法:関数を定義する際、デフォルト値が必要な仮パラメータに直接値を与えます。
パラメータが渡されない場合はデフォルト値が使用され、パラメータが渡された場合は次のように渡されたパラメータが使用されます。
def say_hello ( name, age, city= 'hangzhou' ) :
print ( '大家好,我叫{},我今年{}岁了,我来自{}' . format ( name, age, city) )
say_hello( 'lzh' , 18 )
単一のパラメータを直接渡すことも、変数割り当ての形式で渡すこともできます。
位置パラメータとキーワード パラメータがある場合は、キーワード パラメータを位置パラメータの後に配置する必要があります。
def say_hello ( name, age, city= 'hangzhou' ) :
print ( '大家好,我叫{},我今年{}岁了,我来自{}' . format ( name, age, city) )
say_hello( name = 'lzh' , city = 'sichuan' , age = 18 )
可変パラメータの使用
*args を使用して可変の位置パラメータを表します --> タプルの形式で保存します
**kwargs を使用して可変キーワード パラメータを表す --> 辞書形式で保存
def add ( a, b, * args) :
pass
add( 1 , 4 , 65 , 7 , 8 , 43 )
def add ( * args) :
pass
def add ( a, b, * args, mul= 2 ) :
pass
def add ( a, b, * args, mul= 2 , ** kwargs) :
pass
機能上の注意点
関数の 3 つの要素
一部のプログラミング言語では関数の重複が許可されていますが、Python では関数の重複は許可されていません。
関数の名前が同じ場合、後の関数が前の関数を上書きします。
Python では関数名も変数名として理解できます
したがって、関数を定義するときは、組み込み関数と同じ名前を付けないでください。
関数の再帰
簡単に言えば、再帰とは、関数自体がそれ自体を呼び出すことを意味します。
再帰で最も重要なことは、出口 (停止条件) を見つけることです。
x = 0
def get_sum ( n) :
global x
x += n
n -= 1
if n >= 1 :
get_sum( n)
return x
print ( get_sum( 100 ) )
def get_sum2 ( n) :
if n == 0 :
return n
return n + get_sum2( n- 1 )
print ( get_sum2( 100 ) )
def get_num ( n) :
if n == 0 :
return 1
return n * get_num( n- 1 )
print ( get_num( 0 ) )
def get_fi ( n) :
if n == 2 or n == 1 :
return 1
return get_fi( n- 2 ) + get_fi( n- 1 )
print ( get_fi( 8 ) )
無名関数
def add ( a, b) :
return a+ b
x = add( 1 , 2 )
fn = add
キーワード lambda を使用して関数を定義できます
匿名関数。単純な関数を表現するために使用されます。
無名関数を呼び出す方法:
1 つ目: 彼の名前を定義します (このように使用されることはほとんどありません)
2 番目: この関数をパラメータとして別の関数に渡して使用します。
lambda a, b: a+ b
fn2 = lambda a, b: a+ b
def calc ( a, b, fn) :
c= fn( a, b)
return c
x3 = calc( 1 , 3 , lambda x, y: x+ y)
print ( x3)
ソートメソッドの使用
組み込み関数と組み込みクラスの部分的なリスト (組み込み関数の使用)
students = [
{
'name' : 'zhoujielun' , 'age' : 18 , 'sorce' : 97 , 'height' : 180 } ,
{
'name' : 'linjunjie' , 'age' : 22 , 'sorce' : 65 , 'height' : 177 } ,
{
'name' : 'caiyilin' , 'age' : 20 , 'sorce' : 88 , 'height' : 185 }
]
students. sort( key= lambda ele: ele[ 'height' ] )
print ( students)
フィルター・マップ・リデュース組み込みクラスの使用
filter は 反復可能なオブジェクトをフィルタリングし、フィルター オブジェクトを取得できます。
Python2では組み込み関数ですが、Python3では組み込みクラスに変更されます。
x = filter ( lambda a: a% 2 == 0 , range ( 1 , 10 ) )
print ( x)
print ( list ( x) )
for i in x:
print ( i, end= '' )
ages = [ 10 , 11 , 25 , 16 , 8 , 14 , 46 , 547 ]
m = map ( lambda a: a+ 2 , ages)
for x in m:
print ( x, end= ' ' )
from functools import reduce
def foo ( x, y) :
return x + y
scores = [ 100 , 154 , 1564 , 4684 ]
print ( reduce ( foo, scores) )
from functools import reduce
students = [
{
'name' : 'zhoujielun' , 'age' : 18 , 'sorce' : 97 , 'height' : 180 } ,
{
'name' : 'linjunjie' , 'age' : 22 , 'sorce' : 65 , 'height' : 177 } ,
{
'name' : 'caiyilin' , 'age' : 20 , 'sorce' : 88 , 'height' : 185 }
]
print ( reduce ( lambda x1, x2: x1+ x2, map ( lambda a: a[ 'age' ] , students) ) )
print ( reduce ( lambda x1, x2: x1+ x2[ 'age' ] , students, 0 ) )