python小白,關(guān)于函數(shù)問題
問題描述
第一段代碼:
# -*- coding:gb2312 -*-def get_wendu(): wendu = 22 print('您輸入的溫度是%d'%wendu) return wendudef get_wendu_huashi(): wendu = wendu + 3 print('您輸入的新溫度是%d'%wendu)print('------1-------')wendu = get_wendu()print('------2-------')get_wendu_huashi()
第一段代碼執(zhí)行結(jié)果:
第二段代碼:
# -*- coding:gb2312 -*-def get_wendu(): wendu = 22 print('您輸入的溫度是%d'%wendu) return wendudef get_wendu_huashi(): result = wendu + 3 #這里是對第一段代碼的修正,把前面一個wendu改成了新的變量名稱result print('您輸入的新溫度是%d'%result)print('------1-------')wendu = get_wendu()print('------2-------')get_wendu_huashi()
第二段代碼執(zhí)行結(jié)果:
我有兩個問題:第一個問題:為什么wendu = get_wendu()這一句語句,執(zhí)行出來的結(jié)果是:您輸入的溫度是22,這不只是一個賦值的語句么? 類似 wendu = 22,這樣一句賦值,不是不會打印出來么,為什么wendu = get_wendu() 會打印出結(jié)果,難道函數(shù)里面的print語句,會在賦值的過程當(dāng)中把這個東西打印出來?第二個問題:為什么第一段代碼里面wendu = wendu + 3是錯誤的,換成result = wendu + 3就能夠成功執(zhí)行?是不是因為wendu = wendu + 3這句話在執(zhí)行的過程中,遇到print('您輸入的新溫度是%d'%wendu),系統(tǒng)無法分辨wendu到底是前面一個wendu還是后面一個wendu?
問題解答
回答1:你的第一個問題其實是不懂語句的執(zhí)行,wendu = get_wendu()這一句,get_wendu()這是一個表達(dá)式,它會返回一個值,這個值會被賦值給wendu這個變量,而get_wendu()這個表達(dá)式是執(zhí)行函數(shù),它會依次執(zhí)行你函數(shù)體定義的語句,你在里面寫了print,它自然會執(zhí)行print。
你的第二個問題其實是不懂局部變量和全局變量的區(qū)別,print什么的一點影響都沒有,只是因為變量引用不同導(dǎo)致的。先說你這里能夠運(yùn)行的語句。
def get_wendu_huashi(): result = wendu + 3
這里面,wendu 這個變量沒有在函數(shù)內(nèi)部聲明定義,但是可以直接用,實際上引用的是全局變量wendu,也就是wendu = get_wendu()這里定義的變量。這也解釋了result為啥打印的結(jié)果是22+3
而你不能運(yùn)行的語句
def get_wendu_huashi(): wendu = wendu + 3 print('您輸入的新溫度是%d'%wendu)
這里實際上在函數(shù)內(nèi)部作用域聲明了一個新變量 wendu,它尚未被定義,而后wendu+3里的這個wendu變量就是引用了這個未定義的新變量,這自然而然的就造成了錯誤。
搞明白全局作用域和局部作用域就知道錯在什么地方了。
回答2:get_wendu() 是一個函數(shù)調(diào)用,調(diào)用 get_wendu,get_wendu 里面 print('您輸入的溫度是%d'%wendu) 就是打印 wendu 這個局部變量的值
wendu = wendu + 3 是因為 wendu 這個變量還未定義,你就在使用它,由錯誤信息就可以看出來,UnboundLocalError: local variable ’wendu’ referenced before assignment
回答3:print('您輸入的溫度是%d'%wendu) 這句話不就是打印嗎
python 默認(rèn)會現(xiàn)在當(dāng)前作用域?qū)ふ易兞浚捎谠诋?dāng)前作用域沒有 wendu 這個變量自然也就報錯了。你可以在 wendu = wendu + 3 前加上一句 nonlocal wendu,這樣就可以正常運(yùn)行了
回答4:print()函數(shù)是向標(biāo)準(zhǔn)輸出打印,
print('您輸入的溫度是%d'%wendu) # print會打印括號中的內(nèi)容,%d表示格式化輸出int類型, # 其實這句話和print(('您輸入的溫度是22')是等價的
報錯信息是Local variable ’wendu’ referenced before assignment,說的是wendu變量在調(diào)用前 沒有使用。相信你如果翻譯了這個Error信息一定會驚呆了呢,命名在wendu = get_wendu()聲明了但是竟然說沒有,但是計算機(jī)也沒有你想的那么低能= =,=是用來賦值的,它一定知道wendu是哪個wendu。原因?qū)τ诤瘮?shù)內(nèi)部變量賦值,Python會認(rèn)為這個變量是局部變量,所以你的wendu此時是一個局部變量并不是global你可以嘗試這樣修改
def get_wendu_huashi(): global wendu wendu = wendu + 3 print('您輸入的新溫度是%d'%wendu)
變量名不要用拼音,變量名不要用拼音,變量名不要用拼音。全局變量盡量少用,按照你的要求,選擇傳參會更好。
相關(guān)文章:
1. python小白 想做一個能夠計算圓周率的代碼,不知道怎么寫2. python小白 問關(guān)于遞歸的問題3. 【python小白】 問關(guān)于property的順序問題4. python小白,問一個關(guān)于可變類型和不可變類型底層的問題5. 網(wǎng)頁爬蟲 - Python小白用Scrapy爬蟲返回的是空元素,請問各位大神哪里出了問題?6. python小白基礎(chǔ)問題 關(guān)于while循環(huán)7. python小白 遇到未知的錯誤8. python小白 自學(xué)看書遇到看不懂的地方9. python小白 關(guān)于類里面的方法獲取變量失敗的問題10. 【python小白】 問關(guān)于__new__方法的作用的問題
