知識ポイント 1: 関数の基本
1. 関数の定義
def 函数名(参数):
函数体
无参函数:
def func1():
print('hello world!')
单参函数:
def func2(a):
print(a*3)
多参函数:
def func3(a,b):
print(a*b)
2. 関数呼び出し
関数名を使用して直接呼び出す
func1()
func2(23)
func3(4,5)
3. パラメータ
関数のパラメータは、仮パラメータ(仮パラメータ)と実パラメータ(実パラメータ)に分けられます。
仮パラメータ: 関数定義フェーズのパラメータ。スコープは関数定義位置に限定され、関数の外では意味を持ちません。
実際のパラメータ: 関数呼び出しフェーズのパラメータ。関数内で処理するデータを渡すために使用されます。
パラメータの設定方法:
1. 位置パラメータ
関数で定義されたパラメータの位置に従ってパラメータを渡します
位置の順序は定義時と同じでなければなりません
def f(a,b,c):
print(a+b*c)
f(1,2,3)
2. キーワードパラメータ
キーワードを直接使用してパラメータを渡す
ポジションの順序は定義と異なる場合があります
def f(a,b,c):
print(a+b*c)
f(b=2,a=1,c=3)
3. パラメータのデフォルト値
関数にデフォルト値が設定されている場合、呼び出し時にパラメーターを渡すことはできません。
def f(a,b,c=3):
print(a+b*c)
f(1,2,3)
f(1,2)
f(1,2,4) # 如果不传参,参数使用默认值,如果传参,使用新参数值
4. 位置パラメータとキーワードパラメータの混合
位置パラメータが最初に来て、キーワードパラメータが最後に来ます
def f(a,b,c):
print(a+b*c)
f(1,2,c=3) # 正确调用方式
f(c=3,1,2) # 错误调用方式
5. 可変パラメータ
1) # 仮引数に * を追加すると、関数呼び出し時にオーバーフロー位置実引数をタプル形式で保存し、* の後に変数名を代入します。
def foo(x, y, *z):
print(x, y)
print(z)
print(*z)
foo(1, 2, 3, 4, 5, 6)
2) # 実際のパラメータを分散する
# シーケンス型は * 分割可能
foo(1, *(2, 3))
foo(1, 2)
foo(*[1, 2, 3])
3) # 仮引数に ** を指定した場合: 関数呼び出し時のオーバーフローキーワード実引数を辞書形式で保存し、** 以降の変数名を代入します。
def foo(x,y,**z):
print(x,y)
print(z)
# **只能接受关键字实参
4) # 実際のパラメータは辞書に分割し、パラメータを渡すためのキーワードの実パラメータに変換できます。
a = {'x':1,'y':2,'z':3}
foo(**a)
4. 戻り値
戻り値は関数 return の処理結果です
関数の実行後、関数自体は戻り値と等しくなります。
def s(a,b):
c=a+b
return c
m=s(2,5)
print(m)
'''
1.函数内可以有多个return,但只要执行一次,整个函数就会结束运行,默认return None
2.return 的返回值无类型限制,即可以是任意数据类型、表达式
3.return 的返回值无个数限制,即可以用逗号分隔开多个任意类型的值
4.return关键字:return也可以作为函数结束的标志
'''
5. ローカル変数とグローバル変数
関数内で割り当てられた変数は、関数の「ローカル スコープ」内にあり、ローカル変数です。
関数の外で割り当てられた変数は、関数の「グローバル スコープ」内にあり、グローバル変数に属します。
変数はローカル変数またはグローバル変数のいずれかです。ケーキを食べながら食べることはできません。
注: 異なるローカル スコープは互いに独立しており、あるローカル スコープは他のローカル スコープの変数を使用できません。
1.# 関数内の変数には外部からアクセスできません
def f():
a=12
print(a)
2.# 関数外の変数には関数内からアクセス可能
a=12
def f():
b=a*2
return b
print(f())
3.# 関数外の変数を関数内で変更することはできず、エラーが報告されます。
a=12
def f():
a = a + 1
f()
print(a)
4.# ただし、関数内で外部変数を読み取ることはできます
a=12
def f():
b = a + 1
print(b)
f()
print(a)
5.# 変数の型は関数内で変更可能
# 但是不可以重新赋值
a=[1,2,3]
def f():
a.append(4)
f()
print(a)
6.# global を使用すると、関数内のグローバル変数の値を変更できます
def f():
global a
a = a + 1
f()
print(a)
7.# nonlocal により、ネストされた関数がネストされた関数の外側の値を変更できるようになります
def f():
a = 12
def ff():
nonlocal a
a += 1
print(a)
f()
範囲判断の 4 つのルール:
1. 変数がグローバル スコープ (すべての関数の外側) で使用されている場合、それはグローバル変数です。
2. 関数内に変数に対するグローバル ステートメントがある場合、それはグローバル変数です。
3. それ以外の場合、変数が関数内で割り当てられている場合、それはローカル変数です。
4. ただし、変数が関数内の代入ステートメントで使用されていない場合、それはグローバル変数です。
def f1():
global a
a = 12 # 全局变量a
print('我是全局变量%d' % a)
def f2():
a = 12 # 局部变量a
print('我是局部变量%d' % a)
def f3():
print('我也是全局变量%d' % a)
a = 12 # 全局变量
print('我也是全局变量%d' % a)
6. よく使われる組み込み関数
# 絶対値を求める
print(abs(-2))
# 最大値を求める
nums=[1,3,5,3,2,5,7,4]
print(max(nums))
# 最小値を求める
nums=[1,3,5,3,2,5,7,4]
print(min(nums))
# 合計
nums=[1,3,5,3,2,5,7,4]
print(sum(nums))
#文字をエンコーディングに変換する
print(ord('a'))
#エンコーディングを文字に変換する
print(chr(65))
# ジッパー機能
l1=[1,2,3,4,5]
l2=['a','b','c','d','e','f']
print(zip(l1,l2)) # 返回的是<zip object at 0x000001CED5496640>对象
print(list(zip(l1,l2))) # 转换成列表
print(dict(zip(l1,l2))) # 转换成字典
#文字列内の式を実行します
print(eval('2+3'))
#文字列内のステートメントを実行します
exec('print("hello world")')
知っておきたいポイント2:高度な機能
1. 匿名関数
1.1 無名関数とは何ですか?
匿名関数は、関数を定義するために標準形式の def ステートメントを使用しないことを意味します。
Python はラムダを使用して匿名関数を作成します。Lambda は単なる式であり、関数本体は def よりもはるかに単純です。
ラムダの本体はコード ブロックではなく式であり、ラムダ式にカプセル化できるロジックは限られています。
注: lambda 関数には独自の名前空間があり、独自のパラメータ リストの外部またはグローバル名前空間内のパラメータにアクセスすることはできません。
ラムダ関数の構文には、次のステートメントが 1 つだけ含まれています。
lambda 参数:表达式(返回值)
1.2 無名関数の適用方法
例 1: 2 つの数値の合計を求める
def ステートメントを使用します。
def func(x, y):
return x + y
ラムダ式を使用します。
lambda x, y: x + y
上記のコードからわかるように、ラムダ式を使用すると、def ステートメントを使用するよりも必要なコードが少なくなります。ここでは明らかではないので、さらにコードを含む例を見てみましょう。
例 2: リスト内で 3 より大きい要素を検索します。
方法 1: 手続き型プログラミングによって実装されます。これも従来の方法です。
list_1 = [1, 2, 3, 4, 5]
list_2 = []
for i in list_1:
if i > 3:
list_2.append(i)
print('列表中大于3的元素有: ', list_2)
方法 2: フィルタ組み込み関数 + リスト内包表記を使用して判定条件を与える関数型プログラミングで実装:
def func_filter(x):
return x > 3
f_list = filter(func_filter, [1, 2, 3, 4, 5])
print('列表中大于3的元素有: ', [item for item in f_list])
方法 3: 匿名関数を使用すると、コードが 1 行だけでより合理化されます。
print('列表中大于3的元素有: ', [item for item in filter(lambda x: x > 3, [1, 2, 3, 4, 5])])
上記の操作からわかるように、ラムダは関数型プログラミングで一般的に使用され、コードが簡潔であり、フィルターなどの関数と組み合わせて使用されることがよくあります。
1.3 匿名関数の使用シナリオ
1. プログラムを一度だけ使用し、関数名を定義する必要がない場合、無名関数を使用すると、定義された変数が占有するメモリ領域を節約できます。
2. プログラムをより簡潔にしたい場合は、無名関数を使用できます。
#匿名関数の使用規則:
1. 通常、式の行があり、戻り値が必要です。
2.返品はできません。
3. パラメータを持たないか、1 つ以上のパラメータを含めることができます。
1.4 無名関数の例
パラメータのない匿名関数:
t = lambda : True
t()
パラメータを持つ匿名関数:
lambda x: x ** 3
lambda x, y, z: x + y + z
lambda x, y = 3: x * y
2. クロージャ機能
場合によっては、関数が関数内で自己定義された関数を返すこともあります。
例:
def outer(*args):
def inner():
s = 0
for n in args:
s = s + n
return s
return inner
print(f'调用外部函数的结果: {outer(1, 2, 3, 4)}')
inner = out(1, 2, 3, 4)
print(f'调用内部函数的结果: {inner()}')
この例では、関数 external 内に関数 inner が定義されており、内側の関数 inner は外側の関数 external のパラメータやローカル変数を参照できます。アウターが関数インナーを返すと、関連するパラメータと変数が返された関数に保存されます。これはクロージャと呼ばれます。このプログラム構造は非常に強力なので、最初に理解して、後で詳しく説明します。
3. 再帰関数
3.1 再帰関数とは何ですか?
関数がそれ自体を内部的に呼び出す場合、それは再帰関数と呼ばれます。
再帰関数の簡単な定義は次のとおりです。
def fun():
print('hello')
return fun()
関数 fat(n) で表される階乗 n=1×2×3×…×n を計算する再帰的な例を見てみましょう。
def fact(n):
if n == 1:
return 1
return n * fact(n - 1)
print(f'调用递归函数执行结果为: {fact(5)}')
fat(5) を計算するとき、関数定義に従って計算プロセスを確認できます。
===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120