python小白,關於函數問題
高洛峰
高洛峰 2017-06-12 09:26:03
0
4
949

第一段程式碼:

#
# -*- coding:gb2312 -*-
def get_wendu():
    wendu = 22
    print("您输入的温度是%d"%wendu)
    return wendu
def get_wendu_huashi():
    wendu = wendu + 3
    print("您输入的新温度是%d"%wendu)


print("------1-------")
wendu = get_wendu()
print("------2-------")
get_wendu_huashi()

第一段程式碼執行結果:

#第二段程式碼:

#
# -*- coding:gb2312 -*-
def get_wendu():
    wendu = 22
    print("您输入的温度是%d"%wendu)
    return wendu
def get_wendu_huashi():
    result = wendu + 3 #这里是对第一段代码的修正,把前面一个wendu改成了新的变量名称result
    print("您输入的新温度是%d"%result)


print("------1-------")
wendu = get_wendu()
print("------2-------")
get_wendu_huashi()

第二段程式碼執行結果:

#我有兩個問題:
第一個問題:
為什麼wendu = get_wendu()這句語句,執行出來的結果是:您輸入的溫度是22,這不只是一個賦值的語句麼?類似 wendu = 22,這樣一句賦值,不是不會印出來麼,為什麼wendu = get_wendu() 會印出結果,難道函數裡面的print語句,會在賦值的過程當中把這個東西印出來?
第二個問題:
為什麼第一段程式裡面wendu = wendu 3是錯誤的,換成result = wendu 3就能夠成功執行?是因為wendu = wendu 3這句話在執行的過程中,遇到print("您輸入的新溫度是%d"%wendu),系統無法分辨wendu到底是前面一個wendu還是後面一個wendu?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(4)
洪涛

你的第一個問題其實是不懂語句的執行,wendu = get_wendu()這一句,get_wendu()這是一個表達式,它會回傳一個值,這個值會被賦值給wendu這個變量,而get_wendu ()這個表達式是執行函數,它會依序執行你函數體定義的語句,你在裡面寫了print,它自然會執行print。

你的第二個問題其實不懂局部變數和全域變數的差別,print什麼的一點影響都沒有,只是因為變數引用不同導致的。
先說你這裡能夠運作的語句。

def get_wendu_huashi():
    result = wendu + 3

這裡面,wendu 這個變數沒有在函數內部宣告定義,但是可以直接用,實際上引用的是全域變數wendu,也就是wendu = get_wendu()這裡定義的變數。這也解釋了result為啥印製的結果是22+3

而你不能運作的語句

def get_wendu_huashi():
    wendu = wendu + 3
    print("您输入的新温度是%d"%wendu)

這裡實際上在函數內部作用域宣告了一個新變數 wendu,它尚未被定義,而後wendu+3裡的這個wendu變數就是引用了這個未定義的新變數,這自然而然的就造成了錯誤。

搞明白全域作用域和局部作用域就知道錯在哪裡了。

仅有的幸福
  1. get_wendu() 是函數調用,調用 get_wenduget_wendu 裡面 print("您輸入的溫度是%d"%wendu) 裡面 print("您輸入的溫度是%d"%wendu) 的值

  2. wendu = wendu + 3
  3. 是因為

    wendu 這個變數還未定義,你就在使用它,由錯誤訊息就可以看出來,UnboundLocalError: local variable 'wendu' referenced before boundLocalError: local variable 'wendu' referenced before' reference

阿神
  1. print("您輸入的溫度是%d"%wendu) 這句話不就是列印嗎

  2. python 預設會現在當前作用域尋找變量,由於在當前作用域沒有 wendu 這個變數自然也就報錯了。你可以在 wendu = wendu + 3 前加上一句 nonlocal wendu,這樣就可以正常運行了

仅有的幸福
  1. print()函數是向標準輸出列印,

        print("您输入的温度是%d"%wendu)
        # print会打印括号中的内容,%d表示格式化输出int类型,
        # 其实这句话和print(("您输入的温度是22")是等价的
  2. 報錯訊息是Local variable 'wendu' referenced before assignment,說的是wendu變數在呼叫前 沒有使用。相信你如果翻譯了這個Error訊息一定會驚呆了呢,命名在wendu = get_wendu()聲明了但是竟然說沒有,但是計算機也沒有你想的那麼低能= =,=是用來賦值的,它一定知道wendu是哪個wendu。
    原因對於函數內部變數賦值,Python會認為這個變數是局部變量,所以你的wendu此時是一個局部變數並不是global
    你可以嘗試這樣修改

    def get_wendu_huashi():
        global wendu
        wendu = wendu + 3
        print("您输入的新温度是%d"%wendu)
  3. 變數名稱不要用拼音,變數名稱不要用拼音,變數名稱不要用拼音。全域變數盡量少用,依照你的要求,選擇傳參會比較好。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板