Python程序語言學習——實驗作業04——函數的應用


簡要記錄下本次實驗作業的內容和總結。(因為覺得在文章首部添加目錄沒多大意思,就刪了。)

實驗1 水仙花數

1. 題目描述

實驗1. 利用自定義函數求所有水仙花數,並用逗號隔開輸出。 所謂水仙花數是一個三位數,其每位上的數字的立方和等於其本身, 如153 = 1^3 + 5^3 + 3^3 故153是水仙花數。

2.代碼實現:

查看代碼
 def flowerNumer(n):
     n1 = sum(int(i) ** 3 for i in list(n))
     return n if (int(n) == n1) else 0
 ​
 ​
 if __name__ == '__main__':
     num_list = [str(i) for i in range(100, 1000) if flowerNumer(str(i))]
     print("所有的水仙花數有:" + ','.join(num_list))

實驗2 回文數

1. 題目描述

實驗2. 回文數判斷。 設n是一任意自然數,如果n的各位數字反向排列所得自然數與n相等,則n被稱為回文數。 從鍵盤輸入一個5位數字,請編寫程序判斷這個數是不是回文數。 如:123454321和9889就是回文數。

2.代碼實現:

查看代碼
 import sys
 ​
 ​
 def palindrome_num(n):
     # reversed()返回的是一個對象,需轉換成序列
     n1 = ''.join(reversed(n))
     s = "是回文數" if str(n) == n1 else "不是回文數"
     # n1 = list(reversed(n))
     # s = "是回文數" if list(n) == n1 else "不是回文數"
     # n1 = tuple(reversed(n))
     # s = "是回文數" if tuple(n)==n1 else "不是回文數"
     print(n + s)
 ​
 ​
 def isValid(msg):
     # 若輸入的不是整數或者不是5位數  # 輸出:“輸入不合法!”,並不返回任何值
     # 法二:
     # return 1 if msg.isnumeric() and len(msg) == 5 else "輸入不合法!"
     if msg.isnumeric() and len(msg) == 5:
         return 1
     else:  # 若輸入的不是整數或者不是5位數
         print("輸入不合法!")  # 輸出:“輸入不合法!”,並不返回任何值
 ​
 ​
 if __name__ == '__main__':
     while True:
         num = input("請輸入一個5位數:")
         if num == '0':
             sys.exit()
         if isValid(num) is None: # 若返回值為None,即輸入不合法,重新輸入
             continue
         else:  # 否則調用palindrome_num()判斷num是否是回文數
             palindrome_num(num)
         #  法二:
         # if isValid(num) == 1:
         #     palindrome_num(num)
         # else:
         #     print(isValid(num))
         #     continue

實驗3 三角形的判斷

1. 題目描述

實驗3. 三角形判斷。 編寫函數判斷輸入的3個數字是否能構成三角形的3條邊。

2.代碼實現:

查看代碼
import sys
 ​
 ​
 def isTriangle(num_t):
     a, b, c = num_t
     if ((a + b) > c) and ((a + c) > b) and ((b + c) > a):
         print("{},{},{} 可以構成一個三角形".format(a, b, c))
     else:
         print("{},{},{} 不可以構成一個三角形".format(a, b, c))
 ​
 ​
 def isValid(n):
     try:
         a, b, c = n.split()
         a = float(a)
         b = float(b)
         c = float(c)
         if a > 0 and b > 0 and c > 0:
             return a, b, c  # 以元組的形式返回三邊的值
         else:
             # 若a,b,c任意一個值小於零,不返回任何值
             print("輸入不合法!")
     except ValueError:
         # 若a,b,c任意一個值不是整數或小數,不返回任何值
         print("輸入不合法!")
 ​
 ​
 if __name__ == '__main__':
     while True:
         num = input("請輸入三個數,以空格分隔:")
         if num == '':
             # 當不輸入任何字符時,退出程序
             sys.exit('\n退出程序')
         if isValid(num) is None:
             # isValid()無返回值,即輸入不合法,繼續執行
             continue
         else:
             # 否則 將返回值傳入isTriangle()
             isTriangle(isValid(num))

