- 框架搭建
- 新建main.py文件保存主程序代码:程序入口
- 新建tools.py文件所以功能函数:对名片的增删改查
TODO注释:用于标记需要去做的工作 # TODO(名字) 显示功能菜单
import card_toos
while True:
# TODO 显示功能菜单
card_toos.show_menu()
action_str=input("请选择操作:")
print("您选择的操作是【%s】" % action_str)
# 1,2,3针对名片操作
# 0退出程序
# 其他输入错误
if action_str in ["1", "2", "3"]:
if action_str ==1:
card_toos.new_card()
elif action_str == 2:
card_toos.show_all()
elif action_str ==3:
card_toos.search_card()
# 如果在开发时不希望编写分支内部,可以使用pass关键字,保证代码正确
elif action_str == 0:
print("欢迎再次使用")
break
# pass
else:
print("您输入错误,请重新选择")
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("新增名片")
def show_all():
"""显示全部"""
print("-" * 50)
print("显示全部")
def search_card():
"""搜索名片"""
print("-" * 50)
print("搜索名片")
- 保存名片的数据结构
- 使用字典记录每一张名片的详细信息
- 使用列表统一记录所有的名片字典
- 在tools文件顶部增加一个列表变量
- 新增名片
- pycharm技巧:统一修改变量名,鼠标右键选中refactor,rename,all
def new_card():
"""新增名片"""
print("-"*50)
print("新增名片")
name = input("请输入名字:")
phone = input("请输入电话:")
qq = input("请输入qq:")
email = input("请输入邮箱:")
#1.提示用户输入名片详细信息
card_dict = {"name": name,
"phone": phone,
"qq": qq,
"email": email}
#2.建立字典
card_list.append(card_dict)
print(card_list)
#3.将名片字典添加到列表中
print("添加%s的名片成功" % name)
#4.提示用户成功
- 显示全部
def show_all():
"""显示全部"""
print("-" * 50)
print("显示全部")
#判断是否存在名片记录
if len(card_list) == 0:
print("当前没有名片记录,请添加名片")
#可以返回一个函数的执行结果,下方代码不会执行,return后无内容返回调用函数位置
return
#打印表头
for name in ["姓名", "电话", "QQ", "邮箱"]:
print(name, end="\t\t")
#打印分割线
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 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\tQQ\t\t邮箱")
print("="*50)
print("%s\t\t%s\t\t%s\t\t%s" % (card_dict["name"],
card_dict["phone"],
card_dict["qq"],
card_dict["email"]))
break
else:
print("抱歉,没有找到%s" % find_name)
- 删除操作,修改操作
def deal_card(find_dict):
print(find_dict)
action_str = input("请选择操作 1 修改,2 删除,0 返回上级菜单")
if action_str == "1":
find_dict["name"] = input_card(find_dict["name"], "姓名:[回车不修改]")
find_dict["phone"] = input_card(find_dict["phone"], "电话:[回车不修改]")
find_dict["qq"] = input_card(find_dict["qq"], "QQ:[回车不修改]")
find_dict["email"] = input_card(find_dict["email"], "邮箱:[回车不修改]")
print("修改成功")
elif action_str == "2":
card_list.remove(find_dict)
print("删除成功")
def input_card(dict_value, tip_message):
#1. 提示用户输入内容
result = input(tip_message)
#2. 对输入判断,若输入内容,返回结果
if len(result) > 0:
return result
else:
return dict_value
#3. 若不输入内容,返回原值
- 全部代码
import card_toos
while True:
# TODO 显示功能菜单
card_toos.show_menu()
action_str=input("请选择操作:")
print("您选择的操作是【%s】" % action_str)
# 1,2,3针对名片操作
# 0退出程序
# 其他输入错误
if action_str in ["1", "2", "3"]:
if action_str ==1:
card_toos.new_card()
elif action_str == 2:
card_toos.show_all()
elif action_str ==3:
card_toos.search_card()
# 如果在开发时不希望编写分支内部,可以使用pass关键字,保证代码正确
elif action_str == 0:
print("欢迎再次使用")
break
# pass
else:
print("您输入错误,请重新选择")
#记录名片记录的列表
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("新增名片")
name = input("请输入名字:")
phone = input("请输入电话:")
qq = input("请输入qq:")
email = input("请输入邮箱:")
#1.提示用户输入名片详细信息
card_dict = {"name": name,
"phone": phone,
"qq": qq,
"email": email}
#2.建立字典
card_list.append(card_dict)
print(card_list)
#3.将名片字典添加到列表中
print("添加%s的名片成功" % name)
#4.提示用户成功
def show_all():
"""显示全部"""
print("-" * 50)
print("显示全部")
#判断是否存在名片记录
if len(card_list) == 0:
print("当前没有名片记录,请添加名片")
#可以返回一个函数的执行结果,下方代码不会执行,return后无内容返回调用函数位置
return
#打印表头
for name in ["姓名", "电话", "QQ", "邮箱"]:
print(name, end="\t\t")
#打印分割线
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 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\tQQ\t\t邮箱")
print("="*50)
print("%s\t\t%s\t\t%s\t\t%s" % (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):
print(find_dict)
action_str = input("请选择操作 1 修改,2 删除,0 返回上级菜单")
if action_str == "1":
find_dict["name"] = input_card(find_dict["name"], "姓名:[回车不修改]")
find_dict["phone"] = input_card(find_dict["phone"], "电话:[回车不修改]")
find_dict["qq"] = input_card(find_dict["qq"], "QQ:[回车不修改]")
find_dict["email"] = input_card(find_dict["email"], "邮箱:[回车不修改]")
print("修改成功")
elif action_str == "2":
card_list.remove(find_dict)
print("删除成功")
def input_card(dict_value, tip_message):
#1. 提示用户输入内容
result = input(tip_message)
#2. 对输入判断,若输入内容,返回结果
if len(result) > 0:
return result
else:
return dict_value
#3. 若不输入内容,返回原值
变量引用
- 变量和数据保存在内存
- 函数的参数传递和返回值靠引用传递
>>> a = 1 >>> id(a) 2692085776624 >>> b = a >>> id(b) 2692085776624 >>> a = 2 >>> id(a) 2692085776656 >>> id(b) 26920857766243. 函数的参数和返回值:实参/返回值靠引用传递
def test(num):
print("函数内部%d对应的地址%d" % (num, id(num)))
a = 10
id(a)
test(a)
#两个值相同
可变类型和不可变类型
-
不可变类型:数字类型:int,bool,complex,long(2,x)
字符串:str
元组:tuple
-
可变类型:数据能被修改
列表:list
字典:dict key只能使用不可变数据类型
- 局部变量是在函数内部定义的变量,只能在函数内部使用
- 全局变量是函数外定义的变量,所以函数内部都可以使用
- 局部变量在函数被调用时才被创建,执行结束后被回收
- 函数内部可以通过全局变量的引用获取全局变量,但是不允许直接修改全局变量的引用———使用赋值语句修改全局变量的值
- 在函数内部修改全局变量:global num
- 全局变量命名应增加g_/gl_前缀
- 利用元组返回多个结果
def measure():
temp =39
wetness = 50
return (temp,wetness)#小括号可省略
result = measure()
print(result)
print(result[0])#单独处理
gl_temp,gl_wet = result#使用多个变量一次接收,变量数与元素个数一致
交换两个变量值
- 使用临时变量:c = b
b = a
a = c
- 不使用临时变量:a = a+b
b = a - b
a = a - b
- 利用元组
a,b = (b,a)
函数参数进阶- 函数内部对参数赋值不会影响外部实参
- 参数为可变类型参数,在函数内部使用方法会影响外部实参
- +=本质上是调用extend方法#针对列表变量
- 缺省参数,定义函数时指定默认值
- 缺省参数注意事项
- 确保带有默认值的缺省参数在参数列表末尾
-
一个函数可以处理的参数个数不确定
-
有两种多值参数
- 参数名前加*,接受元组(习惯使用*args)
- 参数名前加两个*,接受字典(习惯使用**kwargs)
def demo(num,*nums,**person): print(num) print(nums) print(person) demo(1,2,3,4,5,name = "xiaoming",age = 18) 1 (2, 3, 4, 5) {'name': 'xiaoming', 'age': 18}
- 函数内部自己调用自己
- 可以调用其他函数,也可以调用本身
- 需要一个出口结束递归
def sum(num):
if num == 1:
return 1
temp = sum(num - 1)
return temp+num
result = sum(100)
print(result)
5050
面向对象的概念
面向过程
- 把某一个需求从头到尾一一实现
- 将功能独立的代码封装
- 最后完成的代码就是顺序调用不同函数
- 确定职责—要做的事情、方法
- 根据职责来确定不同对象,对象内部封装多个方法
- 让不同对象调用不同方法
- 类名:驼峰命名法:CapWords
- 每个单词首字母大写
- 单词与单词间没有下划线
- 属性和方法
class 类名 :
def 方法( self,参数列表):
pass
对象变量 = 类名()
class Cat:
def eat(self):
print("小猫爱吃鱼")
tom = Cat()
tom.eat()
print(tom)
ltom = Cat()
print(ltom)
tom.name = "Tom" #添加属性(不推荐)
小猫爱吃鱼
<__main__.Cat object at 0x0000028C3A5B37C0>
<__main__.Cat object at 0x0000028C3A5B3790>
class Cat:
def eat(self):
print("%s爱吃鱼" % self.name)
tom = Cat()
tom.name = "Tom"#添加属性
tom.eat()
print(tom)
ltom = Cat()
print(ltom)
Tom爱吃鱼
<__main__.Cat object at 0x0000018C54A77B80>
<__main__.Cat object at 0x0000018C54F03820>
class Cat:
def __init__(self): #在创建对象时会自动调用该方法
print("这是一个初始化方法")
def eat(self):
print("%s爱吃鱼" % self.name)
tom = Cat()
tom.name = "Tom"#添加属性
tom.eat()
print(tom)
ltom = Cat()
print(ltom)
这是一个初始化方法
Tom爱吃鱼
<__main__.Cat object at 0x000001FEDC403FA0>
这是一个初始化方法
<__main__.Cat object at 0x000001FEDC403E80>
- 在初始化方法中定义属性
class Cat:
def __init__(self):
print("这是一个初始化方法")
self.name = "tom"
def eat(self):
print("%s爱吃鱼" % self.name)
tom = Cat()
print(tom.name)
这是一个初始化方法
tom
class Cat:
def __init__(self, new_name): #使用参数初始化参数
print("这是一个初始化方法")
self.name = new_name
def eat(self):
print("%s爱吃鱼" % self.name)
tom = Cat("大懒猫")
print(tom.name)
- ——del——方法:在对象被销毁前使用del方法,一旦调用则结束生命周期
class Cat:
def __init__(self, new_name):
self.name = new_name
print("%s来了" % self.name)
def __del__(self):
print("我去了")
def eat(self):
print("%s爱吃鱼" % self.name)
tom = Cat("大懒猫")
print("*" * 50)
#所以代码执行完成才会自动清除全局变量,及tom变量
大懒猫来了
**************************************************
我去了
- ——str——方法:希望使用print输出对象变量时能够打印自定义内容,可以利用str内置方法。必须返回字符串
class Cat:
def __init__(self, new_name):
self.name = new_name
print("%s来了" % self.name)
def __del__(self):
print("我去了")
def eat(self):
print("%s爱吃鱼" % self.name)
def __str__(self):
return "我是小猫"
tom = Cat("大懒猫")
print(tom)



