- 函数加强
- 应用:学院管理系统
- 系统介绍
- 步骤分析
- 需求实现
- 显示功能界面
- 用户输入功能序号
- 用户输入的功能序号
- 定义不同功能的函数
- 递归
- 递归的应用场景
- 递归的特点
- 应用:3以内数字累加和
- 递归出口问题
- lambda 表达式
- lambda的应用场景
- lambda语法
- 快速入门
- 示例:计算a+b
- 函数实现
- lambda实现
- lambda的参数形式
- 无参数
- 一个参数
- 默认参数
- 可变参数 *args
- 可变参数**kwargs
- lambda 应用
- 带判断的lambda
- 列表书按字典key的值排序
- 高阶函数
- 体验高阶函数
- 内置高阶函数
- map()
- reduce()
- filter()
需求:进入系统显示系统功能界面,功能如下:
- 添加学员
- 删除学员
- 修改学员信息
- 查询学员信息
- 显示所有学员信息
- 退出系统
系统共6个功能,用户根据自己需求选取。
- 显示功能界面
- 用户输入功能序号
- 根据用户输入的功能序号,执行不同的功能(函数)
3.1 定义函数
3.2 调用函数
定义函数print_info
,负责显示系统功能。
# 定义功能界面函数
def print_info():
print('-------请选择功能-------')
print('1. 添加学员')
print('2. 删除学员')
print('3. 修改学员信息')
print('4. 查询学员信息')
print('5. 显示所有学员信息')
print('6. 退出系统')
print('-'*22)
调用代码:
# 1. 显示功能界面
print_info()
用户输入功能序号
# 2. 用户输入功能序号
user_num = int(input('请输入功能序号'))
用户输入的功能序号
# 3. 用户输入的功能序号,执行不同的功能(函数)
if user_num == 1:
print('添加学员')
elif user_num == 2:
print('删除学员')
elif user_num == 3:
print('修改学员信息')
elif user_num == 4:
print('查询学员信息')
elif user_num == 5:
print('显示所有学员信息')
elif user_num == 6:
print('退出系统')
定义不同功能的函数
所有功能函数都是 *** 作学院信息,所有存储所有学员的信息应该是一个全局变量,数据类型为里列表。
info = []
- 添加学员
需求分析:接收用户输入学院信息,并保存;判断是否添加学员信息(如果学员姓名已经存在,则报错提醒;如果学员姓名不存在,则准备空字典,将用户输入的数据追加到字典,再列表追加字典数据);对应的if条件成立的位置调用该函数。
代码实现
# 添加学员
info = []
def add_info():
'''添加学员'''
# 输入学院信息
new_name = input('请输入学员姓名:')
new_id = input('请输入学员id:')
new_tel = input('请输入学员电话:')
# 从全局变量info中,判断学员信息
global info
for i in info:
if new_name == i['name']:
print('该用户已存在!')
return
# 如果用户输入的姓名不存在,则添加该学员信息
info_dict = {}
# 将用户输入的数据追加到字典中
info_dict['id'] = new_id
info_dict['name'] = new_name
info_dict['tel'] = new_tel
# 将这个学员信息字典追加到列表中
info.append(info_dict)
print(info)
- 删除学员
需求分析:按用户输入的学员姓名进行删除:用户输入目标学员姓名;检查学员是否存在(如果存在,删除这个数据;如果不存在,则提示“该用户不存在”);对应的if条件成立的位置调用该函数。
代码实现
# 删除学员
def del_info():
'''删除学员'''
# 1. 用户输入想要删除的学员的姓名
del_name = input('想要删除的学员的姓名:')
# 2. 在全局变量中的数据中,判断是否有该姓名
for i in info:
if del_name == i['name']:
info.remove(i)
break
else:
print('该学员不存在')
print(info)
- 修改学员信息
需求分析:用户输入目标学员姓名;检查这个学员是否存在(如果存在,则修改这位学员的信息,例如手机号;如果不存在,则报错);对应的if条件成立的位置调用该函数。
代码实现
# 修改学员信息
def modify_info():
'''修改学员信息'''
# 1. 用户输入目标学员信息
modify_name = input('请输入想要修改信息学员的名字:')
# 2. 在全局变量中,检查这个学员是否存在
global info
for i in info:
if modify_name == i['name']:
i['tel'] = input('请输入新的手机号:')
break
else:
print('该学员不存在!')
print(info)
- 查询学员信息
需求分析:用户输入目标学员姓名;检查学员是否存在(如果存在,则显示该学员的信息;如果不存在,则报错提示)
代码实现
# 查询学员信息
def search_info():
'''查询学员信息'''
# 1. 输入想要查询学员的姓名
search_name = input('请输入想要查询学员的姓名:')
# 2. 在全局变量中,检查这个学员是否存在
for i in info:
if search_name == i['name']:
print('查找到的学员信息如下:')
print(f"该学员的姓名是{i['name']},学号是{i['id']},手机号是{i['tel']}")
else:
print('该学员不存在!')
- 显示所有学员信息
需求分析:打印所有学员信息
代码实现
# 显示所有学员信息
def print_all():
'''显示所有学员信息'''
print('学号\t姓名\t手机号')
for i in info:
print(f'{{i['id']}}\t{i['name']}\t{i['tel']}')
- 退出系统
代码实现
elif user_num == 6:
exit_flag = input('确定要退出吗?yes or no')
if exit_flag == 'yes':
break
所有功能都用代码实现了,下面,我们来看看完整版的代码吧!
info = []
def print_info():
print('-------请选择功能-------')
print('1. 添加学员')
print('2. 删除学员')
print('3. 修改学员信息')
print('4. 查询学员信息')
print('5. 显示所有学员信息')
print('6. 退出系统')
print('-'*22)
# 添加学员
def add_info():
'''添加学员'''
# 输入学院信息
new_name = input('请输入学员姓名:')
new_id = input('请输入学员id:')
new_tel = input('请输入学员电话:')
# 从全局变量info中,判断学员信息
global info
for i in info:
if new_name == i['name']:
print('该用户已存在!')
return
# 如果用户输入的姓名不存在,则添加该学员信息
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():
'''删除学员'''
# 1. 用户输入想要删除的学员的姓名
del_name = input('想要删除的学员的姓名:')
# 2. 在全局变量中的数据中,判断是否有该姓名
for i in info:
if del_name == i['name']:
info.remove(i)
break
else:
print('该学员不存在')
print(info)
# 修改学员信息
def modify_info():
'''修改学员信息'''
# 1. 用户输入目标学员信息
modify_name = input('请输入想要修改信息学员的名字:')
# 2. 在全局变量中,检查这个学员是否存在
global info
for i in info:
if modify_name == i['name']:
i['tel'] = input('请输入新的手机号:')
break
else:
print('该学员不存在!')
print(info)
# 查询学员信息
def search_info():
'''查询学员信息'''
# 1. 输入想要查询学员的姓名
search_name = input('请输入想要查询学员的姓名:')
# 2. 在全局变量中,检查这个学员是否存在
for i in info:
if search_name == i['name']:
print('查找到的学员信息如下:')
print(f"该学员的姓名是{i['name']},学号是{i['id']},手机号是{i['tel']}")
else:
print('该学员不存在!')
# 显示所有学员信息
def print_all():
'''显示所有学员信息'''
print('学号\t姓名\t手机号')
for i in info:
print(f'{{i['id']}}\t{i['name']}\t{i['tel']}')
# 系统需要循环使用,直到退出系统
while True:
# 1. 显示功能界面
print_info()
# 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('查询学员信息')
search_info()
elif user_num == 5:
print('显示所有学员信息')
print_all()
elif user_num == 6:
exit_flag = input('确定要退出吗?yes or no')
if exit_flag == 'yes':
break
else:
print('输入功能有错误,请重新输入')
递归
递归的应用场景
递归是一种编程思想:
- 在我们日常开发中,如果遍历一个文件夹下面所有的文件,通常会使用递归来实现;
- 在后续的算法课中,很多算法都离不开递归。例如:快速排序。
函数内部自己调用自己
必须有出口
代码
# 3 + 2 + 1
def sum_num(num):
# 1. 如果是1 ,直接返回1--出口
if num == 1:
return 1
# 2. 如果不是1,重复执行累加并返回结果
return num + sum_num(num-1)
result = sum_num(3)
print(result) # 6
执行结果
递归出口问题可以使用Debug工具查看
错误代码:
# 3 + 2 + 1
def sum_num(num):
# 1. 如果是1 ,直接返回1--出口
# if num == 1:
# return 1
# 2. 如果不是1,重复执行累加并返回结果
return num + sum_num(num-1)
result = sum_num(3)
print(result) # 6
报错信息
File "c:\Users\Administrator\Desktop.py", line 9, in <module>
result = sum_num(3)
File "c:\Users\Administrator\Desktop.py", line 7, in sum_num
return num + sum_num(num-1)
File "c:\Users\Administrator\Desktop.py", line 7, in sum_num
return num + sum_num(num-1)
File "c:\Users\Administrator\Desktop.py", line 7, in sum_num
return num + sum_num(num-1)
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
其中996
是递归深度。
如果应该函数有返回值,并且只有一句代码,可以使用lanbda简化。
lambda语法lambda 参数列表 : 表达式
快速入门注意
lambda表达式的参数可有可无,函数的参数在lambda表达式中完全适用。
lambda表达式能接受任何数量的参数但是只能返回一个表达式的值。
# 函数
def fn1():
return 200
print(fn1) #
print(fn1()) # 200
# lambda表达式
fn2 = lambda : 100
print(fn2) # at 0x000001278661E830>
print(fn2()) # 100
示例:计算a+b 函数实现注意:直接答应lambda表达式,输出的是此lambda的内存地址。
def add(a,b):
return a+b
result = add(1,2)
print(result) # 3
# 思考:需求简单,是否代码多
lambda实现
fn1 = lambda a,b : a+b
print(fn1(1,2)) # 3
lambda的参数形式
无参数
fn1 = lambda : 100
print(fn1()) # 100
一个参数
fn1 = lambda a : a
print('hallo world') # hallo world
默认参数
fn1 = lambda a,b,c=100:a,b,c
print(fn1(10,20)) # 10,20,100
可变参数 *args
fn1 = lambda *args:args
print(10,20,30) # (10,20,30)
可变参数**kwargs
fn1 = lambda **kwargs : kwargs
print(fn1(name = ‘txd’,age = 18)) # {‘name’: ‘txd’, ‘age’: 18}
fn1 = lambda a,b:a if a > b else b
print(fn1(1,2))
列表书按字典key的值排序
from curses import keyname
studens = [
{'name':'txd','age':18},
{'name':'yy','age':19},
{'name':'ll','age':17}
]
# sort(key = lambda...,....)
# 1. name key 对应的值进行升序排序
studens.sort(key=lambda x:x['name'])
print(studens)
# 2. name key 对应的值进行降序排序
studens.sort(key=lambda x:x['name'],reverse=True)
print(studens)
# 3. age key 对应的值进行升序排序
studens.sort(key=lambda x:x['age'])
print(studens)
高阶函数
把函数作为参数传入,这样的函数称为高阶函数,高阶函数是函数式编程的体现,函数式编程是指这种高度抽象的编程范式。
体验高阶函数在python中,abs()
函数可以完成数字绝对值计算。
abs(-10) # 10
round()
函数可以完成对数字的四舍五入计算,
round(1.2) # 1
round(1.9) # 2
需求:任意两个数字,按照指定要求整理数字后进行求和计算。
方法1
def add_num(a,b):
return abs(a) + abs(b)
result = add_num(-4,2)
print(result) # 6
方法2
def add_num(a,b,f):
return f(a) + f(b)
result = add_num(-4,2,abs)
print(result) # 6
注意:两种表达式对比之后,发现,方法2的代码会更加简洁,函数灵活性更高。
函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。
内置高阶函数 map()map(func,lst),将传入的函数变量func作用到两三天变量的每个元素中,并将结果组成新的列表返回。
需求:计算list1序列中各个数字的2次方。
lsit1 = [3,4,5]
def func(x):
return x**2
result = map(func,lsit1)
print(result) #
print(list(result)) # [9, 16, 25]
reduce()
reduce(func,lst):其中func必须有两个参数,每次func计算的结果继续和序列的下一个元素做累计计算。
注意:reduce()传入的参数func必须接收2个参数。
需求:计算list1序列中各个数字的累加和。
import functools
from unittest import result
list1 = [1,2,3,4,5]
def func(a,b):
return a + b
result = functools.reduce(func,list1)
print(result) # 15
filter()
filter(func,lst)函数用于过滤序,过滤掉不符合条件的元素,返回一个filter对象,如果要转换为列表,可以使用list()来转换、
list1 = [1,2,3,4,5,6,7,8,9]
def func(x):
return x %2 ==0
result = filter(func,list1)
print(result) #
print(list(result)) # [2, 4, 6, 8]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)