⽬标

  • 应⽤:学员管理系统
  • 递归
  • lambda 表达式
  • ⾼阶函数

⼀. 应⽤:学员管理系统
1.1 系统简介
需求:进⼊系统显示系统功能界⾯,功能如下:

  • 添加学员
  • 删除学员
  • 修改学员信息
  • 查询学员信息
  • 显示所有学员信息
  • 退出系统

系统共6个功能,⽤户根据⾃⼰需求选取。
1.2 步骤分析
1. 显示功能界⾯
2. ⽤户输⼊功能序号
3. 根据⽤户输⼊的功能序号,执⾏不同的功能(函数)
3.1 定义函数
3.2 调⽤函数
1.3 需求实现
1.3.1 显示功能界⾯
定义函数 print_info ,负责显示系统功能。

  1. def print_info():
  2. print('-' * 20)
  3. print('欢迎登录学员管理系统')
  4. print('1: 添加学员')
  5. print('2: 删除学员')
  6. print('3: 修改学员信息')
  7. print('4: 查询学员信息')
  8. print('5: 显示所有学员信息')
  9. print('6: 退出系统')
  10. print('-' * 20)
  11. print_info()

1.3.2 ⽤户输⼊序号,选择功能

  1. user_num = input('请选择您需要的功能序号:')

1.3.3 根据⽤户选择,执⾏不同的功能

  1. if user_num == '1':
  2. print('添加学员')
  3. elif user_num == '2':
  4. print('删除学员')
  5. elif user_num == '3':
  6. print('修改学员信息')
  7. elif user_num == '4':
  8. print('查询学员信息')
  9. elif user_num == '5':
  10. print('显示所有学员信息')
  11. elif user_num == '6':
  12. print('退出系统')

⼯作中,需要根据实际需求调优代码。

  1. ⽤户选择系统功能的代码需要循环使⽤,直到⽤户主动退出系统。
  2. 如果⽤户输⼊1-6以外的数字,需要提示⽤户。
  1. while True:
  2. # 1. 显示功能界⾯
  3. print_info()
  4. # 2. ⽤户选择功能
  5. user_num = input('请选择您需要的功能序号:')
  6. # 3. 根据⽤户选择,执⾏不同的功能
  7. if user_num == '1':
  8. print('添加学员')
  9. elif user_num == '2':
  10. print('删除学员')
  11. elif user_num == '3':
  12. print('修改学员信息')
  13. elif user_num == '4':
  14. print('查询学员信息')
  15. elif user_num == '5':
  16. print('显示所有学员信息')
  17. elif user_num == '6':
  18. print('退出系统')
  19. else:
  20. print('输⼊错误,请重新输⼊!!!')

1.3.4 定义不同功能的函数
所有功能函数都是操作学员信息,所以存储所有学员信息应该是⼀个全局变量,数据类型为列表。

  1. info = []

1.3.4.1 添加学员

  • 需求分析
  1. 接收⽤户输⼊学员信息,并保存
    2. 判断是否添加学员信息
    2.1 如果学员姓名已经存在,则报错提示
    2.2 如果学员姓名不存在,则准备空字典,将⽤户输⼊的数据追加到字典,再列表追加字典数据
    3. 对应的if条件成⽴的位置调⽤该函数
  • 代码实现 ```python def add_info(): “”” 添加学员 “””

    接收⽤户输⼊学员信息

    new_id = input(‘请输⼊学号:’) new_name = input(‘请输⼊姓名:’) new_tel = input(‘请输⼊⼿机号:’)

    声明info是全局变量

    global info

    检测⽤户输⼊的姓名是否存在,存在则报错提示

    for i in info:

    1. if new_name == i['name']:
    2. print('该⽤户已经存在!')
    3. return

    如果⽤户输⼊的姓名不存在,则添加该学员信息

    info_dict = {}

将⽤户输⼊的数据追加到字典

info_dict['id'] = new_id
info_dict['name'] = new_name
info_dict['tel'] = new_tel

将这个学员的字典数据追加到列表

info.append(info_dict)

print(info)
**1.3.4.2 删除学员 **

- 需求分析 

按⽤户输⼊的学员学号进⾏删除 <br />1. ⽤户输⼊⽬标学员学号 <br />2. 检查这个学员是否存在 <br />2.1 如果存在,则列表删除这个数据 <br />2.2 如果不存在,则报错,并重新输⼊ <br />3. 对应的if条件成⽴的位置调⽤该函数 

- 代码实现
```python
def del_info(): 
    """ 删除学员 """ 
    while True: 
        del_id = int(input('请输⼊要删除的学员学号:')) 
        global info 
        # 检查学员是否存在 
        # 如果存在则删除列表指定下标的数据 
        if 0 <= del_id < len(info): 
            del_flag = input('确定要删除吗?yes or no') 
            if del_flag == 'yes': 
            del info[del_id] 
            print(info) 
            # 删除了⽬标学员信息后退出循环 
            break 
        else: 
            print('输⼊学员有误,请重新输⼊')

