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]