--- title: Python Chapter 6 tags: Code description: Abs --- 第一題 --- 1.檢查密碼(ch6\ex1-檢查密碼.py) 自訂函式檢查密碼是否安全,若密碼只有數字或只有英文且長度小於6,就認為是「不安全的密碼」;若密碼只有數字或只有英文且長度大於6,就認為是「可能是安全的密碼」;若密碼由英文與數字所組成且長度小於6,就認為是「不安全的密碼」;若密碼由英文與數字所組成且長度大於等於6,就認為是「安全的密碼」;若密碼由英文與數字所組成且長度大於等於10,就認為是「非常安全的密碼」。程式執行結果如下。 第一組測試結果 請輸入密碼?123a 123a 為 不安全的密碼 第二組測試結果 請輸入密碼?a1d3d43e a1d3d43e 為 安全的密碼 <br> ```python def checkPassword(onlyWord,onlyNumber,length): if(onlyWord == True or onlyNumber ==True): ##如果全部字母or全部數字為真 if(length<6): print('不安全密碼') else: print('可能是安全的密碼') else: #如果字串英文數字都有 if(length>=10): print('非常安全的密碼') elif(length>=6): print('安全密碼') else: print('不安全密碼') password=input('input password:') length =len(password) ## len() 判斷 字串長度 --->密碼長度 onlyWord= password.isalpha() ## isAlpha 為判斷是否字串為字母組成 回傳 truefalse onlyNumber=password.isdigit() ## isdigit 為判斷是否字串為數字組成 checkPassword(onlyWord,onlyNumber,length) ## 呼叫function ``` --- 第二題 --- 2.印出m列n行個字元(ch6\ex2-印出m列n行個字元.py) 請定義一個函式允許輸入m的數值、n的數值與印出的字元,可以印出m列n行個字元。程式執行結果如下。 請輸入列數(m)?2 請輸入行數(n)?4 請輸入要顯示的字元?& &&&& &&&& 第三題 --- 3.排序(ch6\ex3-排序.py) 給定學生兩科成績與總分,請使用函式sorted與lambda函式,讓由tuple組成的成績串列依照總分由高到低排序,原始成績串列如下。 [('John', 60, 70, 130), ('Tony', 80, 80, 160),('Mary', 70, 85, 155), ('Tina', 75, 90, 165)] 程式執行結果如下。 [('Tina', 75, 90, 165), ('Tony', 80, 80, 160), ('Mary', 70, 85, 155), ('John', 60, 70, 130)] ### sorted(iterable, key=None, reverse=False) ### iterable -- 可重複對象。 ### key -- 主要是使用的元素,只有一個參數,具體函數的參數就是自取於可對像中,指定可進行觸及對像中的一個元素來比較示例。 ### reverse =False --->由小到大排序 ### reverse =True --->由大到小排序 ```python // in background script list1 =[('John',60,70,130),('Tony',80,80,160),('Mary',70,85,155),('Tina',75,909,165)] x = sorted(list1,key = lambda x:x[3],reverse=True) """ key = lambda x : x[3] 意義:令x這個list中,最外層的每個元素叫做x,然後將每個x指定一個比較值, 這個值來自於自己那個x裡面index=3的這一項作為比較標準。 例如:('John',60,70,130)的key就是被指定為 130,('Tony',80,80,160)的key就是被指定為160。 ## sorted tuple裡面[3]的元素總和進行由小到大的排序,但輸出要求大到小 所以 reverse=True 在反轉一次 reverse=False是指排序由小到大,而reverse=True是指排序由大到小。在sorting時,若沒有指定reverse,將是默認為False """ print(x) ``` --- 第四題 --- 4.N階乘產生器(ch6\ex4-N階乘產生器.py) 使用函式與指令yield製作出N階乘產生器。程式執行結果如下,輸入N值,例如:7。 請輸入N值?7 1 2 6 24 120 720 5040 ```python def fac(n): result = 1 for i in range(1,n+1): result *= i yield result ## yield 保存起來 等到 line8 print(i) 再回來繼續跑迴圈 n = int(input('請輸入N值?')) for i in fac(n): ## i接收每一次yield的回傳值 print(i) """ yield和return一樣都會回傳值並中斷在目前位置,但最大不同在於yield在下次迭代時會從上次迭代的下一行接續執行 流程 line 5(yield result) ----> line 7(i 收到 yield) ----->line 5 example output: 1 result = 1*1 yield result 2 result = 1*2 yield result 6 result = 2*3 yield result 24 result = 6*4 yield result 120 result = 24*5 yield """ ``` 第五題 --- 5.HTML標籤裝飾器(ch6\ex5-HTML標籤裝飾器.py) 請定義一個裝飾器函式,可以在文字的前後加上標籤<p>與標籤</p>。程式執行結果如下。 \<p>Hello,Claire\</p> ```python def HttpFormat(func): def wrapper(): print('<p>',end='') func() print('</p>') return func return wrapper @HttpFormat def printContent(): print(content,end='') content = input('') printContent() ''' @的功用 將 print() 丟進 Httpformat中 HttpFormat = HttpFormat(print()) 所以呼叫 printContent() 的同時 --->HttpFormat(printContent()) --->return wrapper ---> 執行wrapper ''' ``` --- 第六題 --- 6.加總(ch6\ex6-加總.py) 使用遞迴函式求解1+2+3+…+n的結果,遞迴關係如下。 ![](https://i.imgur.com/9V9EEJW.jpg) 程式執行結果如下。 請輸入n值?10 1+2+...+10為55 ```python def fun(n): #fun(5) if n ==1: ## 1的話即停止 return 1 return fun(n-1)+n #first---> fun(4)+5 ---> fun(3)+4+5 #---> fun(2)+3+4+5 ----> fun(1)+2+3+4+5 --->1+2+3+4+5 n = int(input('輸入n值:')) ## if n==5 print(fun(n)) ``` --- 組合(ch6\ex7-組合.py) 數學中求組合C(m,n),表示由m個不同物品求取n個的所有可能情形,與物品取出順序無關,有以下遞迴關係。 ![](https://i.imgur.com/LpcB3sV.jpg) ,其中m>=n 程式執行結果如下。 請輸入m值?10 請輸入n值?3 第七題 --- ```python def c(m,n): if n == 0 or m==n: return 1 return c(m-1,n)+c(m-1,n-1) m =int(input('m?:')) n =int(input('n?:')) """ 也可以用map 一次儲存兩個變數 m,n = map(int,input('input m,n (ex:3,5):').split(',')) """ print(c(m,n)) ``` --- ### 裝飾器 https://ithelp.ithome.com.tw/articles/10200763 ### lambda sort排序 https://ithelp.ithome.com.tw/articles/10218710 ### yield return 差別 https://ithelp.ithome.com.tw/articles/10258195