實驗4 七段數碼管繪制

1. 題目描述

實驗4. 七段數碼管繪制:通過繪制七段數碼管理解使用函數及其封裝的價值。

2.代碼實現:

查看代碼
import time
 from turtle import *
 ​
 ​
 def drawGap():  # 繪制數碼管間隔
     penup()  # 提起筆移動,不繪制圖形,用於另起一個地方繪制
     fd(5)  # 向當前畫筆方向移動 5 像素長度
 ​
 ​
 def drawLine(draw):  # 繪制單段數碼管
     drawGap()  # 調用drawGap() ,繪制間隔
     # turtle.pendown() 移動時繪制圖形,缺省時也為繪制
     pendown() if draw else penup() # draw不為0繪制圖形,否則另起一個地方
     fd(40)  # 畫筆向當前方向繪制40像素長的線條
     drawGap()  # 調用drawGap(),繪制間隔
     right(90)  # 順時針移動90°
 ​
 ​
 def drawDigit(d):  # 根據數字規制七段數碼管
     drawLine(True) if d in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
     drawLine(True) if d in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
     drawLine(True) if d in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
     drawLine(True) if d in [0, 2, 6, 8] else drawLine(False)
     left(90)  # 逆時針移動90°
     drawLine(True) if d in [0, 4, 5, 6, 8, 9] else drawLine(False)
     drawLine(True) if d in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
     drawLine(True) if d in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
     left(180)  # 逆時針移動180°
     penup()  # 畫筆另起一個新的點
     fd(20)  # 沿當前方向移動20像素
 ​
 ​
 def drawDate(date):
     pencolor('light coral')  # 設置畫筆的顏色為淡珊瑚色,默認初始值為黑色
     for i in date:
         if not i.isnumeric():
             sety(-50)
             pencolor('wheat')
             if i == '-':
                 write('年', font = ('微軟雅黑', 24, 'normal'))
                 pencolor('lightblue')  # 設置畫筆的顏色為“lightblue”
                 fd(45)
             elif i == '=':
                 write('月', font = ('微軟雅黑', 24, 'normal'))
                 pencolor('lightpink')  # 設置畫筆的顏色為“lightpink”
             elif i == '+':
                 write('日', font = ('微軟雅黑', 24, 'normal'))
         else:
             drawDigit(eval(i))
         sety(0)
 ​
 ​
 if __name__ == '__main__':
     # 坐標位置(200,200)處繪制一個大小為 800*350像素的畫布
     setup(800, 350, 200, 200) 
     screensize(bg = 'lightyellow')
     penup()  # 開始繪制
     hideturtle()  # 繪制完日期,隱藏畫筆的turtle形狀
     speed('fastest')
     fd(-350)
     pensize(5)  # 定義畫筆的大小為 5
     # 使用strftime 方法將 gmtime() 獲取的當前的日期以“%Y-%m=%d+”的格式賦值給變量a
     a = time.strftime("%Y-%m=%d+", time.gmtime())
     drawDate(a)  # 調用自定義函數 drawDate()
     done()  # 必須是圖形繪制程序的最后一個語句

總結

1、自定義函數實現輸出所有水仙花數。

自定義函數floweNumber(),傳入參數為n,用sum()中嵌套元組生成式求各個位數上的數字立方和n1。當滿足原數n == n1時,返回n,否則返回0。

在主函數中,調用自定義函數floweNumber(),傳入參數i的范圍在[100,1000)內。若返回值不為0,將數字i添加到列表num_list中。最后用’,’jion(num_list)將所有水仙花數以英文逗號分隔輸出。

注意:傳入參數i需轉換成字符串,以便在floweNumber() 中可以使用sum()中嵌套元組生成式的方式逐個計算每位數的立方和,最后添加到列表時也需要將i轉換成字符串,因為join()的參數必須是Iterable的,數字不是Iterable的。

