Python 练习-名片管理小程序

 

 

Python基础知识的小综合练习。

我们的功能是需要解耦的,从开始就一直在强调这一点,所以我们的函数需要另外放到一个单独的文件里面,一般都是放到views文件里面,views叫做视图,一般术语叫做视图函数,用来进行各种逻辑判断的,需要一个功能的时候就去写一段逻辑代码块,都是存放到这里的,所谓的视图就是既视感,我们写到这里的都是可以执行然后看到功能的效果的,而功能和需求是随时会变动的,所以这里的函数都是根据需求随时满足的,

需要实现的功能:

而我们的tool文件夹则不一样,首先声明一下我们的tool文件夹[tool这个名字是自定义的,没有规律按照个人洗好即可,你要能够分辨出来它是干什么的就行]是python-package格式的,它创建好之后会有一个自带的init文件,里面是空的,我们自己在里面新建py文件就好,我们的封装好的函数都是放在那里面的,所谓的封装好的就是类似于模块一样的,那些功能是会被反复的调用的,所以我们为了节省代码,所以就把他们都单独拎出来了,写成函数,用的时候引用就好了.

  1.启动终端执行程序后,出现如下界面(新增,显示全部和查询)

 

金沙官网线上 1

我们来整理一下我们的django的一些语法,专用术语叫做模板语言:

 

我们都学了这几个模板语言

  2.通过相应的选项可以实现相应的功能

