第十四天 |
学习目标4个:
应用:学员管理系统
递归
lanbda表达式
高阶函数
一、应用:学员管理系统
1.1系统简介
需求:进入系统显示系统功能界面,六个
1.2步骤分析
1.3按步骤实现需求
1.3.1显示功能界面
# 定义功能界面函数
def info_print():
print('请选择功能---')
print('1、添加学员')
print('2、删除学员')
print('3、修改学员')
print('4、查询学员')
print('5、显示所有学员')
print('6、退出')
print('-'*20)
# 1、显示功能界面
info_print()
1.3.2用户输入功能序号
# 2、用户输入功能序号
user_name = int(input('请输入功能序号'))
1.3.3按照用户输入的功能序号,执行不同的功能(函数)
使用多重判断,采用while进行循环使用
# 系统功能需要循环使用,直到输入6,才退出系统
while True:
# 1、显示功能界面
info_print()
# 2、用户输入功能序号
user_name = int(input('请输入功能序号'))
# 3、按照用户输入的功能序号,执行不同的功能(函数)
# 使用多重判断
if user_name == 1:
print('添加')
elif user_name == 2:
print('删除')
elif user_name == 3:
print('修改')
elif user_name == 4:
print('查询')
elif user_name == 5:
print('显示所有')
elif user_name == 6:
print('退出系统')
else:
print('输入错误,请重新输入')
1.3.4优化代码
增加若用户输入的数据不是6,该如何提示;以及输入6的时候,如何退出循环
1、增加else,来提示不是输入1-6
2、退出循环,使用break
elif user_name == 6:
print('退出系统')
break # break退出,不再执行循环了!!
else:
print('请重新输入')
1.3.5定义不同功能的函数
1、明确学员信息:姓名、年龄、手机号、性别
2、学员信息最好用字典存储,因为键值对,一对对的
3、存储所有学员信息,用类别info = [{:},{:},{:}]
4、删除、添加等操作都需要在列表里面进行,所以列表变量为全局变量,因为所以函数共用这个变量
1.3.5.1添加学员
1、若不存在,准备空字典去接收,字典新增数据,列表追加数据
2、判断学员是否存在于列表中,采用循环遍历列表,用input的值和原有的列表中该学员的字典的姓名信息作对比,采取下标,若是存在,报错,以及return立即退出当前add_info()函数
3、若是已经存在,则不执行下面的输入手机号
# 空列表:等待存储所有学员的信息
info = []
# 添加学员信息的函数
def add_info():
# 1、用户输入信息
new_id = input('请输入学号:')
new_name = input('请输入姓名:')
global info # 定义为全局变量
for i in info:
if new_name == i['name']:
print('此用户已添加')
return # 退出当前函数,即添加函数add_info()
new_tel= input('请输入手机号:')
# 2、判断是否添加这个学员,若有报错,若无,添加
# 2.1如果学员不存在,直接添加数据,准备空字典,字典新增数据,列表追加字典
info_dict = {}
info_dict['id'] = new_id
info_dict['name']=new_name
info_dict['tel']=new_tel
# print(info_dict) # {'id': '11', 'name': '111', 'tel': '1111'}
info.append(info_dict)
print(info) # [{'id': '11', 'name': '111', 'tel': '1111'}]
# [{'id': '11', 'name': '111', 'tel': '1111'}, {'id': '2', 'name': '22', 'tel': '222'}]
# 系统功能需要循环使用,直到输入6,才退出系统
while True:
# 1、显示功能界面
info_print()
# 2、用户输入功能序号
user_name = int(input('请输入功能序号'))
1.3.5.2删除学员
# 删除学员
def del_info():
# 输入要删除学员的姓名
del_name = input('请输入要删除的学员的姓名:')
global info
# 若存在于列表中,则删除,否则提示不存在
for i in info:
if del_name == i['name']:
info.remove(i)
break
else:
print('该学员不存在')
print(info)
1.3.5.3修改学员
info = []
def modify_info():
modify_name = input('输入你要修改的姓名:')
global info
for i in info:
if modify_name == i['name']:
i['name'] = input('请输入新的姓名')
break
else:
print('没有您想修改的学员信息')
# 总结:修改信息,下标
1.3.5.4查询学员
info = []
def find_info():
find_name = input('请输入你要查询的姓名:')
global info
# 遍历列表
for i in info:
if find_name == i['name']:
print(find_name)
break
else:
print('没有你要查询的学员信息')
1.3.5.5显示学员信息
def bianli_info():
global info
for i in info:
print(i)
bianli_info()
整体代码书写
见链接!https://blog.csdn.net/pick_ears/article/details/110007246
二、递归
2.1递归的应用场景
2.1.1递归的特点
函数内部自己调用自己
必须有出口,否则会有死循环
注意:递归一般和函数配合使用!!!!
2.2递归的应用
def num_numbers(num):
# 2、如果是1,返回1--出口
if num == 1:
return 1
# 1、如果不是1,重复执行累加并返回结果
return num + num_numbers(num-1)
result = num_numbers(int(input('请输入想要累加的值:')))
print(result)
运行结果:
请输入想要累加的值:3
6
三、lambda表达式(又叫匿名函数)
3.1lambda的应用场景
简化代码量,一个函数只有一个返回值,只有一句代码,节省程序员时间,节省机器开销
3.2lambda的语法+快速体验
lambda 参数列表:表达式
举例:fn = lambda:表达式
print(fn())
注意:
1、lambda表达式的参数可有可无,函数的参数在lambda表达式中完全适用
2、lambda表达式能接受任何数量的参数,但只能返回一个表达式的值
体验写法以及快速性
# 2、lambda 表达式(又叫匿名函数)
fn2 = lambda: 100
# print(fn2) # 打印出lambda的内存地址,<function <lambda> at 0x00000217131C2E18>
# 打印函数调用,打印出返回值
print(fn2()) # 100
3.3lambda的案例
lambda极度化简代码,而且参数的写法一样,逗号隔开,该传参的地方传参,该定义函数的地方定义。
# 函数
def add(a,b):
return a + b
result = add(1,2)
print(result)
# lambda
result1 = lambda a,b:a+b
print(result1(1,2))
3.4lambda的参数形式5种
1、无参数
2、一个参数
3、(缺省参数),有默认参数
4、可变参数*args,接收不定长的位置参数,返回值为元组
5、可变参数**kwargs,接收不定长的关键字参数,返回值为字典
3.4.1无参数
# 1、无参数
fn1 = lambda :100
print(fn1())
3.4.2一个参数
# 有参数,函数调用时候传入真实数据
# 2、一个参数
fn2 = lambda a:a*2
print(fn2('hello')) # hellohello
3.4.3默认参数(缺省参数)
# 3、默认参数(缺省参数)
fn3 = lambda a,b,c=100:a+b+c
print(fn3(1,2)) # 103
3.4.4可变参数,*args
不定长,可变参数,*args
# 4、可变参数,*args
fn4 = lambda *args :args
print(fn4(1,2,3)) # (1, 2, 3)
3.4.5可变参数,**kwargs
不定长可变参数,**kwargs
# 4、可变参数,**kwargs
fn4 = lambda **kwargs :kwargs
print(fn4(name='python')) # {'name': 'python'}
print(fn4(name='python',age=30)) # {'name': 'python', 'age': 30}
若是表达式改为123,输出123
fn4 = lambda **kwargs :123
print(fn4(name='python')) # 123
3.5lambda的应用(目标)
3.5.1带判断的lambda
带判断,三步运算或三元运算,读与写都从for开始,条件成立是if前面的,不成立是if后面的
举例:比较大小
fn1 = lambda a,b:a if a >= b else b
print(fn1(1,3)) # 3
print(fn1(2,1)) # 2
3.5.2列表数据按字典key的值排序
1、列表数据本身不能排序?可以的,列表名.sort(reverse=True)降序,默认False是升序
2、帮助列表中的字典数据进行排序!使用key=lambda 排列目标:字典的参数的返回值
stu = [1,10,2,3,4]
stu.sort()
print(stu)
stu1 = [{'name':'Tom','age':20},{'name':'Rose','age':22}]
stu1.sort(key=lambda x:x['age']) # 默认升序, [{'name': 'Tom', 'age': 20}, {'name': 'Rose', 'age': 22}]
# stu1.sort(key=lambda x:x['age'],reverse=True) # True降序,[{'name': 'Rose', 'age': 22}, {'name': 'Tom', 'age': 20}]
print(stu1)
四、高阶函数
4.1高阶函数的概念
高阶函数?把函数作为函数传递,这样的函数是高阶函数
作用:化简代码,增加函数的灵活性
4.2通过python两个内置函数体验高阶函数
1、abs()函数可以完成对数字求绝对值计算
2、round()函数可以完成对数字的四舍五入的计算
print(abs(0)) # 0
print(abs(-1)) # 1
print(round(1.4)) # 1
print(round(-2.7)) # -3
4.3高阶函数使用1
函数调用,传递实参的位置,加上函数的名,在函数定义的形参位置,加上一个形参f,代表函数,然后函数定义里面,使用相关的代码即可。
def sum_num(a,b,f):
return f(a)+f(b)
# result = sum_num(-1,2,abs) # 3
result = sum_num(1.1,2.8,round) # 4
print(result)
4.4内置高阶函数(学3个常用)
1、map()
语法:map(func,lst)
作用:将传入的函数变量func作用到lst变量的每一个元素中,并将结果组成的迭代器返回
2、reduce()
语法:reduce(func,lst)(必须呀有两个参数)(因为每一次func的计算结果要和序列的下一个元素累加计算)
作用:将传入的函数变量func作用到lst变量的每一个元素中
3、filter()
语法:map(func,lst)
作用:过滤序列,返回一个filter对象,使用list()转换成列表
4.4.1 map()传递一个参数时使用
语法:map(func,lst)
作用:将传入的函数变量func作用到lst变量的每一个元素中,并将结果组成的迭代器返回
# 1、map()
list1 = [1,2,3,4,5]
def func(x):
return x**2
result = map(func,list1)
print(list(result)) # [1, 4, 9, 16, 25]
4.4.2 reduce()传递两个参数时使用
语法:reduce(func,lst)(必须呀有两个参数)(因为每一次func的计算结果要和序列的下一个元素累加计算)
作用:将传入的函数变量func作用到lst变量的每一个元素中
# 2、reduce()
import functools
list2 = [1,2,3,4,5]
def func(a,b):
return a + b
result = functools.reduce(func,list2)
print(result) # 15
4.4.3 filter()过滤参数使用
语法:map(func,lst)
作用:过滤序列,返回一个filter对象,使用list()转换成列表
# 3、filter做累加计算
# 过滤不是2的倍数
list3 = [1,2,3,4,5,6,7,8,9,10]
def func(x):
return x % 2 == 0
result = filter(func,list3)
print(result) # <filter object at 0x00000166F333A278>
print(list(result)) # [2, 4, 6, 8, 10]
五、总结
学员管理系统
根据不同的功能,定义不同的函数,灵活使用序列的增删查改,确定大框架,注意细节!
递归
函数内部自己调用自己
必须有出口,否则会有死循环
lambda
语法
lambda 参数列表:表达式
lambda的参数形式
- 无参数
lambda 表达式
- 一个参数
lambda 参数:表达式
- 默认参数(又叫缺省参数)
lambda key=value:表达式
- 不定长位置参数,返回值为元组
lambda *args:表达式
- 不定长关键字参数,返回值为字典
lambda **kwargs:表达式
高阶函数
作用:把函数当做参数传入,化简代码
内置高阶函数
1、map()
语法:map(func,lst)
作用:将传入的函数变量func作用到lst变量的每一个元素中,并将结果组成的迭代器返回
2、reduce()
语法:reduce(func,lst)(必须呀有两个参数)(因为每一次func的计算结果要和序列的下一个元素累加计算)
作用:将传入的函数变量func作用到lst变量的每一个元素中
3、filter()
语法:map(func,lst)
作用:过滤序列,返回一个filter对象,使用list()转换成列表