1.3.4.3 修改学员信息

  • 需求分析
  1. ⽤户输⼊⽬标学员学号
    2. 检查这个学员是否存在
    2.1 如果存在,显示此学员信息,并供⽤户输⼊新的信息
    2.2 如果不存在,则报错,并重新输⼊
    3. 对应的if条件成⽴的位置调⽤该函数
  • 代码实现

    def modify_info():
      """ 修改学员信息 """
      while True:
      # ⽤户输⼊要修改的学员学号
          modify_num = int(input('请输⼊要修改的学员学号:'))
          global info
    
          # 检查这个学员是否存在,存在则打印学员信息,并按⽤户输⼊修改
          if 0 <= modify_num < len(info):
              print(f'该学员学号是{info[modify_num]["id"]}, 姓名是{info[modify_num]["name"]}, ⼿机号是{info[modify_num]["tel"]}')
              info[modify_num]["id"] = input('请输⼊学号:')
              info[modify_num]["name"] = input('请输⼊姓名:')
              info[modify_num]["tel"] = input('请输⼊⼿机号:')
              print(info)
              break
    
          else:
              print('输⼊学员有误,请重新输⼊')
    

    1.3.4.4 查询学员信息

  • 需求分析

  1. ⽤户输⼊⽬标学员姓名
    2. 检查学员是否存在
    2.1 如果存在,则显示这个学员的信息
    2.2 如果不存在,则报错提示
    3. 对应的if条件成⽴的位置调⽤该函数
  • 代码实现

    def search_info(): 
      """ 查询学员信息 """ 
      search_name = input('请输⼊要查找的学员姓名:') 
    
      for i in info: 
          if search_name == i['name']: 
              print('*** 查询到信息如下 ***') 
              print(f'该学员学号是{i["id"]}, 姓名是{i["name"]}, ⼿机号是{i["tel"]}') 
              break 
          else: 
              print('查⽆此⼈......')
    

    1.3.4.5 显示所有学员信息

  • 需求分析

打印所有学员信息

  • 代码实现

    # 显示所有学员信息
    def print_all():
      """ 显示所有学员信息 """
      print('学号\t姓名\t⼿机号')
      for i in info:
          print(f'{i["id"]}\t{i["name"]}\t{i["tel"]}')
    

    1.3.4.6 退出系统
    在⽤户输⼊功能序号 6 的时候要退出系统,代码如下:

    ......
    elif user_num == '6':
       exit_flag = input('确定要退出吗?yes or no')
       if exit_flag == 'yes':
           break
    

    ⼆. 递归
    2.1 递归的应⽤场景
    递归是⼀种编程思想,应⽤场景:
    1. 在我们⽇常开发中,如果要遍历⼀个⽂件夹下⾯所有的⽂件,通常会使⽤递归来实现;
    2. 在后续的算法课程中,很多算法都离不开递归,例如:快速排序。
    2.1.1 递归的特点

  • 函数内部⾃⼰调⽤⾃⼰

  • 必须有出⼝

2.2 应⽤:3以内数字累加和

  • 代码

    # 3 + 2 + 1
    def sum_numbers(num):
      # 1.如果是1,直接返回1 -- 出⼝
      if num == 1:
          return 1
      # 2.如果不是1,重复执⾏累加:
      result = num + sum_numbers(num-1)
      # 3.返回累加结果
      return result
    sum_result = sum_numbers(3)
    # 输出结果为6
    print(sum_result)
    

    image.png
    三. lambda 表达式
    3.1 lambda的应⽤场景
    如果⼀个函数有⼀个返回值,并且只有⼀句代码,可以使⽤ lambda简化。
    3.2 lambda语法

    lambda 参数列表 : 表达式
    

    注意

  • lambda表达式的参数可有可⽆,函数的参数在lambda表达式中完全适⽤。

  • lambda函数能接收任何数量的参数但只能返回⼀个表达式的值