{# 这是注释 #}

金沙官网线上 2

 

 

{{这是放变量名}}

金沙官网线上 3

 

 

还有循环,我们的这个循环就类似于我们的for循环,不过他是有开始和结束的

  3.选择查找用户后,如果找到用户,提示用户进行修改或者删除操作

{% for i in p%}

金沙官网线上 4

{{forloop.counter}}  # 这里我们是要对循环的元素进行排序,

 

{{forloop.last}}

 

{{forloop.first}}

 

默认是从1开始的这样写就是从0开始了{{forloop.counter0}}

 

{{ i }}  # 这里的i如果是字典的话,我们的语法是支持使用{{i.name}}

主要知识点:

{% endfor %}

  1.分支结构,循环结构的使用

 

  2.主函数搭建框架,主要功能写在另一模块中

金沙官网线上 5

  3.每一个函数代码不宜太长,如果有子功能可以再封装成一个函数调用

 

  4.列表,字典变量的应用

 

  5.注释的技巧:函数添加文档注释,标记参数和返回值,以便阅读和调用时查看

 

         待完成的功能可以使用 #TODU 标注。

还有if判断:

主程序:

{%if student.cid == class.id%}

金沙官网线上 6金沙官网线上 7

  <option selected value="{{ class.id }}">{{ class.cname }}</option>

 1 #! /usr/bin/python3
 2 
 3 #导入card_tools模块
 4 import card_tools
 5 
 6 while True:
 7     #显示功能菜单
 8     card_tools.show_menu()
 9 
10     #获取用户输入内容
11     user_input = input("请选择您要进行的操作:")
12 
13     #判断用户输入内容
14     if user_input in ["1","2","3"]:
15         if user_input == "1":
16             card_tools.new_cards()
17         elif user_input == "2":
18             card_tools.show_all()
19         else:
20             card_tools.search_card()
21 
22     elif user_input == "0":
23 
24         break
25 
26     else:
27         print("您的操作有误0.0,请输入0-3的数字")
28 
29 
30     #

金沙官网线上,{%else%}

View Code

  <option value="{{ class.id }}">{{ class.cname }}</option>

导入的模块:

{%endif%}

金沙官网线上 8金沙官网线上 9

 

  1 def show_menu():
  2     """
  3     显示功能菜单函数
  4     """
  5     print()
  6     print("*"*50)
  7     print("欢迎来到名片管理系统-.-")
  8     print("-"*50)
  9     print("t[1] 新增名片")
 10     print("t[2] 显示全部")
 11     print("t[3] 查询名片")
 12     print("t[0] 退出系统")
 13     print("*"*50)
 14 
 15 
 16 def make_tab():
 17     """
 18     打印表头
 19     """
 20     print("="*50)
 21     print("姓名tt年龄tt电话tt邮箱")
 22     print("-"*50)
 23 
 24 # 创建列表用于保存键值对
 25 #不能放到函数里面,不然每次新建名片内容都被覆盖了
 26 card_list = []
 27 
 28 
 29 def new_cards():
 30     """
 31     定义一个新建名片的函数,获取到用户输入的内容后,放入一个键值对当中,然后把键值对放入一个列表中
 32     """
 33     # 获取用户输入内容并用键值对保存
 34     name =input("请输入姓名:")
 35     age = input("请输入年龄:")
 36     tel = input("请输入电话:")
 37     email = input("请输入邮箱:")
 38     user_dict = {"name":name,
 39                  "age":age,
 40                  "tel":tel,
 41                  "email":email}
 42 
 43     #把键值对放入列表中
 44     card_list.append(user_dict)
 45 
 46 
 47 def show_all():
 48 
 49     """
 50     定义一个显示全部内容的函数,如果列表有信息就遍历,没信息提示用户输入
 51 
 52     """
 53 
 54     if len(card_list)!=0:
 55 
 56         make_tab()
 57 
 58         # 遍历列表得到用户信息字典
 59         for user_dict in card_list:
 60 
 61              # 得到用户各项信息的值 (和表头对齐)
 62             # for key in ("name","age","tel","email"):
 63             #     print("%stt" % user_dict[key] ,end="")
 64             print("%stt" % user_dict["name"],end="")
 65             print("%stt" % user_dict["age"],end="")
 66             print("%st" % user_dict["tel"],end="")
 67             print("%st" % user_dict["email"],end="")
 68             print()
 69         print("="*50)
 70 
 71     else:
 72          print("当前没有任何信息,请添加新增名片")
 73 
 74 
 75 
 76 #查询名片
 77 def search_card():
 78     """
 79     遍历card_list得到用户键值对,再把键值对中的name的值与用户
 80     输入内容作比较,如果匹配到了则返回用户信息,如果没匹配到则
 81     提示用户没搜索到
 82     """
 83     find_name = input("请输入您要查找的姓名:")
 84 
 85     for key_value in card_list:
 86 
 87         if key_value["name"] == find_name:
 88             make_tab()
 89             # for key in ("name","age","tel","email"):
 90             #     print("%stt" % key_value[key] ,end="")
 91             print("%stt" % key_value["name"],end="")
 92             print("%stt" % key_value["age"],end="")
 93             print("%st" % key_value["tel"],end="")
 94             print("%st" % key_value["email"],end="")
 95             print()
 96             print("="*50)
 97 
 98              # 处理名片(修改或者删除)
 99 
100             deal_cards(key_value)
101             break
102 
103     else:
104         print("您所查找的名片不存在!")
105 
106 
107 
108 def deal_cards(key_value):
109     """
110     找到用户后,对名片进行修改或者删除操作
111     :key_value: 在查找函数中,查找到的用户信息字典
112     """
113     user_input_str = input("请选择您要进行的操作: [1]修改名片 [2]删除名片 [0]返回上一层")
114     if user_input_str == "1":
115         #修改名片
116         # key_value["name"]= input("姓名:")
117         # key_value["age"]= input("年龄:")
118         # key_value["email"]= input("邮箱:")
119         # key_value["tel"]= input("电话:")
120 
121         key_value["name"] = user_input_info(key_value["name"],input("姓名"))
122         key_value["age"] = user_input_info(key_value["age"],input("年龄"))
123         key_value["tel"] = user_input_info(key_value["tel"],input("电话"))
124         key_value["email"] = user_input_info(key_value["email"],input("邮箱"))
125         print("修改成功!")
126 
127     elif user_input_str == "2":
128         #删除名片
129         card_list.remove(key_value)
130         print("删除成功!")
131 
132 
133 def user_input_info(dict_value,input_value):
134     """
135     判断用户的输入的值,如果不是空则修改原值。否则返回原值
136     :param dict_value: 字典中原有的值
137     :param input_value: 用户输入的用于修改的值
138     :return: 修改后的值
139     """
140     if len(input_value) == 0:
141         return dict_value
142     else:
143         return input_value

我们使用django的时候需要连接数据库,在连接库的时候,我们需要传一些参数,然后这些参数,我们每次写函数的时候都会重复的去写它,这样的话反复去连接数据库的过程本身就是有极大的优化空间的,鉴于此,我们使用了面向对象编程,

View Code

 

 

下面是代码:

金沙官网线上 10金沙官网线上 11

import pymysql

DB_CONFIG = {
    "host": "localhost",
    "user": "root",
    "password": "123",
    "database": "book_list",
    "charset": "utf8"
}


# 指定单条语句
def update(sql, arg=None):
    # 取数据库里面学生表插入一条数据
    conn = pymysql.connect(
        host=DB_CONFIG["host"],
        user=DB_CONFIG['user'],
        password=DB_CONFIG['password'],
        database=DB_CONFIG['database'],
        charset=DB_CONFIG['charset'],
    )
    # 指定输出的结果类型是字典
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute(sql, arg)
    conn.commit()
    cursor.close()
    conn.close()


# 查询单个数据记录
def get_one(sql, arg=None):
    conn = pymysql.connect(
        host=DB_CONFIG["host"],
        user=DB_CONFIG["user"],
        password=DB_CONFIG["password"],
        database=DB_CONFIG["database"],
        charset=DB_CONFIG["charset"]
    )
    # 指定输出的结果是类型是字典
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute(sql, arg)
    ret = cursor.fetchone()
    cursor.close()
    conn.close()
    return ret


# 查询多条数据
def get_list(sql, arg=None):
    conn = pymysql.connect(
        host=DB_CONFIG["host"],
        user=DB_CONFIG["user"],
        password=DB_CONFIG["password"],
        database=DB_CONFIG["database"],
        charset=DB_CONFIG["charset"]
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute(sql)
    ret = cursor.fetchall()
    cursor.close()
    conn.close()
    return ret


def magic(data_o):
    tmp = {}
    for i in data_o:
        if i["id"] not in tmp:
                tmp[i["id"]] = {"id": i["id"], "tname": i["tname"], "cname": [i["cname"]],}
        else:  # 我们的这个else是要跟上面的if平级的,不能够写到for那一级,否则得到的结果会出问题,
            # 它就显示的都是单个的字母,而不是完整的单词
            tmp[i["id"]]["cname"].append(i["cname"])
    data = list(tmp.values())
    return data


def create(sql, arg=None):
    conn = pymysql.connect(
        host=DB_CONFIG["host"],
        user=DB_CONFIG["user"],
        password=DB_CONFIG["password"],
        database=DB_CONFIG["database"],
        charset=DB_CONFIG["charset"]
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.execute(sql, arg)
    the_id = cursor.lastrowid  # 这里的lastrowid是得到最后一个数据, 提交之后,获取刚插入的数据的ID
    conn.commit()
    cursor.close()
    conn.close()
    return the_id


# 批量执行单挑语句
def pl_modify(sql, arg=None):
    conn = pymysql.connect(
        host=DB_CONFIG["host"],
        user=DB_CONFIG["user"],
        password=DB_CONFIG["password"],
        database=DB_CONFIG["database"],
        charset=DB_CONFIG["charset"]
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    cursor.executemany(sql, arg)  # 这里我们需要执行多条操作,使用executemany来完成
    conn.commit()
    cursor.close()
    conn.close()


# 接下来我们使用比较高级一点的用法,面向对象去把相同的代码封装到一个类里面,
    # 然后把不同的方法作为类里面的函数去使用,可以节省代码


class DBHelper():

    def __init__(self):
        self.conn = None
        self.cursor = None
        self.connect()

    def connect(self):
        self.conn = pymysql.connect(
        host=DB_CONFIG["host"],
        user=DB_CONFIG["user"],
        password=DB_CONFIG["password"],
        database=DB_CONFIG["database"],
        charset=DB_CONFIG["charset"]
    )
        self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)

    # 指定单条语句
    def update(self, sql, arg=None):
        # 取到数据库里面的学生表插入一条新数据
        # 指定输出的结果类型是字典
        self.cursor.execute(sql, arg)
        self.conn.commit()

    # 批量执行单条语句
    def pl_modify(self, sql, arg=None):
        self.cursor.executemany(sql, arg)
        self.conn.commit()

    # 执行单条语句,同时获取最后插入的那条数据
    def create(self, sql, arg=None):
        self.cursor.execute(sql, arg)
        the_id = self.cursor.lastrowid
        self.conn.commit()
        return the_id

    # 查询单个数据
    def get_one(self, sql, arg=None):
        self.cursor.execute(sql, arg)
        ret = self.cursor.fetchone()
        return  ret

    # 查询多个数据
    def get_list(self, sql, arg=None):
        self.cursor.execute(sql, arg)
        ret = self.cursor.fetchall()
        return ret

    def close(self):
        self.cursor.close()
        self.conn.close()

    # 进入with语句自动执行,自动进入自动退出,我们使用with语法打开一个文件的时候是不需要另外关闭文件的,它本身自带关闭功能
    # with 就是一个类,它底层就是一个类,我们使用with的时候用它本身就可以实例化出来一个对象,我们使用with语法的时候,
    # as后面的就是我们的实例化的对象,这个对象是可以自定义的,我们首先是需要在这里定义enter和exit使用方法,才能使用with方法,
    # 否则就需要使用传统方法,在下面使用类来实例化一个对象
    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()

# db = DBHelper()

View Code

 

如下是我们的例子:我们把上面的类和类里面封装的函数方法都使用到了,

本文由金沙官网线上发布于编程,转载请注明出处:Python 练习-名片管理小程序

您可能还会对下面的文章感兴趣: