1. 程式人生 > >python - 函式的作用域

python - 函式的作用域

作用域:
區域性作用域
全域性作用域

1.概念

# 全域性作用域:作用於整個程式
num = 10
print('out fun: id=',id(num))

def fun():
    #區域性作用域,在函式執行時生效,函式執行結束則釋放
    num =2
    print('in fun:id=',id(num))
    print('in fun:num = %s' %(num))
    
fun()
print('out fun: num=%s' %(num))

輸出:

out fun: id= 1683110288

in fun:id= 1683110160	#函式裡的num是部分作用域,函式結束就釋放
in fun:num = 2

out fun: num=10	#全域性作用域的num=10

2.global
global宣告區域性變數為全域性變數,函式結束依然生效

num = 10

def fun():
    # 通過global關鍵字宣告區域性變數為全域性變數
    # 函式執行完畢,變數依然生效
    global num
    num = 2
fun()

print(num)

輸出:

2

函式練習題:

Collatz序列
編寫一個名為collatz()的函式,它有一個名為number的引數。如果引數是偶數,那麼collatz()就打印出number//2,並返回該值。如果number是奇數,collatz()就列印並返回3*number+1。然後編寫一個程式,讓使用者輸入一個整數,並不斷對這個數呼叫collatz(),直到函式返回值1(令人驚奇的是,這個序列對於任何整數都有效,利用這個序列,你遲早會得到1!既使數學家也不能確定為什麼。你的程式在研究所謂的“Collatz序列”,它有時候被稱為“最簡單的、不可能的數學問題”)。

  • 輸入:
    3

  • 輸出:
    10
    5
    16
    8
    4
    2
    1

def collatz(number):
    if number == 1:	#結束程式exit(0)
        exit(0)
    elif number % 2 == 0:
        return number // 2
    else:
        return 3 * number + 1


num = int(input('Num:'))
while True:
    num = collatz(num)	#因為num不斷變化,所以num即是引數也是變數。
    print(num)

輸出:

num:3
10
5
16
8
4
2
1