Bootstrap

十天学会Python——第5天:函数与函数进阶

1 函数

1.1 认识函数

1.1.1 函数的定义与作用

函数作用:整合一段具有独立功能的代码块,以便需要的时候调用

函数的定义与调用方法

# 定义函数
def 函数名(参数):
    执行代码块
# 调用函数
函数名(参数)
1.1.2 函数参数
# 定义函数时定义接收用户数据,形参a,b
def add_num(a,b):
    result = a + b
    print(result)
# 调用函数时传入真实数据,实参10,20
add_num(10,20)

不定长参数:不确定传递多少个参数,可以用包括位置参数或者包裹关键字参数传参

组包:无论是包裹位置传递,还是包裹关键字传递,都是一个组包的过程

def user_info(*args):
    print(args)
# 调用函数,包括位置参数传递
user_info('Tom')
user_info('Tom',18)
# 调用函数,包括关键字参数传递
def user_info(**kwargs):
    print(kwargs)
user_info(name = 'Tom')
user_info(name = 'Tom',age = 18)

注意事项

1 调用函数时,函数参数的个数、位置必须一致

2 调用函数时,函数实参参数可以用关键字表示(add_num(a=10,b=20)

3 函数定义时,形参可以设置默认值(def add_num(a,b=20)),需要改变再修改即可

1.1.3 函数返回值:return
# 制作一个计算器
def add_num(a,b):
    return a + b
result = add_num(10,20)
print(result)

return的作用:

  • 1 负责函数的返回值
  • 2 退出当前函数,return下方所有的代码(函数体内部)不执行
  • 3 若需要返回多个数据,只需要逗号隔开即可(return 1,2),或者直接返回列表、元组和字典,
    返回值为元组类型
1.1.4 函数说明文档:help()
# 定义函数说明文档
def 函数名(参数):
    """说明文档的位置"""
    执行代码块
# 查看函数的说明文档
help(函数名)

1.2 函数的嵌套

需求:求三个数的平均值

def add_num(a,b,c):
    return a + b + c

def average_num(a,b,c):
    sumResult = add_num(a,b,c)
    return sumResult / 3

result = average_num(10,20,30)
print(result)

1.3 变量作用域

局部变量:定义在函数体内部的作用域,只在函数体内部生效

  • 局部变量在函数体内部临时保存数据,函数调用完之后销毁

全局变量:在函数体内部、外部都可以生效

  • 函数体内部想要调用全局变量并修改,需在函数内部用global声明,然后再修改
a = 100
def TestA():
    global a   #声明a为全局变量
    a = 200	   #只是在函数内部修改 a 的值
    print(a)
TestA()	  	    #返回结果是:200
print(a)		#返回结果是:200

1.4 拆包和交换变量值

1.4.1 拆包
# 元组拆包
def return_num():
    renturn 10,20
num1,num2 = return_num()
print(num1)		#返回结果是:10
print(num2)		#返回结果是:20
# 字典拆包
dict1 = {'name':'Tom','age':18}
a,b = dict1		#对字典进行拆包,取出来的是字典的key
print(a)		#返回的结果是:name
print(dict1(a))		#返回的结果是:Tom
1.4.2 交换变量值

方法1:借助第三变量存储数据(c=a,b=a,c=b

方法2:直接交换(a,b = b,a

# 元组拆包
def return_num():
    renturn 10,20
num1,num2 = return_num()
print(num1)		#返回结果是:10
print(num2)		#返回结果是:20

1.5 引用

在Python中,值都是靠引用传递来的

id():判断两个变量是否为同一个值的应用

1.6 学员管理系统

需求:建立一个学员管理系统,实现以下功能:添加学员、删除学员、修改学员信息、查询学员信息、显示所有学员信息、退出系统,用户可根据需求选取

步骤分析:1 显示功能界面 2 用户输入功能序号 3 根据功能序号执行功能(函数,定义函数与调用函数)

# 系统框架如下
info = []	# 该列表用于存储所有学员信息,列表内数据都是字典
# 系统功能需要循环使用,直到用户选择退出系统
while True:
    # 1 显示功能界面,直接调用函数
    info_print()
    # 2 用户输入功能序号
    user_num = int(input('请输入功能序号:'))
    # 3 按照用户输入的功能序号,,执行对应的功能(函数)
    if user_num == 1:
        add_info()
    elif user_num == 2:
        del_info()
    elif user_num == 3:
        modify_info()
    elif user_num == 4:
        search_info()
    elif user_num == 5:
        prirnt_all()
    elif user_num == 6:
        exit_flag = input('您确定要退出系统吗?请输入yes或者no')
        if exit_flag = yes:
            break
    else:
        print('输入的功能序号有误,请重新输入')

1 功能界面函数

# 定义功能界面函数
def info_print():
    print('请选择功能------')
    print('1.添加学员')
    print('2. 删除学员')
    print('3.修改学员')
    print('4.查询学员')
    print('5.显示所有学院')
    print('6.退出系统')
    print('-'*20)

2 添加学员信息函数

# 添加学员信息函数
def add_info():
    """添加学员函数"""
    # 1 用户输入:学号、姓名、手机号
    new_id = input('请输入学号:')
    new_name = input('请输入姓名:')
    new_tel = input('请输入电话号码:')
    
    global info		# 声明info为全局变量
    
    # 2 添加学员信息,学员姓名在列表里面的name值存在的话就报错,不存在就添加数据
    # 2.1 报错提示
    for i in info:
        if new_name == i['name']:
            print('此用户已存在')
            return
    # 2.2 添加学员信息
    info_dit = {}	# 创建空字典,存储新学员信息
    info_dict['id'] = new_id
    info_dict['name'] = new_name
    info_dict['tel'] = new_tel
    info.append(info_dict)		#学员信息列表追加字典

3 删除学员信息函数

# 删除学员信息函数
def del_info():
    """删除学员信息函数"""
    # 1.用户输入要删除学员的姓名
    del_name = input('请输入要删除学员的姓名')
    
    global info		# 声明info为全局变量
    
    # 2.判断学员是否存在,存在的话则删除,否则报错提示
    for i in info:
        if del_name = i['name']:
            info.remove(i)
            break
    else:
         print('该学员不存在!')   

4 修改学员信息函数

# 修改学员信息函数
def modify_info():
    """修改学员信息函数"""
    # 1.用户输入要删除学员的姓名
    modify_name = input('请输入要修改学员的姓名')
    
    global info		# 声明info为全局变量
    
    # 2.判断学员是否存在,存在的话则修改手机号,否则报错提示
    for i in info:
        if modify_name = i['name']:
            i['tel'] = input('请输入新的手机号:')
            break
    else:
         print('该学员不存在!')   

5 查询学员信息函数

# 查询学员信息函数
def search_info():
    """查询学员信息函数"""
    # 1.用户输入要查找学员的姓名
    search_name = input('请输入要查找学员的姓名')
    
    global info		# 声明info为全局变量
    
    # 2.判断学员是否存在,存在的话则打印学员信息,否则报错提示
    for i in info:
        if search_name = i['name']:
            print('查到的学院信息如下:')
            print(f"该学员的姓名是{i['name']},该学员的学号是{i['id']},该学员的手机号码是{i['tel']}")
            break
    else:
         print('该学员不存在!')   

6 显示所有学员信息函数

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

2 函数进阶

2.1 递归函数

应用场景:如果要遍历一个文件夹下面的所有文件,要是用递归来实现

递归函数特点

1 函数内部自己调用自己

2 函数必须有出口!!!

需求:三以内的数字相加

def sum_numbers(num):
    # 2.出口
    if num == 1:
        return 1
    # 1.当前数字 + 当前数字-1 的累加和
    return num + sum_number(num-1)
result = sum_number(3)
print(3)	# 返回的结果是:6

2.2 lambda表达式(匿名函数)

应用场景:如果函数只有一个返回值,并且只有一句代码,可以使用lambda简化

语法lambda 参数列表:表达式

fn1 = lambda: 100
print(fn1)		# 返回的结果:lambda的内存地址
print(fn1())		# 返回的结果:1
fn2 = lambda a,b: a + b
print(fn2(1,2))		# 返回的结果:3

参数形式分类:无参数、一个参数、默认参数、可变参数 *rags、可变参数 *kwargs

lambda的应用案例

案例1:带判断的lambda

fn1 = lambda: a,b: a if a > b else b
print(fn1(1,2))

案例2:列表数据按照字典的key值进行排序(sort)

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

2.3 高阶函数

函数描述
abs()对数字进行绝对值计算
round()对数字进行四舍五入计算

高阶函数:一个函数作为另外一个函数的参数传入

def sum_num(a,b,f):
    return f(a) + f(b)
result = sum_num(-1,2,abs)
print(result)	# 返回结果是:3
2.3.1 map()

map(func,lst):将传入的函数变量func作用的lst变量的每个元素中,并将结果组成新的列表/迭代器返回

list1 = [1,2,3,4,5]
def func(x):
    return x**2
result = map(func,list1)
print(result)	# 返回的是地址,怎么办?
# 转换一下类型就可以了
print(list(result))		# 返回的是:[1,4,9,16,25]
2.3.2 reduce()

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

注意:redunce() 传入的参数func必须接收2个参数

import functools
list1 = [1,2,3,4,5]
def func(a,b):
    return a + b
result = functollis.reduce(func,list1)
print(result)	#返回的结果是:15
2.3.3 filter()

filter(func,lst):用于过滤序列,过滤掉不符合条件的元素,返回一个filter对象

list1 = [1,2,3,4,5,6,7,8,9,10]
def func(x):
    return x % 2 == 0
result = filer(func,list1)
print(result)		#返回的结果是:地址
result = filer(func,list1)		#返回结果是:[2,4,6,8,10]
;