Python学习笔记(十六) 函数加强 递归 && lambda && 高阶函数

Python学习笔记(十六) 函数加强 递归 && lambda && 高阶函数

一、应用:学员管理系统
1.1系统简介

在这里插入图片描述

1.2 步骤分析
  1. 显示功能界面
  2. 用户输入功能序号
  3. 根据用户输入的功能序号,执行不同的功能
    3.1 定义函数
    3.2 调用函数
1.3 需求实现

定义不同功能的函数:
###### 1.3.1 显示功能界面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 定义功能界面函数
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]
五、总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值