iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 18
0
Software Development

從0開始學習程式-Python系列 第 19

[Day22] I want it that way! global variable就是要這樣用!


今天真的是忙碌的一天,到現在才能把文章貼出來QQ

變數不一樣?

當我們在使用function時,最常遇到的就是變數問題!其實·在變數的操作上有分成全域變數(global variable)和區域變數(local variable)。

  • global variable : 自從變數被宣告並且賦予一個值後,他就會一直活著,直到程式結束為止
  • local variable : 自從變數被宣告並且賦予一個值後,他只能被侷限存活在限制的環境中,例如被限制只能在function中,function外的世界與之無爭!

因此,在命名變數的時候最佳的狀況就是兩種的名字不要重複,然而,有時候因為習慣問題,不得不會將兩者變數命名相同,但有時為能在function中直接引用全域變數而不刻意改變命名。以下我們舉個例子:

# var.py
count=1
def a():
	print('In funct') #檢查是否有calling function
	print(count)
	count=3
	return 
if __name__=='__main__':
	print('In main') #檢查是否有開始運作
    print(count) #檢查count(global variable)是否為1
	a()
	print(count)

上面的執行結果為:

>>>python var.py
In main
1
In funct
nboundLocalError: local variable 'count' referenced before assignment

從執行結果看來,主程式啟動後有call function a(),然而到function中的print(count)出現了錯誤,錯誤訊息告訴我們「'count'這個變數是一個區域變數,在使用前沒有被assignment」。亦即,在function若要使用global variable需要做一些宣告。

那該怎麼做呢?

其實,如果把function a()中的count=3改成其他變數名稱,如count_2=3,此時就可以完整個把function跑完,我們來觀察一下結果:

# var_1.py
count=1
def a():
	print('In function') #檢查是否有calling function
	print(count)
	count_2=3
	return 
if __name__=='__main__':
	print('In main') #檢查是否有開始運作
    print(count) #檢查count(global variable)是否為1
	a()
	print(count_3)

我們來觀察一下結果:

>>>python var_1.py
In main
1
In funct
1
NameError: name 'count_1' is not defined

從執行結果看來,主程式啟動後有call function a(),並且有將function跑完。然而因為'count_1'是在function a()中的區域變數,因此在跑主程式的時候並沒有定義count_1變數。
那如果我們不想要更改變數名稱的話,我們可以利用global來幫忙宣告function引用全域變數。下面是官方釋出的說明:

1.The global statement is a declaration which holds for the entire current code block. It means that the
2.listed identifiers are to be interpreted as globals. It would be impossible to assign to a global variable without global.

如果還是不想要換名字腫麼辦?

# var_2.py
count=1
def a():
	global count
	print('In funct') #檢查是否有calling function
	print(count)
    count=3
	return 
if __name__=='__main__':
	print('In main') #檢查是否有開始運作
    print(count) #檢查count(global variable)是否為1
	a()
	print(ㄏ)

I want it that way


我們來觀察一下結果:

>>>python var_2.py
In main
1
In funct
1
3

從執行結果看來,主程式啟動後有call function a(),並且有將function跑完。然而因為使用global宣告全域變數後,最後在主程式中最後一個print(count)因為在function中重新指定新的數值3給變數count,因此最後輸出結果也會變成3。

如果變數名稱相同時,小心使用才不會造成大失誤!

好啦~今天我們一樣有個練習,下面是一個program裡面是在計算Hank的期末成績,其中grade是他每一項的成績,而w是每一個成績的權重,另外因為上課期間Hank表現良好,可以獲得3分的bonus。然而佛到爆的林老師因為全班平均不到60,全班總平均再加bonus5分。請問Hank期末總成績為幾分?
下面這裡提供一個未完成的code,就麻煩大家一起來完成啦!

bonus=5 #全班總成績的bonus
from functools import reduce
def accum(grade,weight):
    bonus=3
    A=map(.....)
    .....
    .....
if __name__=='__main__':
    grade=[85,83,70,88,78]
    w=[0.05,0.2,0.3,0.35,0.1]
    .....

晚上看看美劇比較chill~
明天來講一下如果gobal variable是放在另外一個檔案的時候會發生什麼事情囉!


上一篇
[Day21]排序?index sort? lambda又有你的事了?
下一篇
[Day23]OMG!OMG! 跨檔案的global variable不受控!
系列文
從0開始學習程式-Python32

尚未有邦友留言

立即登入留言