截止日期
實驗目標
- 學會定義函數,使用函數。學會導入在某個文件中定義的函數。
- input獲得值,然后通過eval或者int、float將其轉換為相應的類型。
- 學會使用列表:訪問列表、append、遍歷列表。
實驗內容
任務1:函數的定義與調用
#這里是函數的定義,calcArea是函數名,我們可以通過函數名進行調用。
def calcArea(r): #r是輸入參數,代表半徑
return 3.14*r*r #return, 將計算結果返回到調用的地方
#上面只是定義。定義的時候並沒有執行這段代碼。
#常見錯誤1:錯誤的輸入參數
calcArea(r)
#常見錯誤2:結果未輸出
calcArea(3)
#這里是函數的調用
x = calcArea(2) #調用函數,以2為入參,最后將返回結果賦值給x。但並沒有輸出。
print(x) #在控制台輸出x
print(calcArea(1)) #將調用函數calcArea(1)的返回值直接輸出
print(calcArea(3))
print(calcArea(5))
print(calcArea(7))
關鍵點:1.函數的定義與調用不一樣,2.函數名要取的有意義,3.入參到底應該放幾個參數。
作業1:
結合上述代碼,簡述使用函數的好處。
任務2:熟悉input,字符串與數值,print函數,eval函數
#第1步,字符串與數值的區別
a = 1 #數值
b = '1' #字符串,也可以a = "1"
print(a*5) #數值的乘法
print(b*5) #字符串的乘法
#第2步,使用input函數獲得控制台輸入的字符串
x = input("x=")
print(type(x)) #打印x的類型
print(x*3)
#第3步,int與float將字符串轉化為數值
y = int(input("y=")) #使用int函數將輸入值轉化為整型數值
print(type(y))
print(y*3) #常犯錯誤 print y*3
y = float(input('y=')) #使用float函數將輸入值轉化為帶小數點的數
print(type(y))
print(y*3)
#第4步,使用eval將字符串轉換成表達式進行運算
line = input("請輸入一個式子:") #比如輸入 3+5,那么line存儲了字符串'3+5'
#想要獲得'3+5'所代表的式子的具體值呢?注意:'3+5'只是一個字符串,不能計算
z = eval(line) #這里,把你輸入的'3+5'字符串變成一個式子,所以值等於?
print(eval('3')) #這里把字符串'3'轉化為式子3,所以值等於數值的3
t = 3
print(eval('t+2')) #這里把字符串't+2'轉化為式子t+2,前面t=3,所以該式子等於?
print(eval('temp+2')) #這里把字符串'temp+2'轉化為式子temp+2,然而前面並沒有定義temp,所以會發生什么情況?
任務3:列表的使用
變量只能存放一個值,比如a = 3
。如果需要存放多個值呢?比如,存放所有圓形的半徑。我們就需要列表,列表語法如下:
rList = [] #一個空的列表,里面沒有任何值
rList.append(3) #往列表中加入3這個元素
rList.append(2) #往列表中加入2這個元素
print(rList) #輸出rList中的所有值
print(len(rList)) #len函數求列表中元素的個數
for e in rList: #將rList中的所有值依次輸出。詳解:每次將rList中1個元素取出來放到e中,然后print(e)。
print(e)
3.1 通過input提示輸入圓的半徑,然后將值賦給r,然后調用求圓面積的函數,並輸出其值。
3.2 通過input提示輸入圓的半徑的表達式,然后將表達式的值賦給r
,然后調用求圓面積的函數,並輸出其值。注意:與1.1不同,即使輸入3+1.1
,也可以計算成功。
任務4:編寫圓形生成器程序(以文件的形式運行)
4.1 學會定義函數,求圓面積,對指定的r計算圓面積。 //輔導:函數定義與調用
4.2 通過input輸入圓半徑,然后調用4.1定義的函數。 //輔導:float函數或者eval
4.3 使用while循環,將5個r值放入一個列表rList
。 //輔導:列表[],append,while
4.4 對rList中的每個r調用4.1定義的函數計算其面積。 //輔導:遍歷列表,for e in rList:
4.5 使用turtle對rList中的每個r畫出相應的圓。
4.6 進階:讓這些圓依次從左到右排列,且相切。
課上完成4.1-4.3。有余力的同學請繼續完成4.4及以后。
作業2:
將以上代碼存成文件運行。然后手寫或者打印出來,為里面的每一行加注釋。
任務5:運行並閱讀溫度轉程序然后進行改寫
內容:
編寫一段程序可以將你從控制台輸入的溫度數值(帶溫度標志的)轉換成華氏或攝氏度。
IPO分析:
I:帶華氏或攝氏標志的溫度值
P:根據溫度標志選擇適當的溫度轉換算法
O:帶攝氏或華氏標志的溫度值
算法:
C=(F-32)/1.8
F=C*1.8+32
C表示攝氏溫度,F表示華氏溫度。
示例:
輸入:82F 輸出:27.78C
輸入:-30C 輸出:-22.00F
例程:
TempStr = input("請輸入帶有符號的溫度值: ")
if TempStr[-1] in ['F','f']:
C = (eval(TempStr[0:-1]) - 32)/1.8
print("轉換后的溫度是{:.2f}C".format(C))
elif TempStr[-1] in ['C','c']:
F = 1.8*eval(TempStr[0:-1]) + 32
print("轉換后的溫度是{:.2f}F".format(F))
else:
print("輸入格式錯誤")
在IDLE中新建文件TempConvert1.py,然后運行。
講解:
1.TempStr = input("請輸入帶有符號的溫度值" #在控制台顯示提示信息,然后將用戶從控制台輸入的信息作為字符串賦值給TempStr
2.TempStr[-1] #取TempStr字符串的最后一個字符
3.TempStr[0:-1] #截取除從第0個字符到最后一個字符(不包含最后一個)之間的所有字符。
4.eval(TempStr[0:-1]) #將TempStr[0:-1]字符串轉化為表達式運算,在這里指的是將字符串轉換為數值(轉化為數值后才能進行數學運算)。
任務(使用函數改造例程):
上面程序中,if..elif..else程序塊負責處理傳入的帶溫度標志的字符串並打印相應的提示信息,嘗試定義一個函數TempConvert(ValueStr)取代上面的if..elif..else程序塊。以后只需要調用TempConvert(ValueStr)函數,就可執行這段處理代碼:
def TempConvert(valueStr):
#及一下這里是你的代碼
if 輸入的的溫度是華氏:
#轉換代碼
return "轉換后的溫度是{:.2f}C".format(C)
#elif 輸入的溫度是攝氏度:
#轉換代碼
return "轉換后的溫度是{:.2f}F".format(F)
else:
return "輸入格式錯誤"
講解:
return ... 代表將...作為返回值返回給函數調用的地方。如,x = TempConvert(82F),執行完以后x的值就為“轉換后的溫度是27.78C”
作業4:
利用定義好TempConvert函數改造例程,使其看起來更簡潔。
將以上代碼存成文件運行。然后手寫或者打印出來,為里面的每一行加注釋。
進階2(函數模塊化改造):
編寫函數有一個原則:函數的功能要單一,不要設計多用途的函數。函數TempConvert既進行溫度轉換(P),又將該值與提示信息“轉換后的溫度是”相綁定(O),這就使得后續對溫度值的計算極不方便(比如后續希望比較溫度的大小,需要將隱藏在提示信息的溫度值抽取出來,如需要將“轉換后的溫度是27.78C”中的27.78C抽取出來,非常麻煩)。一般來說需將IPO相分離,P僅負責單純的計算工作。改造函數TempConvert,讓其只進行溫度轉換然后返回必要的值。如,對於輸入82F
返回27.78C
,對於輸入-30C
返回-22.00F
,對於輸入錯誤則返回ERR
,而無需返回格式化后的全部提示信息。利用改造好的TempConvert進一步改造例程。