---
# System prepended metadata

title: Python Chapter 6
tags: [Code]

---

---
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


