当学完一些基础知识之后就可以试着做一个最简单的名片管理系统,起码一些知识是用的上的。
一:文件结构如图:
可以从文件结构看出来,card_tools.py这个文件是提供card_main.py实现功能的工具模块。那么我们这个名片管理系统实际上的需求大家都懂,无非是增删改查。
二:思路分析:
首先该名片管理系统只是一个简单的练习,目的只是为了梳理最基本的知识。大家可以想一下,那么此次做的这个练习就可以不用把数据写入文件之中,我们只需要实现一次运行程序的过程之中实现增删改查就OK,后续的爬虫里面会把这文件操作这部分也写进去。
那么我们在记录这个名片信息的时候要用什么样的数据结构去存呢?,首先,在python中能够存储不同类型数据,并且可以做到键与值一一对应的结构就是字典。那么这里存在一个问题,字典与字典之间又怎么进行串联。答案就是列表。这样,整个主体数据结构就分析出来了,要想存储名片信息,并且可以实现增删改查,应该用一个大列表,里面的元素是各个名片信息的字典。运行效果如下所示:
******************************
欢迎使用【名片管理系统V 1.0】
1. 新增名片
2. 显示全部
3. 搜索名片
0. 退出系统
******************************
请选择希望执行的操作:
当我们分别输入不同的数字之时,就会执行不同的操作。
三 :card_mains.py文件代码展示以及讲解:
import card_tools
while True:
card_tools.show_menu()
action_str=input("请选择希望执行的操作:")
print("您选择的操作是%s" %action_str)
if action_str in["1","2","3"]:
if action_str == '1':
card_tools.new_card()
elif action_str == '2':
card_tools.show_all()
elif action_str == '3':
card_tools.search_card()
elif action_str == '0':
break
else:
print("您输入的不正确,请重新选择")
print("您已退出程序")
从上述代码可以看出,主文件的代码很简单,这也是程序设计的本来初衷。那么现在由于是对于基础知识的梳理,所以并没有用到类的概念。所以目前还是在以一种面向过程的思想来解决问题。就是用无数的函数去解决问题。把解决一大类函数封装到一个文件内部,在Linux可以做成.so或.a的库以供调用。那么在这个小练习中,运用的就是这个思想,那么下面我们一行代码一行代码分析
1 ,首先import为导入包的操作,我们要保证路径的正确,才可以保证包被正确的导入,由于该文件结构为同目录下,所以不用添加上级目录
2,由于主界面要每次都显示在屏幕上,所以我们主体的框架搭建必然是个死循环,那么在python中跳出死循环的方式与C一样都是break。在python中获取输入参数的方法是input,这个方法的返回值是字符串,所以我们在底下循环判断时也要用判断字符串与字符串的相等关系。剩下的就是判断以及调用方法来实现功能了,没什么好说的,主要看card_tools.py文件。
四 card_tools.py代码讲解:
card_list = []
def show_menu():
"""显示菜单"""
print("*" * 30)
print("欢迎使用【名片管理系统V 1.0】")
print("1. 新增名片 ")
print("2. 显示全部 ")
print("3. 搜索名片")
print("0. 退出系统")
print("*" * 30)
def new_card():
"""新增名片"""
name_str = input("请输入姓名:")
phone_str = input("请输入电话:")
qq_str = input("请输入QQ:")
email_str = input("请输入邮箱:")
card_dict = {"name": name_str,
"phone": phone_str,
"qq": qq_str,
"email": email_str}
card_list.append(card_dict)
print(card_list)
print("添加 %s 的名片成功" % name_str)
def show_all():
"""显示所有名片"""
if len(card_list) == 0:
print("当前没有任何名片记录,请添加")
return
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"]))
def deal_card(find_dict):
print(find_dict)
action_str = input('请选择要执行的操作 '
'1'' 修改 '
'2 删除 '
'0 返回上级菜单')
if action_str == '1':
print("修改名片")
elif action_str == '2':
card_list.remove(find_dict)
def search_card():
"""搜索名片"""
print("搜索名片")
find_name = input("请输入要搜索的姓名:")
for card_dict in card_list:
if card_dict['name'] == find_name:
print("找到了")
deal_card(card_dict)
break
else:
print("抱歉,没有找到 %s" % (find_name))
函数 show_menu()
该函数功能便是输出主界面的显示信息,这里涉及到几个知识点。第一个就是*符号代表多重的意思,可以用它很方便的输出多个相同字符,亦或者列表变量,亦或者字符串。在python中print函数已经为我们做好了换行,就不用在跟着\n转义符。如果想连续输出。可以这么操作print("edefff",end = ""),end后面可以跟着你想要的。
函数 new_card()
该函数的功能为新增名片。通过上面的分析我们知道,我们主要的数据结构为一个列表里存储着信息字典。但是由于几个函数都要对列表进行操作。所以,我们把列表定义成全局变量。这里再引深一个知识点,在我们定义全局变量的时候,如果是字符串与普通数值类型的,我们会发现你是改变不了这个全局变量的值的。这里就和上上节说的可变类型和不可变类型的变量的区别了,那么我们如果修改不可变类型的全局变量,需要在变量前用global。该函数剩下的就没什么了。无非就是把输入的信息分别输入组成了字典添加到了列表里。
函数 show_all()
这个函数是输出当前所有字典信息,但是呢,我们这里对格式做了一定的优化,print()函数里面的\t转义符是使得每个元素都垂直输出。之后就是用for迭代器遍历列表中每个元素,再把字典里的值按键-值对应输出。