2、自定義函數實現回文數的判斷

因為需要輸入,所以自定義一個對輸入值合法的判斷的函數 isValid()。根據題目要求,必須是5位數的數字,那么輸入值不能是非整數,且長度為5。

定義一個用於判斷是否是回文數的函數palindrome_num(),用reversed()反轉傳入參數n,並賦值給新的變量n1。由於reversed()返回的是一個對象,需轉換成序列,我用join()將其轉換成字符串。然后比較str(n) == n1,若相等,字符型s = "是回文數",否則s = "不是回文數",最終輸出 n+s的結果。即傳入值是否是回文數。

在主函數中調用isValid()將輸入值num作為參數傳入,若滿足要求,即是5長度為5的整數,返回1,否則輸出“輸入不合法!”並且不返回任何值。若判斷調用isValid()的值若為None,結束當前循環,重新執行;否則調用自定義函數palindrome_num(),傳入num。

3、自定義函數實現判斷三個數是否能構成三角形三條邊

變量num獲取控制台輸入的三個數,以空格間隔。定義一個判斷輸入值合法的函數isValid(),num作為參數傳入,變量a,b,c分別對應輸入的三個數,並將三個數轉換成float類型,(input()獲取的是一個字符串)。判斷a,b,c是否都大於0,是則以元組形式返回三個數,否則輸出“輸入不合法!”並不返回值。在進行前面的操作時,可能會出現因為a,b,c任意一個值不是整數或小數,或者控制台輸入的數據不是3個的情況,需要獲取try: except獲取ValueError異常,輸出提示“輸入不合法!”並不返回任何值。

在主函數中,首先要對num進行判斷是否為空,若為空則退出程序。然后判斷調用isValid()函數的返回值是否為None,若是,即輸入不合法,終止本次循環,重新執行;否則調用isTriangle() 判斷是三個數否能構成三角形。如果輸入合法,isValid()返回的是三個數的元組,將返回值傳入isTriangle()中,再用變量a,b,c分別獲取元組中的三個數,判斷是否滿足任意兩個數之和都大於第三個數,並輸出相應的結論。

4、使用turtle模塊和time模塊實現七段數碼管繪制當前日期。

由於源碼是老師提供的,我對源碼稍微進行了一點個性化的修改。主要是對其中的一些函數方法進行了學習。接下來,我就在該功能中學習到的新的知識進行一個簡單的總結。

參考資料:Python繪圖Turtle庫詳解知行流浪的博客-CSDN博客python turtle

屬性 描述
turtle.setup(width = 0.5,height = 0.75[,startx = None,starty = None]) width,height為整數時,表示像素;為小數時,表示占據電腦屏幕的比例 (startx,starty)表示矩形窗口左上角頂點的位置,如果為空,則窗口位於屏幕中心。
turtle.penup() 提起筆移動,不繪制圖形,用於另起一個地方繪制
turtle.pendown() 移動時繪制圖形,缺省時也為繪制
turtle.hideturtle() 隱藏畫筆的turtle形狀
turtle.forward(distance) 向當前畫筆方向移動distance像素長度(或寫成fd)
turtle.backward(distance) 向當前畫筆相反方向移動distance像素長度
turtle.right(degree) 順時針移動degree°
turtle.left(degree) 逆時針移動degree°
turtle.sety() 將當前y軸移動到指定位置
turtle.write(s [,font=("font-name",font_size,"font_type")]) 寫文本,s為文本內容,font是字體的參數,font為可選項,font參數也是可選項 pencolor() 無參數傳入,返回當前畫筆顏色,傳入參數設置畫筆顏色,可以是字符串如"green", "red",也可以是RGB 3元組。
turtle.pensize(size) 設置畫筆大小為size個像素
turtle.speed(speed) 設置畫筆移動速度,在整數[0,10]內,值越大速度越快
turtle.mainloop() 或 turtle.done() 啟動事件循環 -調用Tkinter的mainloop函數。 必須是烏龜圖形程序中的最后一個語句。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM