函数
函数:将一段具有独立功能的代码块整合到一个整体并命名,在需要的位置调用这个名称即可完成对应需求操作。
→ 可以更高效的实现代码重用
1.函数的定义
def 函数名(参数):
代码1
代码2
......
2.函数的调用
函数名(参数)
在python中,函数必须先定义后使用
3.需求:封装ATM机功能选项–定义函数
def select_func():
print("---请选择功能---")
print("查询余额")
print("存款")
print("取款")
print("---请选择功能---")
print("密码正确登录成功")
select_func()
print("查询余额完毕")
4.函数的参数以及返回值
①需求:一个函数完成两个数的加法运算
def add_num(a,b):
result = a + b
print(result)
add_num(1,2)
② 返回值
def buy():
return '糖'
goods = buy()
print(f'我买了{goods}')
5.函数的说明文档
查看函数的说明文档
help(函数名) → 查看函数的说明文档
def sum_num(a,b):
"""求和函数"""
return a + b
help(sum_num)
6.函数的嵌套调用
→一个函数里面又调用了另外一个函数
def testB():
print('===testB start===')
print("这里是函数testB")
print("===testB end")
def testA():
print("===testA start===")
testB()
print("===testA end===")
testA()
7.函数的简单应用
需求:求三个数的平均值
def sum_num(a,b,c):
return a + b + c
def average_num(a,b,c):
sumResult = sum_num(a,b,c)
return sumResult / 3
result = average_num(1,2,3)
print(result)
8.函数变量的作用域
主要分为两类:局部变量和全局变量
(1)局部变量
def testA():
a = 100
print(a)
testA()
print(a)
(2)全局变量
a = 100
def testA():
print(a)
def testB():
print(a)
testA()
testB()
(3)在函数体内部修改全局变量
a = 100
def testA():
print(a)
def testB():
global a
a += 1
print(a)
testA()
testB()
print(f'全局变量a = {a}')
9.函数的返回值
(1)return会退出当前函数,一个函数中有两个return时,只会执行前一个
(2)一个函数多个返回值
def return_num():
return 1,2,3
result = return_num()
print(result)
注意:① 返回多个数据时,默认是元组类型 ② return后可接列表、元组或字典
10.函数的参数
(1)位置参数
def user_info(name,age,gender):
print(f'名字是{name},年龄为{age},性别为{gender}')
user_info("丁家雄",21,"男")
(2)关键字参数
调用时,通过“键=值”的形式指定,清除了顺序需求
【调用时,如果有位置参数,位置参数必须在关键字参数前,关键字参数之间不存在先后顺序】
def user_info(name,age,gender):
print(f'名字是{name},年龄为{age},性别为{gender}')
user_info("丁家雄",age = 21,gender= "男")
user_info(name="丁家雄",21,"男")
(3)缺省参数(默认参数)
注意:所有位置参数必须在默认参数前,包括函数定义和调用
def user_info(name,age,gender = "男"):
print(f"名字是{name},年龄为{age},性别为{gender}")
user_info("丁家雄",21)
(4)不定长参数【可变参数】
用于不确定调用的时候会传递多少个参数(可不传)的场景。
① 包裹位置传递【元组】
def user_info(*args):
print(args)
user_info()
user_info("丁家雄",21)
传进的所有参数都被args变量收集,合并为一个元组
② 包裹关键字传递
def user_info(**kwargs):
print(kwargs)
user_info(name = "丁家雄",age = 21)
返回一个字典
11.拆包和交换变量值
(1)拆包
def return_num():
return 100,200
num1,num2 = return_num()
print(num1)
print(num2)
(2)交换变量值
#借助第三变量
a = 10
b = 20
print(f'交换前的a为{a},b为{b}')
c = 0
c = a
a = b
b = c
print(f'交换后的a为{a},b为{b}')
#方法二
a = 10
b = 20
print(f'交换前的a为{a},b为{b}')
a,b = b,a
print(f'交换后的a为{a},b为{b}')
12.引用
(1)id判断int以及列表
int:(可得int类型为不可变数据类型)
a = 1
b = a
print(b)
print(f'a的id为{id(a)}')
print(f'b的id为{id(b)}')
a = 2
print(b)
print(f'a的id为{id(a)}')
print(f'b的id为{id(b)}')
列表:【列表是可变数据类型】
lista = [10,20]
listb = lista
print(f'列表a的id为{id(lista)}')
print(f'列表b的id为{id(listb)}')
lista.append(30)
print(listb)
print(f'列表a的id为{id(lista)}')
print(f'列表b的id为{id(listb)}')
当引用将int当做实参时,id会变化,因为int数据不可变,而列表相反不会变化
13.可变和不可变数据类型
14.学员管理系统
info = []
def print_info():
print("-" * 20)
print("欢迎来到学员管理系统")
print("1.添加学员")
print("2.删除学员")
print("3,修改学员信息")
print("4.查询学员信息")
print("5.显示所有学员信息")
print("6.退出系统")
print("-" * 20)
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
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:
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 search_info():
search_name = input("请输入您要查询的学员的姓名:")
global info
for i in info:
if search_name == i['name']:
print("查找到的学员信息如下:")
print(f"该学员的学号为{i['id']},姓名是{i['name']},手机号为{i['tel']}")
break
else:
print("该学员不存在!")
def print_all():
print("学号t姓名t手机号")
for i in info:
print(f"{i['id']}t{i['name']}t{i['tel']}")
while True:
print_info()
user_num = input("请选择您需要的功能序号:")
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":
print_all()
elif user_num == "6":
exit_flag = input("确定要退出吗?yes or no")
if exit_flag == 'yes':
break
else:
print("输入错误,请重新输入")
15.递归
特点:函数自己调用自己;必须有出口
需求:3以内数字累加和
def sum_numbers(num):
if num == 1:
return 1
return num + sum_numbers(num - 1)
sum_result = sum_numbers(3)
print(sum_result)
16.lambda表达式
如果函数有一个返回值,并且只有一句执行代码,可以用lambda简化
lambda表达式的参数可有可⽆,函数的参数在lambda表达式中完全适⽤。
lambda表达式能接收任何数量的参数但只能返回⼀个表达式的值。
(1)lambda函数实现
def fn1():
return 200
print(fn1)
print(fn1())
fn2 = lambda : 100
print(fn2)
print(fn2())
(2)计算a+b
fn1 = lambda a,b : a + b print(fn1(1,2))
(3)lambda的参数形式
①无参数
②一个参数
③ 默认参数
④ 可变参数*args
⑤ 可变参数 **kwargs
fn1 = lambda : 100
print(fn1())
fn2 = lambda a : a
print(fn2("丁家雄"))
fn3 = lambda a,b,c = 100 : a + b + c
print(fn3(1,2))
fn4 = lambda *args : args
print(fn4(1,2,3,4))
fn5 = lambda **kwargs : kwargs
print(fn5(name = '丁家雄',age = 21))
(4)带判断的lambda
fn1 = lambda a,b : a if a > b else b print(fn1(100,200))
(5)列表数据按字典key值排序
students = [
{'name':"丁",'age':21},
{'name':'王','age':21},
{'name':'小丁','age':0}
]
#按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)
17.高阶函数
将函数作为参数传入,这样的函数称为高阶函数
def sum_num(a,b,f):
return f(a) + f(b)
result = sum_num(-1,2,abs)
print(result)
18.内置高阶函数
(1)map(func,lst)
将传⼊的函数变量func作⽤到lst变量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。
需求:计算列表序列中各个数字的3次方
list1 = [1,2,3,4,5]
def func(x):
return x ** 3
result = map(func,list1)
print(result)
print(list(result))
(2)reduce(func,lst)
其中func必须有两个参数。每次func计算的结果继续和序列的下⼀个元素做累积计
算。
reduce()传入的参数func必须接收2个参数
import functools
list1 = [1,2,3,4,5]
def func(a,b):
return a + b
result = functools.reduce(func,list1)
print(result)
(3)filter()
filter(func, lst)函数⽤于过滤序列, 过滤掉不符合条件的元素, 返回⼀个 filter 对象。如果要转换为列表,可以使⽤ list() 来转换。
list1 = [i for i in range(1,11)]
def func(x):
return x % 2 == 0
result = filter(func,list1)
print(result)
print(list(result))



