---
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的結果,遞迴關係如下。

程式執行結果如下。
請輸入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個的所有可能情形,與物品取出順序無關,有以下遞迴關係。

,其中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