前言
继续完善名片系统
名片系统的完善
一、增加分支,判断用户操作类型
1.1 显示添加 对名片的操作分为 1.修改 2.删除 0.返回上一级菜单
操作:
(注:这个函数是封装给上一个函数用的,原因是平时我们在开一程序中,如果一个函数的代码过多,会导致我们看的比较麻烦,所以可以通过封装多个函数来使用)
代码:
def deal_card(find_dict):
print(find_dict)
action_str = input("请选择要执行的操作 1 修改 2删除 0返回上级菜单")
if action_str == "1":
print("修改名片")
elif action_str == "2":
print("删除名片")
操作结果:
1.2 进一步对1. 添加 2. 修改 进行处理
下面是 修改名片的操作:
代码:
def deal_card(find_dict):
print(find_dict)
action_str = input("请选择要执行的操作 1 修改 2删除 0返回上级菜单")
if action_str == "1":
find_dict["name"] = input("姓名:")
find_dict["phone"] = input("电话:")
find_dict["qq"] = input("QQ:")
find_dict["email"] = input("邮箱:")
print("修改名片")
操作结果:
显示已经修改成功!
接下来是 删除名片的操作:
代码:
def deal_card(find_dict):
print(find_dict)
action_str = input("请选择要执行的操作 1 修改 2删除 0返回上级菜单")
if action_str == "1":
find_dict["name"] = input("姓名:")
find_dict["phone"] = input("电话:")
find_dict["qq"] = input("QQ:")
find_dict["email"] = input("邮箱:")
print("修改名片")
elif action_str == "2":
card_list.remove(find_dict)
print("删除名片成功!")
操作结果:
下面要做一下对 名片修改 的优化,之前做出来的,姓名,电话,等这些信息都要输一遍,才能都修改成功,所以用的时候就会很不方便
下面重新定义一个函数来解决这个问题:
定义新函数思路:
- 提示用户输入内容
- 针对用户的输入进行判断,如果用户输入了内容,直接返回结果
- 如果用户没有输入内容,则返回“字典中原有的值”
注:下面新定义的函数 input_card_info 使用来替换上面 input 的 所以要把之前的代码修改一下!
要改成变量
下面是新定义的函数:
代码:
def input_card_info(dict_value, tip_message):
# 1.提示用户输入内容
result_str = input(tip_message)
# 2.针对用户的输入进行判断,如果用户输入了内容,直接返回结果
if len(result_str) > 0:
return result_str
# 3.如果用户没有输入内容,则返回“字典中原有的值”
else:
return dict_value
下面是运行结果:
(注: 不需要修改的信息,按回车 可以直接跳过)
名片制作系统就已经完善了!
变量的进阶
目标
·变量的引用
·可变和不可变的类型
·局部变量和全局变量
一、变量的引用
·变量和数据都是保存在内存中的
·在Python中 函数的 参数传递 以及 返回值 都是靠 引用 传递的
引用的概念:
在Python 中
·变量 和 数据 是分开存储的
·数据 保存在内存中的一个位置
·变量 中保存着数据在内存中的地址
·变量 中 记录数据的地址 就叫做 引用
·使用 id() 函数可以查看变量中保存数据所在的内存地址
(注:如果变量已经被定义,当给一个变量赋值的时候,本质上是 修改了数据的引用)
· 变量 不再 对之前的数据引用
· 变量 改为 对新赋值的数据引用
(注: = 右边的数据,才是我们程序中要处理的数据)
下面用pycharm 做一个调用函数传递实参的引用测试:
代码:
def test(num):
print("在函数内部 %d 对应的内存地址是 %d" %(num, id(num)))
# 1.定义一个变量
a = 10
# 数据的地址本质就是一个数字,做一用%d
print("a 变量保存数据的内存地址是 %d" % id(a))
# 调用test函数
test(a)
下面是函数返回值传递引用的练习:
输出结果:
二、可变和不可变类型
·不可变类型,内存中的数据不允许被修改
- 数字类型 int, bool,float, complex,long(2.x)
- 字符串 str
- 元组 tuple
·可变类型,内存中的数据可以被修改:
- 列表 list
- 字典 dict
(注:字典的key 只能是有不可变类型的数据。 可变类型的数据变化是通过 方法 来实现的。)
三、局部变量和全局变量
· 局部变量 是在 函数内部定义的变量,只能在行数内部使用
·全局变量 是在 函数外部定义的变量(没有定义在某一个函数内),所有函数 内部 都是可以使用这个变量的
3.1局部变量 是在 函数内部 定义的变量,只能在函数内部使用
·函数执行结束后,函数内部的局部变量,会不系统回收
·不同的函数,可以定义相同的名字的局部变量,但是各用各的不会产生影响
局部变量的作用
·在函数内部使用,临时 保存 函数内部需要使用的数据
局部变量的生命周期
·所谓的生命周期 就是变量从被创建到被系统收回的过程
·局部变量 在 函数执行时才会被创建
·函数执行结束后 局部变量 被系统回收
·局部变量在生命周期内,可以用来存储 函数内部临时使用到的数据
3.2全局变量
· 全局变量 是在 函数外部定义 的变量,所有的函数内部都可以使用这个变量
(注:函数执行时,需要处理变量是会 首先查找 函数内部 是否存在指定名称的局部变量,如果没有,才会查找函数外部,如果两边都没有,程序会报错)
输出结果:
如果在函数中需要修改全局变量, 需要使用 global 进行声明:
输出结果:
总结
对于名片系统的制作,我还没有特别的熟练,还是在来来回回的多熟悉,只是点设计的挺多的,主要还是有一部分逻辑的问题的分析的不是特别透彻。还是要多多练习。