新たな気づき(Chapter 10-1)
- 関数の定義の章だけど、写経をしながら思いつきで幾つか拡張を加えてみたのが下のコード。数字を入力してもそれをいちいちコードで明示的に数字に変換するのが面倒なんだけど、どうにかならないのか…
from random import randint def dice(): num = randint(1,6) return num def dicegame(num): cnt_even=0 cnt_odd=0 cnt_total=1 try: num=int(num) except: print("普通整数を入力するだろ…どアホが…") return None for i in range(num): dice1 = dice() dice2 = dice() sum = dice1 + dice2 if sum%2 == 0: print(f"試行{cnt_total}回目:1投目は{dice1}で、2投目は{dice2}で、合計は{sum}で偶数") cnt_even+=1 cnt_total+=1 else: print(f"試行{cnt_total}回目:1投目は{dice1}で、2投目は{dice2}で、合計は{sum}で奇数") cnt_odd+=1 cnt_total+=1 print(f"試行回数{num}回中、偶数は{cnt_even}回、奇数は{cnt_odd}回になりました。") n=input("試行回数は?:") dicegame(n)
- 関数内で定義したローカル変数と同じ文字列を使った、関数外のグローバル変数は一致しない。
def calc(v,p): revenue = v*p print(v) return revenue print(calc(100,50)) print(v)
を実行すると以下のような結果になる。
100 #calc関数内のprint(v)が実行されたもの 5000 Traceback (most recent call last): File "20180211_local_global.py", line 7, in <module> print(v) NameError: name 'v' is not defined #関数の定義の外のグローバルではvは定義されてないのでエラーになる。
一方で、
v=10 p=50 def calc(): p=500 revenue = v*p return revenue print(calc()) #5000 print(v) #10
となるが、また一方で、
v=10 p=50 def calc(): v=100 p=500 revenue = v*p return revenue print(calc()) #50000 print(v) #10
となる。要するに、グローバルでしか定義のされてない変数はローカルにもそれが援用されるが、ローカルで定義されている場合はそれが優先される
- 別の話では、
v = 2 def calc(): v = v*110 ans = v * 10 print(ans) calc()
を実行すると、以下のエラーが出る。
Traceback (most recent call last): File "20180211_local_global2.py", line 6, in <module> calc() File "20180211_local_global2.py", line 3, in calc v=v*100 UnboundLocalError: local variable 'v' referenced before assignment
直訳のとおりで、ローカル変数vが宣言される前に使われてしまっていることがエラーの原因。以下は通る:
v = 2 def calc(): v_local = v*100 ans = v_local * 10 print(ans) calc()