[Python]基本的な文法-6、関数設計

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

 

おすすめ

転載: blog.csdn.net/trichloromethane/article/details/108267386