# 綜合應用 —— 名片管理系統
## 目標
綜合應用已經學習過的知識點:
* **變量**
* **流程控制**
* **函數**
* **模塊**
開發 **名片管理系統**
## 系統需求
* 1. 程序啟動,顯示名片管理系統歡迎界面,并顯示功能菜單
```
**************************************************
歡迎使用【名片管理系統】V1.0
1. 新建名片
2. 顯示全部
3. 查詢名片
0. 退出系統
**************************************************
```
* 2. 用戶用數字選擇不同的功能
* 3. 根據功能選擇,執行不同的功能
* 4. 用戶名片需要記錄用戶的 **姓名**、**電話**、**QQ**、**郵件**
* 5. 如果查詢到指定的名片,用戶可以選擇 **修改** 或者 **刪除** 名片
## 步驟
1. 框架搭建
2. 新增名片
3. 顯示所有名片
4. 查詢名片
5. 查詢成功后修改、刪除名片
6. 讓 Python 程序能夠直接運行
## 01. 框架搭建
**目標**
* 搭建名片管理系統 **框架結構**
1. **準備文件**,確定文件名,保證能夠 **在需要的位置** 編寫代碼
2. 編寫 **主運行循環**,實現基本的 **用戶輸入和判斷**
### 1.1 文件準備
1. 新建 `cards_main.py` 保存 **主程序功能代碼**
* 程序的入口
* 每一次啟動名片管理系統都通過 `main` 這個文件啟動
2. 新建 `cards_tools.py` 保存 **所有名片功能函數**
* 將對名片的 **新增**、**查詢**、**修改**、**刪除** 等功能封裝在不同的函數中
### 1.2 編寫主運行循環
* 在 `cards_main` 中添加一個 **無限循環**
```python
while True:
# TODO(小明) 顯示系統菜單
action = input("請選擇操作功能:")
print("您選擇的操作是:%s" % action)
# 根據用戶輸入決定后續的操作
if action in ["1", "2", "3"]:
pass
elif action == "0":
print("歡迎再次使用【名片管理系統】")
break
else:
print("輸入錯誤,請重新輸入")
```
#### 字符串判斷
```python
if action in ["1", "2", "3"]:
```
```python
if action == "1" or action == "2" or action == "3":
```
1. 使用 `in` 針對 **列表** 判斷,避免使用 `or` 拼接復雜的邏輯條件
2. 沒有使用 `int` 轉換用戶輸入,可以避免 **一旦用戶輸入的不是數字**,導致程序運行出錯
#### pass
* `pass` 就是一個空語句,不做任何事情,一般用做占位語句
* 是為了保持程序結構的完整性
#### 無限循環
* 在開發軟件時,如果 **不希望程序執行后** 立即退出
* 可以在程序中增加一個 **無限循環**
* **由用戶來決定** 退出程序的時機
#### TODO 注釋
* 在 `#` 后跟上 `TODO`,用于標記需要去做的工作
```python
# TODO(作者/郵件) 顯示系統菜單
```
### 1.3 在 `cards_tools` 中增加四個新函數
```python
def show_menu():
"""顯示菜單
"""
pass
def new_card():
"""新建名片
"""
print("-" * 50)
print("功能:新建名片")
def show_all():
"""顯示全部
"""
print("-" * 50)
print("功能:顯示全部")
def search_card():
"""搜索名片
"""
print("-" * 50)
print("功能:搜索名片")
```
### 1.4 導入模塊
* 在 `cards_main.py` 中使用 `import` 導入 `cards_tools` 模塊
```python
import cards_tools
```
* 修改 `while` 循環的代碼如下:
```python
import cards_tools
while True:
cards_tools.show_menu()
action = input("請選擇操作功能:")
print("您選擇的操作是:%s" % action)
# 根據用戶輸入決定后續的操作
if action in ["1", "2", "3"]:
if action == "1":
cards_tools.new_card()
elif action == "2":
cards_tools.show_all()
elif action == "3":
cards_tools.search_card()
elif action == "0":
print("歡迎再次使用【名片管理系統】")
break
else:
print("輸入錯誤,請重新輸入:")
```
> 至此:`cards_main` 中的所有代碼全部開發完畢!
### 1.5 完成 `show_menu` 函數
```python
def show_menu():
"""顯示菜單
"""
print("*" * 50)
print("歡迎使用【菜單管理系統】V1.0")
print("")
print("1. 新建名片")
print("2. 顯示全部")
print("3. 查詢名片")
print("")
print("0. 退出系統")
print("*" * 50)
```
## 02. 保存名片數據的結構
**程序就是用來處理數據的,而變量就是用來存儲數據的**
* 使用 **字典** 記錄 **每一張名片** 的詳細信息
* 使用 **列表** 統一記錄所有的 **名片字典**

