一:函数定义与调用
1、python提供了许多内置函数,比如:print( ) ,同时,也可以自行定义函数,称为用户自定义函数
2、关键字 def 定义一个函数,后面为函数标识符名称与括号,括号里面为传入参数与自变量,如果没有就空下,函数体以冒号开头,并且需要缩进,函数体的第一行可以选择性的使用函数说明文档,当函数体内容没有想好时,可以使用pass占位,保持结构完整性
3、函数名(参数) 实现函数的调用,如果没有需要传递的参数,那么括号为空
4、程序运行时,遇到定义函数会为该函数开辟内存空间,等到调用函数时,会将这个开辟的内存空间里面的全部代码调用出来并执行,所以函数必须先定义后调用,但函数的定义是没有先后顺序的
二:函数参数的传递与参数介绍
1、定义一个带参数的函数并为该函数传参
2、可更改(mutable)与不可更改(immutable)对象
只能改变引用指向,不能改变对象本身,称为不可变数据对象
可以改变引用指向,也可以改变对象本身的这种对象类型,称为可变数据对象
3、参数:必备参数、关键字参数、默认参数、不定长参数
①必备参数:必备参数需要按照正确的顺序传入函数,调用时的数量必须和声明时的数量一致,不然会出现语法错误
②关键字参数(命名参数):使用关键字参数允许函数调用时参数顺序与声明时不一致,关键字参数有确定传入的参数值
③默认参数(缺省参数):调用函数时,若默认参数的值没有传入,则被认为是默认值
④不定长参数: *args 和 **kwargs
*args用来存放所有未命名的变量参数,并将其组成元组;**kwargs会将带有变量名的参数组成字典
传入字典:
传入元组和字典:
三:return
1、调用一个函数,在执行定义函数的函数体时,遇到return就退出该 def 模块,并选择性的向调用方返回一个值,这个返回值由return后面的参数决定,如果return后面为空,那么返回值为None
2、return不一定非要出现在定义函数中,如果定义函数中没有return,却接收返回值,那么返回值为None
3、
四:变量作用域
1、一个程序的所有变量并不是在哪个位置都可以访问的,访问权限取决于这个变量是在哪里赋值的,变量的作用域决定了在哪一部分程序你可以访问哪些特定的变量名称,两种最基本的变量作用域:局部变量,全局变量
2、局部变量与全局变量:
①定义在函数内部的变量拥有一个局部作用域,这个变量称为局部变量,局部变量只能在其被声明的函数内部访问
②定义在函数外的变量拥有全局作用域,这个变量称为全局变量,全局变量一般定义在程序的最前面,可以在整个程序范围内访问
③当全局变量与局部变量同时存在时,优先使用局部变量, global 变量名 ,可以声明变量为全局变量
五:匿名函数
1、使用关键字 lambda 定义匿名函数, 格式为: lambda 参数:式子
2、lambda只是一个表达式,函数体比def 简单很多
3、lambda的主体是一个表达式,而不是一个代码块,仅仅能在lambda 表达式中封装有限的逻辑进去
4、lambda函数有自己的命名空间,且不能访问自有参数列表之外或是全局命名空间里的参数
5、lambda函数的语法只包含一个语句,存在返回值
六:递归
1、递归就是在调用一个函数时,直接或间接地调用了函数本身
2、python中并没有对递归进行优化,所以他的每一次调用都会基于上一次的调用进行,并且他设置了最大的递归数量,防止递归外溢
3、递归实例
4、递归的回溯与递推
七:函数嵌套使用
八:函数版名片管理系统:
# coding:utf-8
#提示给用户的菜单信息
print("="*50) #分割线
print("\t 名片管理系统 v2.0版本") #显示系统版本信息
print("="*50) #分割线
print("请输入序号选择相应操作:") #提示用户可执行的操作
print(" 1 : 添加名片") #选择1,可以添加名片
print(" 2 : 删除名片") #选择2,可以删除名片
print(" 3 : 修改名片") #选择3,可以修改名片
print(" 4 : 查询指定名片") #选择4,可以查询指定名片
print(" 5 : 查询全部名片") #选择5,可以查询全部名片
print(" 6 : 退出系统") #选择6,则退出系统
print("="*50) #分割线
pass_name="666"#账号
pass_word="777"#密码
new_pass_name = input("请输入安全账号:")
new_pass_word = input("请输入安全密码:")
i=0#定义个标志位
#调试用的列表
"""names = [
{"name": "杨老大", "age": 23, "addr": "公教楼", "tel": "156"},
{"name": "辛老大", "age": 23, "addr": "电气类", "tel": "158"},
{"name": "谢老大", "age": 22, "addr": "自习室", "tel": "133"},
{"name": "王老大", "age": 23, "addr": "图书馆", "tel": "187"}
]"""
names=[] #定义一个列表,用来储存数据
#定义一个储存名片信息的函数
def save_infos():
"""此函数将数据库names的名片信息传给card.txt保存"""
f = open("card.txt","w")
str_names = str(names) #将列表转成字符串
f.write(str_names) #向文件内写入名片信息
f.close()
#print("新名片已保存")
#定义一个读取名片信息的函数
def load_infos():
"""此函数用于读取card.txt的用户信息,并将用户信息传给数据库names"""
f = open("card.txt","r") #打开文件
content = eval(f.read()) #将读取到的字符串转成列表,并储存到content,,eval的面向对象不能为空
global names #声明全局变量
names=content #赋值
f.close()
#定义一个添加名片信息的函数
def add_card():
# 添加新的名片
while True: #死循环,当新添名片重名时,确保依旧停留在重新输入新名片信息的界面
print()
print()
print()
print("="*50)
print("\t\t 添加名片") #显示当前进行的操作
print("="*50)
print()
new_name = input("请输入姓名:") #获取新名片的 姓名
print()
#收集到用户输入的信息以后,拼接成想要存储的字典dict数据形式,即此时dict_info这个字典内存放的就是刚刚输入的名片信息
#遍历数据库列表信息,因为列表内存放的都是字典,所以第一次循环时,item就是字典1......
for item in names:
if new_name == item["name"]: #item["name"]此时就是:字典名[键]
#如果刚刚输入的姓名和names内已有名片的姓名相同 ,则进入该if语句
print()
print("该用户已存在,请重新添加") #提示用户名片已存在,要求重新输入
break
else: #如果刚刚输入的姓名和names内名片不同则
new_age = input("请输入年龄:") #获取新名片的 年龄
print()
new_addr = input("请输入地址:") #获取新名片的 地址
print()
new_tel = input("请输入电话:") #获取新名片的 电话
print()
dict_info = {"name": new_name, "age": new_age, "addr": new_addr, "tel": new_tel}
names.append(dict_info) #将刚刚输入的名片信息存到names中
save_infos() #更新数据库
print()
print("添加新名片[%s]成功!\n\n该名片信息为:%s"%(new_name,dict_info) ) #提示用户添加完成
break #添加完成,跳到操作菜单
#定义一个删除名片信息的函数
def del_card():
# 删除一个名片
print()
print()
print()
print("="*50)
print("\t\t 删除名片") #显示当前进行的操作
print("="*50)
print()
for item in names: #打印出所有名片
print("\n姓名: %s 年龄: %s 地址: %s 电话: %s"%(item["name"],item["age"],item["addr"],item["tel"]))
print()
else:
print()
print("以上为全部名片信息")
print()
del_name=input("请选择您要删除的名片:") #获取用户想要删除的名片信息
print()
sure_or_no = input("确定删除[%s]吗\t y/n"%(del_name)) #再次确认是否要删除
#if sur_or_no=="y":
#names.remove(names[del_name])
for item in names: #遍历
if (del_name == item["name"]) and (sure_or_no == "y"): #判断想要删除的名片是否存在,且用户是否决定删除
names.remove(item) #存在则删除
save_infos() #更新数据库
print()
print("名片[%s]已成功删除!"%del_name) #提示用户删除成功
break #跳出
else:
print()
print("删除失败,请重新尝试")#输入信息有误或名片并不存在,提示用户删除失败
#break #跳出
#定义一个修改名片信息的函数
def mod_card():
# 修改一个名片
print()
print()
print()
print("="*50)
print("\t\t 修改名片") #显示当前进行的操作
print("="*50)
print()
for item in names: #打印出所有名片
print("\n姓名: %s 年龄: %s 地址: %s 电话: %s"%(item["name"],item["age"],item["addr"],item["tel"]))
print()
mod_name=input("请选择您要修改的名片:") #获取想要修改的名片的信息
for item in names: #for循环遍历names
if mod_name == item["name"]:#判断是否存在该名片,存在则执行下面的if语句
break
else:
print()
print("您输入的信息有误!请重新尝试")#输入信息有误或名片并不存在,提示用户修改失败
#break
#names.index(item)
if mod_name == item["name"]:
after_mod_name = input("请输入该名片的新名字: ") #获取修改后名片的新名字
for items in names: #for循环遍历names
if after_mod_name == items["name"]:#判断是否重名,重名则退出
print()
print("该用户已存在,请重新输入")
break
else: #若不重名则修改新名片
after_mod_age = input("请输入该名片的新年龄: ") #获取修改后名片的新年龄
after_mod_addr = input("请输入该名片的新地址: ") #获取修改后名片的新地址
after_mod_tel = input("请输入该名片的新电话: ") #获取修改后名片的新电话
#item此时为想要修改的那个名字所对应的元素(字典),比如想要修改辛老大,那么此时item就是{"name": "辛老大", "age": 23, "addr": "电气类", "tel": "158"}
#names.index(item)获取这个元素(字典)在nams列表内的下标
#names[下标]获取列表内的某一个元素(字典)
#字典名[已存在的键]=new_value 修改已存在的键值对
names[names.index(item)]["name"]=after_mod_name #修改名片信息
names[names.index(item)]["age"]=after_mod_age #修改名片信息
names[names.index(item)]["addr"]=after_mod_addr #修改名片信息
names[names.index(item)]["tel"]=after_mod_tel #修改名片信息
save_infos() #更新数据库
print()
print()
print("名片修改成功,\n\n该名片的新信息为:姓名:%s 年龄:%s 地址:%s 电话:%s "%(after_mod_name,after_mod_age,after_mod_addr,after_mod_tel))
#提示用户名片已修改成功,并显示出修改后名片的信息
#break
#定义一个查询指定名片信息的函数
def cat_a_card():
# 查询指定名片
print()
print()
print()
print("="*50)
print("\t\t 查询指定名片") #显示当前进行的操作
print("="*50)
print()
name = input("请输入要查询的名片名字:")
for item in names:
if name == item["name"]: #打印名片信息
print()
print("\n姓名: %s 年龄: %s 地址: %s 电话: %s"%(item["name"],item["age"],item["addr"],item["tel"]))
break
else:
print()
print()
print("查无此人!")
#定义一个查询全部名片信息的函数
def cat_all_card():
# 查询全部名片
print()
print()
print()
print("="*50)
print("\t\t 查询所有名片") #显示当前进行的操作
print("="*50)
print()
num=len(names)
#print("现在有名片%s,\n共%s张"%(names,num))
for item in names: #打印出所有名片
print("\n姓名: %s 年龄: %s 地址: %s 电话: %s"%(item["name"],item["age"],item["addr"],item["tel"]))
print()
else:
print()
print("共%s张名片"%num) #显示名片数
def main():
global i
if (new_pass_name==pass_name)and(new_pass_word==pass_word)and (i==0):
while True:
# 获取用户所选择的菜单信息
print() #空格
print() #空格
load_infos() #调用函数,将已有名片信息上传给数据库
num = int(input("请选择您要进行的操作:")) #将收集到的信息转为int型 # 异常处理 try except
# 根据用户所选择的菜单信息执行相应的功能
if num == 1:
add_card()
elif num == 2:
del_card()
elif num == 3:
mod_card()
elif num == 4:
cat_a_card()
elif num == 5:
cat_all_card()
elif num == 6:
# 退出系统
i+=1
break
else:
print()
print("您输入的信息有误,请重新输入!")
else:
print()
print("账号密码错误,退出系统")
main() #调用函数