快速⼊⻔

# 函数
def fn1():
    return 200
print(fn1)
print(fn1())
# lambda表达式
fn2 = lambda: 100
print(fn2)
print(fn2())

注意:直接打印lambda表达式,输出的是此lambda的内存地址

3.3 示例:计算a + b
3.3.1 函数实现

def add(a, b):
    return a + b
result = add(1, 2)
print(result)

思考:需求简单,是否代码多?

3.3.2 lambda实现

print((lambda a, b: a + b)(1, 2))

3.4 lambda的参数形式
3.4.1.⽆参数

print((lambda: 100)())

3.4.2.⼀个参数

print((lambda a: a)('hello world'))

3.4.3.默认参数

print((lambda a, b, c=100: a + b + c)(10, 20))

3.4.4.可变参数:args**

print((lambda *args: args)(10, 20, 30))

注意:这⾥的可变参数传⼊到lambda之后,返回值为元组。

3.4.5.可变参数:kwargs**

print((lambda **kwargs: kwargs)(name='python', age=20))

3.5 lambda的应⽤
3.5.1. 带判断的lambda

print((lambda a, b: a if a > b else b)(1000, 500))

3.5.2. 列表数据按字典key的值排序

students = [
 {'name': 'TOM', 'age': 20},
 {'name': 'ROSE', 'age': 19},
 {'name': 'Jack', 'age': 22}
]
# 按name值升序排列
students.sort(key=lambda x: x['name'])
print(students)
# 按name值降序排列
students.sort(key=lambda x: x['name'], reverse=True)
print(students)
# 按age值升序排列
students.sort(key=lambda x: x['age'])
print(students)

四. ⾼阶函数
把函数作为参数传⼊,这样的函数称为⾼阶函数,⾼阶函数是函数式编程的体现。函数式编程就是指这
种⾼度抽象的编程范式。
4.1 体验⾼阶函数
需求:⼀个函数完成计算任意两个数字的绝对值之和。
在Python中, abs() 函数可以完成对数字求绝对值计算。

abs(-10) # 10
  • 方法1

    def add_num(a, b):
    return abs(a) + abs(b)
    result = add_num(-1, 2)
    print(result) # 3
    
  • 方法2

    def sum_num(a, b, f):
    return f(a) + f(b)
    result = sum_num(-1, 2, abs)
    print(result) # 3
    

    注意:两种⽅法对⽐之后,发现,⽅法2的代码会更加简洁。

函数式编程⼤量使⽤函数,减少了代码的重复,因此程序⽐较短,开发速度较快。
4.2 内置⾼阶函数
4.2.1 map()
map(func, lst),将传⼊的函数变量func作⽤到lst变量的每个元素中,并将结果组成新的列表(Python2)/
迭代器(Python3)返回。
需求:计算 list1 序列中各个数字的2次⽅。

list1 = [1, 2, 3, 4, 5]
def func(x):
 return x ** 2
result = map(func, list1)
print(result) # <map object at 0x0000013769653198>
print(list(result)) # [1, 4, 9, 16, 25]

4.2.2 reduce()
reduce(func(x,y),lst),其中func必须有两个参数。每次func计算的结果继续和序列的下⼀个元素做累
积计算。

注意:reduce()传⼊的参数func必须接受2个参数。

需求:计算 list1 序列中各个数字的累加和。

import functools
list1 = [1, 2, 3, 4, 5]
def func(a, b):
 return a + b
result = functools.reduce(func, list1)
print(result) # 15

4.2.3 fifilter()
fifilter(func, lst)函数⽤于过滤序列, 过滤掉不符合条件的元素, 返回⼀个 fifilter 对象,。如果要转换为列表,
可以使⽤ list() 来转换。

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def func(x):
 return x % 2 == 0
result = filter(func, list1)
print(result) # <filter object at 0x0000017AF9DC3198>
print(list(result)) # [2, 4, 6, 8, 10]

五. 总结
image.png
image.png