今天真的是忙碌的一天,到現在才能把文章貼出來QQ
當我們在使用function時,最常遇到的就是變數問題!其實·在變數的操作上有分成全域變數(global variable)和區域變數(local variable)。
因此,在命名變數的時候最佳的狀況就是兩種的名字不要重複,然而,有時候因為習慣問題,不得不會將兩者變數命名相同,但有時為能在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(ㄏ)
我們來觀察一下結果:
>>>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是放在另外一個檔案的時候會發生什麼事情囉!