1.6機能設計
機能コンセプト
関数を使用して、再利用可能なコードを定義し、コードを整理および簡素化できます
# 计算1~10的和
sum = 0
for i in range(1, 11):
sum += i
print(sum)
# 计算2~22的和
sum = 0
for i in range(2, 23):
sum += i
print(sum)
# 计算9~101的和
sum = 0
for i in range(9, 102):
sum += i
print(sum)
# 封装
def getSum(a, b):
result = 0
for i in range(a, b + 1):
result += i
return result
sum = getSum(1,10)
print(sum)
sum = getSum(2,22)
print(sum)
sum = getSum(9,101)
print(sum)
関数は、操作を実装するために組み立てられた一連のステートメントです。
機能の利点は何ですか:
-
関数を使用すると、コードを再利用できるため、コードを繰り返し作成する必要がなくなり、コードの再利用が向上します。
-
関数は、内部実装をカプセル化し、内部データを保護し、ユーザーへの透過性を実現できます
-
関数によってプログラムがモジュール化され、明確な分業が行われるため、読み取り、デバッグ、および変更が容易になります。
関数定義
関数の主なコンポーネントは、関数名、パラメーター、関数本体、および戻り値です。
def 函数名称(参数):
函数体
return 返回值
パラメータは、フォーマルパラメータまたはフォーマルパラメータと呼ばれます。関数が外部から呼び出されると、一部のデータが渡され、これらのデータはフォーマルパラメータによって受信されます。渡されるデータは、実際のパラメーターまたは実際のパラメーターと呼ばれます。パラメータはオプションです。
num1 = 30;
num2 = 40;
sum = getSum(num1,num2)
print(sum)
一部の関数には戻り値があり、一部の関数にはありません。戻り値のない返品はありませんか?戻り値がない場合、戻り値は非表示になります。
def getSumPrint(a,b):
result = 0
for i in range(a, b + 1):
result += i
print(result)
# return
getSumPrint(10,20)
関数本体には、関数の機能を定義する一連のステートメントが含まれています。
Returnは、関数操作の終了のみを意味します。関数実行プロセスがreturnステートメントを検出すると、関数の後のすべてのコードが無視され、関数本体が直接ジャンプアウトされ、ループ内であっても関数はすぐに終了します。また、関数に戻り値がない場合は、デフォルトでNoneが返されます。戻り値がある場合は、戻り後にそれを書き込んで関数を終了し、結果を呼び出し元に返します。
def func01(a):
if a == 10:
print("哈哈")
return
print("嘻嘻")
return
func01(11)
res = func01(10)
print(type(res))
def func02(a):
for i in range(1,11):
if i == a:
print(i)
# break 跳出循环 接着向下运行
return # 直接结束函数
print(i)
print("啦啦")
return
func02(11)
func02(4)
返品で何を返品できますか?
-
何も返さない:
return
-
任意のデータタイプ:
return 'hello'
-
表現:
return 1 + 2
-
判断の声明:
return 3 > 2
-
変数:
return a
-
関数呼び出し:
return func()
-
カンマで区切られた複数の戻り値:
return a,1+2,'hello'
-
自分自身に戻ることさえ:
return self
関数は、ほぼすべてのPythonデータオブジェクトを返すことができます。
パラメータの受け渡し
関数には通常、実際の外部データを関数に渡して処理するために使用されるパラメーターがあります。ただし、異なるデータタイプのパラメータを処理する場合、次の2つのことが起こります。
-
Python関数がパラメータを渡すとき、実際のオブジェクトのメモリアドレスを渡します
-
Pythonのデータタイプは、主に可変オブジェクトと不変オブジェクトに分けられます
def func(a): # 局部变量
print("函数内部没有修改前",id(a)) # 520
a = 2
print("函数内部修改后",id(a)) # 536
print("函数内部修改后a=",a) # 2
return
a = 1 # 全局变量
print("调用函数之前",id(a)) # 520
func(a)
print("调用函数之后",id(a)) # 520
print(a)
def test(lst) :
lst.append(4)
print(id(lst))
print(lst)
lst = [1,2,3] # 列表
print(id(lst))
test(lst)
print(id(lst))
print(lst)
パラメータの転送に関しては、Pythonは動的言語であるため、変数のデータタイプの区別がないため、関数は実際のパラメータのデータタイプを検出しませんが、数を検出します。データタイプの検出は、関数の実行中にのみ検出されます。出てくる。
def add(a, b):
return a + b
add(1, 2)
add(1, 2, 3)
Traceback (most recent call last):
File "C:/Users/HENG/Desktop/PythonCode/Day04/FunctionTest05.py", line 5, in <module>
add(1, 2, 3)
TypeError: add() takes 2 positional arguments but 3 were given
add(1, "hello")
Traceback (most recent call last):
File "C:/Users/HENG/Desktop/PythonCode/Day04/FunctionTest05.py", line 6, in <module>
add(1, "hello")
File "C:/Users/HENG/Desktop/PythonCode/Day04/FunctionTest05.py", line 2, in add
return a + b
TypeError: unsupported operand type(s) for +: 'int' and 'str'
機能動作メカニズム
スタックは、最初から最後までのコンテナです。
関数はスタックに基づいて実行されます。関数が呼び出されるたびに、システムは自動的に関数のメモリスペース(スタックフレームとも呼ばれます)を作成し、そのパラメーター、変数、および実行ステートメントを格納してから、スタックフレームをスタックにプッシュして実行を開始します。関数が別の新しい関数を呼び出すと、システムは新しいスタックフレームを作成し、スタックフレームをスタックにプッシュして実行を開始します。次に、最初の関数は、その上のすべての関数が実行されるまで一時停止します。関数は引き続き実行されます。
def multi(a, b, c):
return a ** 2, b ** 2, c ** 2
def add(a, b, c):
return a + b + c
def out(s):
print(s)
def test(a, b):
num1, num2, num3 = multi(a, b, a + b)
out('hello')
return add(num1, num2, num3)
num = test(2, 3)
print(num)
可変スコープ
関数内で定義された変数は、ローカル変数と呼ばれます。ローカル変数には、関数内でのみアクセスできます。ローカル変数のスコープが配置されている関数は、スタックにプッシュされ、関数が終了してスタックからポップアウトするまで実行されます。
すべての関数の外部で定義され、すべての関数からアクセスできるグローバル変数を定義することもできます。
例1:
globalVar = 1
num1 = 3
num2 = 10
def f1():
localVar = 2 # 局部变量 在该函数内创建
print(globalVar) # 全局变量
print(localVar) # 局部变量
print(num1 + 3) # num1 全局变量
num2 = 20 # 局部变量 在该函数内创建
print(num2)
# 如果直接将全局变量,参与运算,直接打印 调用的就是全局变量
# 如果是对全局变量进行修改,则为创建一个同名的局部变量
f1()
print(globalVar)
print(num2)
# NameError: name 'localVar' is not defined
# print(localVar)
例2:
x = 1
def f2():
global x # 在函数内部将x标记为全局变量,如果存在则复用,不存在则创建全局变量
x = 2
print(x)
f2()
print(x)
==========================================
def f2():
global x # 在函数内部将x标记为全局变量,如果存在则复用,不存在则创建全局变量
x = 2
print(x)
f2()
print(x)
例3:
x = int(input("Enter a number:"))
if x > 0:
y = 4 # 全局变量 只有在x>0的条件下创建
print(y)
Enter a number:-10
Traceback (most recent call last):
File "C:/Users/HENG/Desktop/PythonCode/Day04/FunctionTest05.py", line 52, in <module>
print(y)
NameError: name 'y' is not defined
例4:
sum = 0
for i in range(5): # i 全局变量
sum += i
print(i) # --> 4