名片管理系统:
小知识点:
pass的使用、while true 与break的使用、
快速回到行首 shift + home ,行尾 end键
TODO注释:在#后面跟上TODO,用于标记需要去做的工作,TODO后面也可以跟上一个括号,记录详细信息
# TODO(tongwandou) 显示功能菜单
批量修改变量:选中某一个变量,右键/refactor/rename/第一项(或者shift + f6) 进行修改,完成后enter
如果一个()内部的字符串过长,影响操作,可以在字符串内部某处直接enter,变成两行。
1、
action_str = input("请选择希望执行的操作:") print("您选择的操作是【%s】" % action_str) # 1,2,3针对名片的操作 if action_str == [1, 2, 3]: pass # 0 退出系统 elif action_str == 0: # 如果在编写程序时,不希望立即编写分支内部的代码 # 可以使用pass关键字,表示一个占位符,能够保证程序的代码结构正确! pass # 其他内容输入错误,需要提示用户 else: print("您输入的不正确,请重新选择")
2、
# 无限循环,由用户主动决定什么时候退出循环! while True: # 显示功能菜单 action_str = input("请选择希望执行的操作:") print("您选择的操作是【%s】" % action_str) # 1,2,3针对名片的操作 if action_str in ["1", "2", "3"]: # 新增名片 if action_str == "1": pass # 显示全部 elif action_str == "2": pass # 查询名片 elif action_str == "3": pass # 0 退出系统 elif action_str == "0": print("欢迎再次使用【名片管理系统】") break # 如果在编写程序时,不希望立即编写分支内部的代码 # 可以使用pass关键字,表示一个占位符,能够保证程序的代码结构正确! # pass # 其他内容输入错误,需要提示用户 else: print("您输入的不正确,请重新选择")
名片管理系统完整版:
1、主程序:
import card_tools
# 无限循环,由用户主动决定什么时候退出循环!
while True:
# 显示功能菜单
card_tools.show_menu()
action_str = input("请选择希望执行的操作:")
print("您选择的操作是【%s】" % action_str)
# 1,2,3针对名片的操作
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_car()
# 0 退出系统
elif action_str == "0":
print("欢迎再次使用【名片管理系统】")
break
# 如果在编写程序时,不希望立即编写分支内部的代码
# 可以使用pass关键字,表示一个占位符,能够保证程序的代码结构正确!
# pass
# 其他内容输入错误,需要提示用户
else:
print("您输入的不正确,请重新选择")
2、调用函数:
# 记录所有的名片字典
card_list = []
def show_menu():
"""显示菜单"""
print("*" * 50)
print("欢迎使用【名片管理系统】v 1.0")
print("")
print("1.新增名片")
print("2.显示全部")
print("3.搜索名片")
print("")
print("0.退出系统")
print("*" * 50)
def new_card():
"""新增名片"""
print("-" * 50)
print("新增名片")
# 1.提示用户输入名片详细信息
name_str = input("请输入姓名:")
phone_str = input("请输入电话:")
qq_str = input("请输入QQ:")
email_str = input("请输入邮箱:")
# 2.使用用户信息建立一个名片字典
card_dict = {"name": name_str,
"phone": phone_str,
"qq": qq_str,
"email": email_str}
# 3.将名片字典添加到列表中
card_list.append(card_dict)
print(card_list)
# 4.提示用户添加成功
print("添加%s的名片成功!" % name_str)
def show_all():
"""显示所有名片"""
print("-" * 50)
print("显示所有名片")
# 判断是否有名片记录,如果没有,提示用户并且返回
if len(card_list) == 0:
print("当前没有任何的名片记录,请使用新增功能添加名片!")
# return 可以返回一个函数的执行结果
# 下方代码不会被执行
# 如果return后面没有任何的内容,表示会返回到调用函数的位置
# 并且不会返回任何结果
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\t\t" % (card_dict["name"],
card_dict["phone"],
card_dict["qq"],
card_dict["email"]))
def search_car():
"""搜索名片"""
print("-" * 50)
print("搜索名片")
# 1.提示用户输入需要搜索的姓名
find_name = input("请输入要搜索的姓名:")
# 2.遍历名片列表,查询要搜索的姓名,如果没有找到,需要提示用户
for card_dict in card_list:
if card_dict["name"] == find_name:
print("姓名\t\t电话\t\tQQ\t\t邮箱")
print("=" * 50)
print("%s\t\t%s\t\t%s\t\t%s\t\t" % (card_dict["name"],
card_dict["phone"],
card_dict["qq"],
card_dict["email"]))
# 针对找到的名片记录执行修改和删除的操作
deal_card(card_dict)
break
else:
print("抱歉,没有找到%s" % find_name)
def deal_card(find_dict):
"""处理查找到的名片
:param find_dict: 查找到的名片
"""
print(find_dict)
action_str = input("请选择要执行的操作 "
"1 修改 2 删除 "
"0 返回上级菜单")
if action_str == "1":
find_dict["name"] =input_card_info(find_dict["name"], "姓名:")
find_dict["phone"] =input_card_info(find_dict["phone"], "电话:")
find_dict["qq"] =input_card_info(find_dict["qq"], "QQ:")
find_dict["email"] =input_card_info(find_dict["email"], "邮箱:")
print("修改名片成功!")
elif action_str == "2":
card_list.remove(find_dict)
print("删除名片成功!")
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
语法:
变量:
不可变类型:
内存中不允许被修改:数字类型、字符串、元组
可变类型:
内存中数据可以被修改:列表、字典
局部变量:
在函数内部定义的变量,只能在函数内部使用,函数执行结束后,函数内部的局部变量,会被系统回收(开发中,不推荐使用全局变量----可变范围太大,导致程序不好维护)
不同函数可以定义相同名字的局部变量,并且彼此之间不会产生影响
全局变量:
函数外部定义的变量,所有函数内部都可以使用这个变量
注意:开发时,应该把模块中的所有全局变量定义在所有函数上方,就可以保证所有的函数都可以正常访问到每一个全局变量了
全局变量命名:
为避免局部变量与全局变量出现混淆,在定义全局变量时,在全局变量名前增加g_或者gl_的前缀。
代码结构:
import模块
全局变量
函数定义
执行代码
# 全局变量
num = 10
def demo1():
# 希望修改全局变量的值——使用global 声明一下变量即可
# global 关键字会告诉解释器后面的变量是一个全局变量
# 在使用赋值语句时,就不会创建局部变量
global num # 可以注释再运行
num = 99
print("demo1 ==> %d" % num)
def demo2():
print("demo2 ==> %d" % num)
demo1()
demo2()
怎么指定默认值(缺省参数):
注意:带有默认值的缺省参数必须放在参数列表末尾
def print_info(name, gender=True):
"""
:param name: 同学的姓名
:param gender:True 男生 False 女生
"""
gender_text = "男生"
if not gender:
gender_text = "女生"
print("%s是%s"% (name, gender_text))
# 假设班上男生居多
# 提示在缺省参数时,需要指定最常见的值作为默认值
print_info("老王")
print_info("小明")
print_info("小美", False)
多值参数:
有时定义一个函数能够处理参数个数是不确定的,这时就可以使用多值参数
py中有两种多值参数:
1、参数名前加一个 * 可以接受元组
2、参数名前增加两个 * 可以接受字典
习惯:
*args 存放元组参数
**kwargs 存放字典参数
def demo(num, *nums, **person):
print(num)
print(nums)
print(person)
# demo(1)
demo(1, 2, 3, 4, name="小明", age="18")
使用元组求和:
def sum_numbers(*args):
num = 0
print(args)
# 循环遍历
for n in args:
num += n
return num
result = sum_numbers(1, 2, 3, 4, 5)
print(result)
元组与字典拆包:
在元组变量前,增加一个 *
在字典变量前增加两个*
def demo(*args, **kwargs):
print(args)
print(kwargs)
# 元组变量/字典变量
gl_nums = (1, 2, 3)
gl_dict = {"name": "小明", "age": 18}
# demo(gl_nums, gl_dict)
demo(*gl_nums, **gl_dict) # 使用拆包语法
demo(1, 2, 3, name="小明", age=18) # 不使用拆包语法
递归函数:
函数自己调用自己(递归),
必须有递归出口,否则出现死循环
def sum_numbers(num):
print(num)
# 递归出口,当参数满足某个条件时,不在执行函数
if num == 1:
return
# 函数自己调用自己
sum_numbers(num- 1)
sum_numbers(3)
递归求和:
# 定义一个函数 sum_numbers
# 能够接收一个num的整数参数
# 计算1+2+3...num的结果
def sum_numbers(num):
# 1.出口
if num == 1:
return 1
# 2.数字累加num +(1...num -1)
# 假设sum_numbers能够正确处理1...num -1
temp = sum_numbers(num - 1)
return num + temp
result = sum_numbers(3)
print(result)