Python学习笔记(十六) 函数加强 递归 && lambda && 高阶函数
一、应用:学员管理系统
1.1系统简介
1.2 步骤分析
- 显示功能界面
- 用户输入功能序号
- 根据用户输入的功能序号,执行不同的功能
3.1 定义函数
3.2 调用函数
1.3 需求实现
定义不同功能的函数:
# 定义功能界面函数
def info_print():
print('请选择功能-------------')
print('1.添加学员')
print('2.删除学员')
print('3.修改学员')
print('4.查询学员')
print('5.显示所有学员')
print('6.退出系统')
print('-' * 20)
info = [] # 等待存储所以学员信息
# 添加学员信息的函数
def add_info():
'''添加学员函数'''
# 用户输入:学号、姓名、手机号
new_id = input('请输入学号:')
new_name = input('请输入姓名:')
new_tel = input('请输入手机号:')
global info
# 如果学员信息存在(当用户输入的姓名在列表中存在)
for i in info:
if new_name == i['name']:
print('此用户已存在')
return # 退出当前函数add_info(),后面添加学员的信息不执行
# 如果学员信息不存在,添加数据,准备空字典,追加新增后数据
info_dict = {}
info_dict['id'] = new_id
info_dict['name'] = new_name
info_dict['tel'] = new_tel
#列表追加字典
info.append(info_dict)
# 打印执行"添加操作"后的学员列表
print(info)
# 删除学员信息函数
def del_info():
'''删除学员'''
# 输入要删除的学员的姓名
del_name = input('请输入要删除的学员姓名:')
global info
# 判断学员是否存在:如果输入的姓名存在则删除,否则报错提示
for i in info:
if del_name == i['name']:
info.remove(i)
break #把循环终止掉
else: #for...else...当循环正常执行结束要执行的代码
print('要删除的学员不存在')
# 打印执行"删除操作"后的学员列表
print(info)
# 修改学员信息函数
def modify_info():
'''修改学员信息'''
# 用户输入需要修改的学员信息
modify_name = input('请输入要修改的学员的姓名:')
global info
# 判断学员是否存在:如果输入的姓名存在则修改手机号,否则报错提示
for i in info:
if modify_name == i['name']:
i['tel'] = input('请输入新的手机号:')
break
else:
print('该学员不存在')
# 打印执行“修改操作”后的学员列表
print(info)
# 查询学员信息函数
def find_info():
'''查询学员'''
# 输入要查找的学员的姓名
find_name = input('请输入要查找的学员姓名:')
#查找该学员的信息,如果查找成功,则打印学员其他信息,否则该学员不存在
for i in info:
if find_name == i['name']:
print('查找到该学员了')
print(f"该学员的学号为{i['id']},手机号为{i['tel']}")
break
else:
print('没有找到该学员')
# 打印执行“查找操作”后的学员列表
print(info)
# 打印所有学员信息
def print_all():
'''打印所有学员信息'''
count = 1
print('姓名 学号 手机号')
for i in info:
# print(f"第{count}个学员的姓名为{i['name']},学号为{i['id']},手机号为{i['tel']}")
print(f"{i['name']}\t{i['id']}\t{i['tel']}")
else:
print('所以学员信息打印完毕')
# 系统功能需要循环使用,直到用户输入6,才退出系统
while True:
# 1.显示功界面
info_print()
# 2.用户输入功能序号
user_num = int(input('请输入功能序号:'))
# 3.按照用户输入功能序号,执行不同的功能(函数)
if user_num == 1:
# print('添加')
add_info()
elif user_num == 2:
# print('删除')
del_info()
elif user_num == 3:
# print('修改')
modify_info()
elif user_num == 4:
# print('查询')
find_info()
elif user_num == 5:
# print('显示')
print_all()
elif user_num == 6:
# print('退出系统')
exit_flag = input('确定要退出吗?yes or no:')
if exit_flag == 'yes':
break # 退出while True
else:
print('输入的功能序号有误')
结果截图:
C:\Users\YSH\AppData\Local\Programs\Python\Python37-32\python.exe C:/Users/YSH/Desktop/test/学员管理系统.py
请选择功能-------------
1.添加学员
2.删除学员
3.修改学员
4.查询学员
5.显示所有学员
6.退出系统
--------------------
请输入功能序号:1
请输入学号:1
请输入姓名:aa
请输入手机号:111
[{'id': '1', 'name': 'aa', 'tel': '111'}]
请选择功能-------------
1.添加学员
2.删除学员
3.修改学员
4.查询学员
5.显示所有学员
6.退出系统
--------------------
请输入功能序号:1
请输入学号:2
请输入姓名:bb
请输入手机号:222
[{'id': '1', 'name': 'aa', 'tel': '111'}, {'id': '2', 'name': 'bb', 'tel': '222'}]
请选择功能-------------
1.添加学员
2.删除学员
3.修改学员
4.查询学员
5.显示所有学员
6.退出系统
--------------------
请输入功能序号:2
请输入要删除的学员姓名:aa
[{'id': '2', 'name': 'bb', 'tel': '222'}]
请选择功能-------------
1.添加学员
2.删除学员
3.修改学员
4.查询学员
5.显示所有学员
6.退出系统
--------------------
请输入功能序号:3
请输入要修改的学员的姓名:bb
请输入新的手机号:333
[{'id': '2', 'name': 'bb', 'tel': '333'}]
请选择功能-------------
1.添加学员
2.删除学员
3.修改学员
4.查询学员
5.显示所有学员
6.退出系统
--------------------
请输入功能序号:4
请输入要查找的学员姓名:bb
查找到该学员了
该学员的学号为2,手机号为333
[{'id': '2', 'name': 'bb', 'tel': '333'}]
请选择功能-------------
1.添加学员
2.删除学员
3.修改学员
4.查询学员
5.显示所有学员
6.退出系统
--------------------
请输入功能序号:1
请输入学号:3
请输入姓名:cc
请输入手机号:444
[{'id': '2', 'name': 'bb', 'tel': '333'}, {'id': '3', 'name': 'cc', 'tel': '444'}]
请选择功能-------------
1.添加学员
2.删除学员
3.修改学员
4.查询学员
5.显示所有学员
6.退出系统
--------------------
请输入功能序号:5
姓名 学号 手机号
bb 2 333
cc 3 444
所以学员信息打印完毕
请选择功能-------------
1.添加学员
2.删除学员
3.修改学员
4.查询学员
5.显示所有学员
6.退出系统
--------------------
请输入功能序号:6
确定要退出吗?yes or no:yes
Process finished with exit code 0
二、递归
2.1递归的应用场景
2.1 递归的特点
- 函数内部自己调用自己
- 必须有出口
2.2应用:10以内数字累加和
# 10 + 9 + 8 + 7 + ...+ 2 + 1
def sum_numbers(num):
# 1. 如果是1,直接返回1 -- 出口
if num == 1:
return 1
# 2. 如果不是1,重复执行累加并返回结果
else:
return num + sum_numbers(num - 1)
sum_result = sum_numbers(10)
print('数字之和为:',sum_result) #55
注意:写递归的时候,如果没有出口,就会超出最大递归深度。
三、lambda表达式(匿名函数)
3.1 lambda的应用场景
如果一个函数有一个返回值,并且只有一句代码,可以使用lambda简化。
3.2 lambda的语法
lambda 参数列表:表达式
3.3 体验
# 函数
def fn1():
return 200
print(fn1)
print(fn1())
# lambda表达式
fn2 = lambda : 100
print(fn2)
print(fn2())
注意 :直接打印lambda表达式,此时输出的是lambda的内存地址。
3.4 实例: 计算 a + b
3.4.1 函数实现
# 函数实现
def add(a, b):
return a + b
result = add(1, 2)
print(result)
思考:需求简单时,lambda可以简化代码!
3.4.2 lambda实现
# lambda表达式
fn1 = lambda a, b: a +b
print(fn1(1,2))
3.5 lambda的参数形式
3.5.1 无参数
fn1 = lambda : 100
print((fn1()) #100
3.5.2 一个参数
fn1 = lambda a:a
print(fn1('hello world')) #hello world
3.5.3 默认参数(缺省参数)
fn1 = lambda a,b,c=100:a +b + c
print(fn1(10,20)) #130
print(fn1(10,20,30)) #60
3.5.4 可变参数: *args
fn1 = lambda *args:args
print(fn1(10,20,30)) #(10,20,30) 返回的是元组形式
print(fn1(10)) #(10,) 一个数据的元组也要加‘,’
注意: (接受不定长参数,返回的是元组)
3.5.5 可变参数: **kargs
fn1 = lambda **kwargs:kwargs
print(fn1(name = 'Python')) #{'name': 'Python'}
print(fn1(name = 'Python', age = 20)) # {'name': 'Python', 'age': 20}
注意:(接收不定长关键字参数,返回的是字典)
3.6 lambda的应用
3.6.1 带判断的lambda
fn1 = lambda a,b: a if a>b else b
print(fn1(10,30)) #30
3.6.2 列表数据按照字典key的值排序
# 按照 name/age 的值升序排序
students.sort(key = lambda x:x['name'])
print(students) # 列表是可变类型,直接打印列表即可
students.sort(key = lambda x:x['age'])
print(students)
# 按照 name/age 的值降序排序
students.sort(key = lambda x:x['name'],reverse= True)
print(students)
students.sort(key = lambda x:x['age'],reverse = True)
print(students)
四、高阶函数
4.1 体验
高阶函数的作用就是化简代码,增加代码的灵活性。
两个小函数的背景引入:
例子:
需求:任意两个数字,按照指定要求整理数字后再进行求和运算。
- 方法一:
def add_num(a,b):
return abs(a) + abs(b)
result = add_num(-1,2)
print(result) # 3
- 方法二:(高阶函数)
def sum_num(a,b,f):
return f(a) + f(b)
result = sum_num(-1,2,abs)
print(result) # 3
def sum_num(a,b,f1,f2):
return f1(a) + f2(b)
result = sum_num(-1,2.8,abs,round)
print(result) # 4
4.2 内置高阶函数
4.2.1 map()
需求: 计算list序列中各个数字的2次方。
# map()
# 1. 准备列表数据
list1= [1,2,3,4,5]
# 2. 定义2次方函数
def fun(x):
return x ** 2
# 3. 调用map高阶函数
result = map(fun,list1)
# 4. 检验结果
print(list(result)) #[1, 4, 9, 16, 25]
4.2.2 reduce()
需求:计算list1 所有数字累加和。
import functools
list1 = [1,2,3,4,5]
def add_num(a,b):
return a + b
result = functools.reduce(add_num,list1)
print(result) # 15
4.2.3 filter()
list1 = [1,2,3,4,5,6,7,8,9]
def fun(x):
if x % 2 == 0:
return x
# return x % 2 == 0
result = filter(fun,list1)
print(list(result)) # [2, 4, 6, 8]
五、总结