2.1 定义函数
def 函数名(参数):
代码1
代码2
......
2.2 调⽤函数
函数名(参数)
注意:
1. 不同的需求,参数可有可⽆。
2. 在Python中,函数必须先定义后使⽤。
2.3 快速体验
需求:复现ATM取钱功能。
1. 搭建整体框架(复现需求)
print('密码正确登录成功')
# 显示"选择功能"界⾯
print('查询余额完毕')
# 显示"选择功能"界⾯
print('取了2000元钱')
# 显示"选择功能"界⾯
2. 确定“选择功能”界⾯内容
print('查询余额')
print('存款')
print('取款')
3. 封装"选择功能"
注意:⼀定是先定义函数,后调⽤函数。
# 封装ATM机功能选项 -- 定义函数
def select_func():
print('-----请选择功能-----')
print('查询余额')
print('存款')
print('取款')
print('-----请选择功能-----')
4. 调⽤函数
在需要显示“选择功能”函数的位置调⽤函数。
print('密码正确登录成功')
# 显示"选择功能"界⾯ -- 调⽤函数
select_func()
print('查询余额完毕')
# 显示"选择功能"界⾯ -- 调⽤函数
select_func()
print('取了2000元钱')
# 显示"选择功能"界⾯ -- 调⽤函数
select_func()
三.函数的参数作⽤
思考:完成需求如下:⼀个函数完成两个数1和2的加法运算,如何书写程序?
# 定义函数
def add_num1():
result = 1 + 2
print(result)
# 调⽤函数
add_num1()
思考:上述add_num1函数只能完成数字1和2的加法运算,如果想要这个函数变得更灵活,可以计算任何⽤户指定的两个数字的和,如何书写程序?
分析:⽤户要在调⽤函数的时候指定具体数字,那么在定义函数的时候就需要接收⽤户指定的数字。函数调⽤时候指定的数字和定义函数时候接收的数字即是函数的参数。
# 定义函数时同时定义了接收⽤户数据的参数a和b,a和b是形参
def add_num2(a, b):
result = a + b
print(result)
# 调⽤函数时传⼊了真实的数据10 和 20,真实数据为实参
add_num2(10, 20)
四.函数的返回值作⽤
例如:我们去超市购物,⽐如买烟,给钱之后,是不是售货员会返回给我们烟这个商品,在函数中,如果需要返回结果给⽤户需要使⽤函数返回值。
def buy():
return '烟'
# 使⽤变量保存函数返回值
goods = buy()
print(goods)
4.1 应⽤
需求:制作⼀个计算器,计算任意两数字之和,并保存结果。
def sum_num(a, b):
return a + b
# ⽤result变量保存函数返回值
result = sum_num(1, 2)
print(result)
五.函数的说明⽂档
思考:定义⼀个函数后,程序员如何书写程序能够快速提示这个函数的作⽤?
答:注释
思考:如果代码多,我们是不是需要在很多代码中找到这个函数定义的位置才能看到注释?如果想更⽅便的查看函数的作⽤怎么办?
答:函数的说明⽂档
函数的说明⽂档也叫函数的⽂档说明。
5.1 语法
定义函数的说明⽂档
def 函数名(参数):
""" 说明⽂档的位置 """
代码
......
查看函数的说明⽂档
help(函数名)
5.2 快速体验
def sum_num(a, b):
""" 求和函数 """
return a + b
help(sum_num)
六.函数嵌套调⽤
所谓函数嵌套调⽤指的是⼀个函数⾥⾯⼜调⽤了另外⼀个函数。
示例
def testB():
print('---- testB start----')
print('这⾥是testB函数执⾏的代码...(省略)...')
print('---- testB end----')
def testA():
print('---- testA start----')
testB()
print('---- testA end----')
testA()
执⾏流程
如果函数A中,调⽤了另外⼀个函数B,那么先把函数B中的任务都执⾏完毕之后才会回到上次 函数A执⾏的位置。
七. 变量作⽤域
变量作⽤域指的是变量⽣效的范围,主要分为两类:局部变量和全局变量。
局部变量
所谓局部变量是定义在函数体内部的变量,即只在函数体内部⽣效。
def testA():
a = 100
print(a)
testA() # 100
print(a) # 报错:name 'a' is not defined
变量a是定义在 testA 函数内部的变量,在函数外部访问则⽴即报错。
局部变量的作⽤:在函数体内部,临时保存数据,即当函数调⽤完成后,则销毁局部变量。
全局变量
所谓全局变量,指的是在函数体内、外都能⽣效的变量。
思考:如果有⼀个数据,在函数A和函数B中都要使⽤,该怎么办?
答:将这个数据存储在⼀个全局变量⾥⾯。
# 定义全局变量a
a = 100
def testA():
print(a) # 访问全局变量a,并打印变量a存储的数据
def testB():
print(a) # 访问全局变量a,并打印变量a存储的数据
testA() # 100
testB() # 100
思考: testB 函数需求修改变量a的值为200,如何修改程序?
a = 100
def testA():
print(a)
def testB():
a = 200
print(a)
testA() # 100
testB() # 200
print(f'全局变量a = {a}') # 全局变量a = 100
思考:在 testB 函数内部的 a = 200 中的变量a是在修改全局变量 a 吗?
答:不是。观察上述代码发现,15⾏得到a的数据是100,仍然是定义全局变量a时候的值,⽽没有返回testB 函数内部的200。综上: testB 函数内部的 a = 200 是定义了⼀个局部变量。
思考:如何在函数体内部修改全局变量?
a = 100
def testA():
print(a)
def testB():
# global 关键字声明a是全局变量
global a
a = 200
print(a)
testA() # 100
testB() # 200
print(f'全局变量a = {a}') # 全局变量a = 200
八. 多函数程序执⾏流程
⼀般在实际开发过程中,⼀个程序往往由多个函数(后⾯知识中会讲解类)组成,并且多个函数共享某些数据,如下所示:
共⽤全局变量
# 1. 定义全局变量
glo_num = 0
def test1():
global glo_num
# 修改全局变量
glo_num = 100
def test2():
# 调⽤test1函数中修改后的全局变量
print(glo_num)
# 2. 调⽤test1函数,执⾏函数内部代码:声明和修改全局变量
test1()
# 3. 调⽤test2函数,执⾏函数内部代码:打印
test2() # 100
返回值作为参数传递
def test1():
return 50
def test2(num):
print(num)
# 1. 保存函数test1的返回值
result = test1()
# 2.将函数返回值所在变量作为参数传递到test2函数
test2(result) # 50
九. 函数的返回值
思考:如果⼀个函数如些两个return (如下所示),程序如何执⾏?
def return_num():
return 1
return 2
result = return_num()
print(result) # 1
答:只执⾏了第⼀个return,原因是因为return可以退出当前函数,导致return下⽅的代码不执⾏。
思考:如果⼀个函数要有多个返回值,该如何书写代码?
def return_num():
return 1, 2
result = return_num()
print(result) # (1, 2)
注意:
1. return a, b 写法,返回多个数据的时候,默认是元组类型。
2. return后⾯可以连接列表、元组或字典,以返回多个值。
十. 函数的参数
10.1 位置参数
位置参数:调⽤函数时根据函数定义的参数位置来传递参数。
def user_info(name, age, gender):
print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info('TOM', 20, '男')
注意:传递和定义参数的顺序及个数必须⼀致。
10.2 关键字参数
函数调⽤,通过“键=值”形式加以指定。可以让函数更加清晰、容易使⽤,同时也清除了参数的顺序需求。
def user_info(name, age, gender):
print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info('Rose', age=20, gender='⼥')
user_info('⼩明', gender='男', age=16)
注意:函数调⽤时,如果有位置参数时,位置参数必须在关键字参数的前⾯,但关键字参数之间不存在
先后顺序。
10.3 缺省参数
缺省参数也叫默认参数,⽤于定义函数,为参数提供默认值,调⽤函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调⽤)。
def user_info(name, age, gender='男'):
print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info('TOM', 20)
user_info('Rose', 18, '⼥')】
注意:函数调⽤时,如果为缺省参数传值则修改默认参数值;否则使⽤这个默认值。
十一. 函数应⽤
11.1 打印图形
1. 打印⼀条横线
def print_line():
print('-' * 20)
print_line()
2. 打印多条横线
def print_line():
print('-' * 20)
def print_lines(num):
i = 0
while i < num:
print_line()
i += 1
print_lines(5)
11.2 函数计算
1. 求三个数之和
def sum_num(a, b, c):
return a + b + c
result = sum_num(1, 2, 3)
print(result) # 6
2. 求三个数平均值
def average_num(a, b, c):
sumResult = sum_num(a, b, c)
return sumResult / 3
result = average_num(1, 2, 3)
print(result) # 2.0