【Python零基础】19天从零开始学Python——第十四天 函数加强

第十四天
B站链接:https://www.bilibili.com/video/BV1gf4y1S7Y9

学习目标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()转换成列表


版权声明:本文为pick_ears原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。