### 定義名片列表變量
* 在 `cards_tools` 文件的頂部增加一個 **列表變量**
```python
# 所有名片記錄的列表
card_list = []
```
**注意**
1. **所有名片相關操作**,都需要使用這個列表,所以應該 **定義在程序的頂部**
2. **程序剛運行時,沒有數據**,所以是 **空列表**
## 03. 新增名片
### 3.1 功能分析
1. 提示用戶依次輸入名片信息
2. 將名片信息保存到一個字典
3. 將字典添加到名片列表
4. 提示名片添加完成
### 3.2 實現 new_card 方法
* 根據步驟實現代碼
```python
def new_card():
"""新建名片
"""
print("-" * 50)
print("功能:新建名片")
# 1. 提示用戶輸入名片信息
name = input("請輸入姓名:")
phone = input("請輸入電話:")
qq = input("請輸入 QQ 號碼:")
email = input("請輸入郵箱:")
# 2. 將用戶信息保存到一個字典
card_dict = {"name": name,
"phone": phone,
"qq": qq,
"email": email}
# 3. 將用戶字典添加到名片列表
card_list.append(card_dict)
print(card_list)
# 4. 提示添加成功信息
print("成功添加 %s 的名片" % card_dict["name"])
```
> 技巧:在 `PyCharm` 中,可以使用 `SHIFT + F6` 統一修改變量名
## 04. 顯示所有名片
### 4.1 功能分析
* 循環遍歷名片列表,順序顯示每一個字典的信息
### 4.2 基礎代碼實現
```python
def show_all():
"""顯示全部
"""
print("-" * 50)
print("功能:顯示全部")
for card_dict in card_list:
print(card_dict)
```
* 顯示效果不好!
### 4.3 增加標題和使用 `\t` 顯示
```python
def show_all():
"""顯示全部
"""
print("-" * 50)
print("功能:顯示全部")
# 打印表頭
for name in ["姓名", "電話", "QQ", "郵箱"]:
print(name, end="\t\t")
print("")
# 打印分隔線
print("=" * 50)
for card_dict in card_list:
print("%s\t\t%s\t\t%s\t\t%s" % (card_dict["name"],
card_dict["phone"],
card_dict["qq"],
card_dict["email"]))
```
### 4.4 增加沒有名片記錄判斷
```python
def show_all():
"""顯示全部
"""
print("-" * 50)
print("功能:顯示全部")
# 1. 判斷是否有名片記錄
if len(card_list) == 0:
print("提示:沒有任何名片記錄")
return
```
**注意**
* 在函數中使用 `return` 表示返回
* 如果在 `return` 后沒有跟任何內容,只是表示該函數執行到此就不再執行后續的代碼
## 05. 查詢名片
### 5.1 功能分析
1. 提示用戶要搜索的姓名
2. 根據用戶輸入的姓名遍歷列表
3. 搜索到指定的名片后,再執行后續的操作
### 5.2 代碼實現
* 查詢功能實現
```python
def search_card():
"""搜索名片
"""
print("-" * 50)
print("功能:搜索名片")
# 1. 提示要搜索的姓名
find_name = input("請輸入要搜索的姓名:")
# 2. 遍歷字典
for card_dict in card_list:
if card_dict["name"] == find_name:
print("姓名\t\t\t電話\t\t\tQQ\t\t\t郵箱")
print("-" * 40)
print("%s\t\t\t%s\t\t\t%s\t\t\t%s" % (
card_dict["name"],
card_dict["phone"],
card_dict["qq"],
card_dict["email"]))
print("-" * 40)
# TODO(小明) 針對找到的字典進行后續操作:修改/刪除
break
else:
print("沒有找到 %s" % find_name)
```
* 增加名片操作函數:**修改**/**刪除**/**返回主菜單**
```python
def deal_card(find_dict):
"""操作搜索到的名片字典
:param find_dict:找到的名片字典
"""
print(find_dict)
action_str = input("請選擇要執行的操作 "
"[1] 修改 [2] 刪除 [0] 返回上級菜單")
if action == "1":
print("修改")
elif action == "2":
print("刪除")
```
## 06. 修改和刪除
### 6.1 查詢成功后刪除名片
* 由于找到的字典記錄已經在列表中保存
* 要刪除名片記錄,只需要把列表中對應的字典刪除即可
```python
elif action == "2":
card_list.remove(find_dict)
print("刪除成功")
```
### 6.2 修改名片
* 由于找到的字典記錄已經在列表中保存
* 要修改名片記錄,只需要把列表中對應的字典中每一個鍵值對的數據修改即可
```python
if action == "1":
find_dict["name"] = input("請輸入姓名:")
find_dict["phone"] = input("請輸入電話:")
find_dict["qq"] = input("請輸入QQ:")
find_dict["email"] = input("請輸入郵件:")
print("%s 的名片修改成功" % find_dict["name"])
```
#### 修改名片細化
* **如果用戶在使用時,某些名片內容并不想修改**,應該如何做呢?—— 既然系統提供的 `input` 函數不能滿足需求,那么就新定義一個函數 `input_card_info` 對系統的 `input` 函數進行擴展
```python
def input_card_info(dict_value, tip_message):
"""輸入名片信息
:param dict_value: 字典原有值
:param tip_message: 輸入提示信息
:return: 如果輸入,返回輸入內容,否則返回字典原有值
"""
# 1. 提示用戶輸入內容
result_str = input(tip_message)
# 2. 針對用戶的輸入進行判斷,如果用戶輸入了內容,直接返回結果
if len(result_str) > 0:
return result_str
# 3. 如果用戶沒有輸入內容,返回 `字典中原有的值`
else:
return dict_value
```
## 07. LINUX 上的 `Shebang` 符號(`#!`)
* `#!`這個符號叫做 `Shebang` 或者 `Sha-bang`
* `Shebang` 通常在 `Unix` 系統腳本的中 **第一行開頭** 使用
* 指明 **執行這個腳本文件** 的 **解釋程序**
### 使用 Shebang 的步驟
* 1. 使用 `which` 查詢 `python3` 解釋器所在路徑
```bash
$ which python3
```
* 2. 修改要運行的 **主 python 文件**,在第一行增加以下內容
```python
#! /usr/bin/python3
```
* 3. 修改 **主 python 文件** 的文件權限,增加執行權限
```bash
$ chmod +x cards_main.py
```
* 4. 在需要時執行程序即可
```bash
./cards_main.py
```
- linux基礎
- 01_Python基礎課程安排
- 02_操作系統(科普章節)
- 03_操作系統的發展史(科普章節)
- 04_文件和目錄(理解)
- 05_Ubuntu圖形界面入門
- 06_常用Linux命令的基本使用
- 07_Linux終端命令格式
- 08_文件和目錄常用命令
- 09_遠程管理常用命令
- 10_用戶權限相關命令
- 11_系統信息相關命令
- 12_其他命令
- python基礎
- 01_認識 Python
- 02_第一個Python 程序
- 03_PyCharm的初始設置(知道)
- 04_多文件項目的演練
- 05_注釋
- 06_算數運算符
- 07_程序執行原理(科普)
- 08_變量的基本使用
- 09_變量的命名
- 10_判斷(if)語句
- 11_運算符
- 12_循環
- 13_函數基礎
- 14_高級變量類型
- 15_綜合應用——名片管理系統
- 16_變量進階(理解)
- 17_函數進階.md
- 面向對象
- 01_面向對象(OOP)基本概念
- 02_類和對象
- 03_面向對象基礎語法
- 04_面向對象封裝案例
- 05_面向對象封裝案例 II