40のおっさんのPython学習記録

20年以上前、学部の必修のC言語が全く理解できずに同級生に放り投げ、その後コーディングから遠ざかったガチ文系のおっさんが、ふと思い立ってPythonに挑戦しています。

新たな気づき(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()