目标

  • 函数的作用
  • 函数的使用步骤
  • 函数的参数作用
  • 函数的返回值作用
  • 函数的说明文档
  • 函数嵌套

函数的作用

需求:用户到ATM机取钱:

  1. 输入密码后显示"选择功能"界面

  2. 查询余额后显示"选择功能"界面

  3. 取2000钱后显示"选择功能"界面

特点:显示“选择功能”界面需要重复输出给用户,怎么实现?

image-20181231211912413

函数就是将一段具有独立功能的代码块 整合到一个整体并命名,在需要的位置调用这个名称即可完成对应的需求。

函数在开发过程中,可以更高效的实现代码重用

函数的使用步骤

定义函数

def 函数名(参数):
代码1
代码2
......

调用函数

函数名(参数)

注意:

  1. 不同的需求,参数可有可无。

  2. 在Python中,函数必须先定义后调用

示例

需求:复现ATM取钱功能。

视频写的

  1. 搭建整体框架(复现需求)

print('密码正确登录成功')

# 显示"选择功能"界面

print('查询余额完毕')

# 显示"选择功能"界面

print('取了2000元钱')

# 显示"选择功能"界面
  1. 确定“选择功能”界面内容

print('查询余额')
print('存款')
print('取款')
  1. 封装"选择功能"

注意:一定是先定义函数,后调用函数。

# 封装ATM机功能选项 -- 定义函数
def select_func():
print('-----请选择功能-----')
print('查询余额')
print('存款')
print('取款')
print('-----请选择功能-----')
  1. 调用函数

在需要显示“选择功能”函数的位置调用函数。

print('密码正确登录成功')
# 显示"选择功能"界面 -- 调用函数
select_func()

print('查询余额完毕')
# 显示"选择功能"界面 -- 调用函数
select_func()

print('取了2000元钱')
# 显示"选择功能"界面 -- 调用函数
select_func()

自己写的

自定义函数必须先定义,再调用

函数名只能小写


# 函数只能先定义再调用
# 搭建整体框架
"""
输入密码登录成功后显示功能
查询余额后显示功能
取完钱后显示功能

"""

# 确定选择功能界面:

# 封装函数
def selects_fun(j):
if j == 1:
print("查询余额,余额XXX元人民币整")
elif j == 2:
print("取款XXX元人民币整")
elif j == 3:
print("存款XXX元人民币整")
elif j == 4:
print("完成操作,ATM机即将退出银行卡!")
if j < 4:
print('-----请选择功能-----')
print("1-查询余额")
print("2-存款")
print("3-取款")
print("4-退卡")
print('-----请选择功能-----')


def nextroots_fun(number):
match number: # 使用match...case语句只能在Python3.10版本及以上版本才能运行
case 1: # 显示功能界面: 显示余额
selects_fun(1)
# 显示功能界面: 显示余额
case 2: # 显示功能界面: 取款
selects_fun(2)
case 3: # 显示功能界面: 存款
selects_fun(3)
case 4: # 显示功能界面: 退卡
selects_fun(4)
case _:
print("对不起,该功能暂未开发,请重新选择!")


i = 0
password_dly = 792638 # 提前内置密码
# print(type(password_dly)) # int类型
while i in range(0, 3):
password = int(input('请输入6位银行卡密码:'))
if password == password_dly:
print('恭喜您登录成功')
# 显示功能界面: 显示余额 存款 取款
print('-----请选择功能-----')
print("1-查询余额")
print("2-存款")
print("3-取款")
print("4-退卡")
print('-----请选择功能-----')
n = 0
while n in range(0, 10):
n = int(input("请选择您的下一步:"))
nextroots_fun(n)
if n == 4:
print("注意:请及时取出银行卡,妥善保存!")
break
break
else:
if i < 2:
print("密码输入错误,请重新输入")
i += 1
continue
else:
print("密码输入错误超过三次,卡被ATM机吞入,")
print("请联系银行工作人员,凭本人有效证件领取银行卡!!!""")
break

结论:

1.函数先定义后调用, 若先调用会报错
2.如果没有调用函数,函数里面的代码不会执行
3.函数执行流程当调用函数的时候,解释器会回到定义函数的地方去执行函数内部的代码,代码执行完成之后,继续执行向下执行定义函数的时候,函数体内部缩进的代码并没有执行

函数的参数作用

思考:完成需求如下:一个函数完成两个数1和2的加法运算,如何书写程序?

# 定义函数
def add_num1():
result = 1 + 2
print(result)


# 调用函数
add_num1()

#自己写的
def add_nums(i, j):
ret = i + j
return ret


print(add_nums(1, 2))

思考:上述add_num1函数只能完成数字1和2的加法运算,如果想要这个函数变得更灵活,可以计算任何用户指定的两个数字的和,如何书写程序?

分析:用户要在调用函数的时候指定具体数字,那么在定义函数的时候就需要接收用户指定的数字。函数调用时候指定的数字和定义函数时候接收的数字即是函数的参数。

定义函数的参数—形参,不可变

调用函数的参数—实参,可变

# 定义函数时同时定义了接收用户数据的参数a和b,a和b是形参
def add_num2(a, b):
resu lt = a + b
print(result)


# 调用函数时传入了真实的数据10 和 20,真实数据为实参
add_num2(10, 20)

# 自己写的
def add_nums(i, j):
ret = i + j
return ret


print(add_nums(10, 20))

函数的返回值return作用

例如:我们去超市购物,比如买烟,给钱之后,是不是售货员会返回给我们烟这个商品,在函数中,如果需要返回结果给用户需要使用函数返回值return。

def buy():
return '烟'

# 使用变量保存函数返回值
goods = buy()
print(goods)

return作用:

1.负责函数返回值

2.退出当前函数体,导致函数体内部的return下方所有代码不被执行

应用

需求:制作一个计算器,计算任意两数字之和,并·保存结果。

def sum_num(a, b):
return a + b


# 用result变量保存函数返回值
result = sum_num(1, 2)
print(result)

函数的说明文档

思考:定义一个函数后,程序员如何书写程序能够快速提示这个函数的作用?

答:注释

思考:如果代码多,我们是不是需要在很多代码中找到这个函数定义的位置才能看到注释?如果想更方便的查看函数的作用怎么办?

答:函数的说明文档

函数的说明文档也叫函数的文档说明。

语法

  • 定义函数的说明文档

def 函数名(参数):
""" 说明文档的位置 """
代码
......
  • 查看函数的说明文档

help(函数名)

快速体验

def sum_num(a, b):
""" 求和函数 """
return a + b


help(sum_num)

image-20190219112749727

**注:**在自定义函数内部第一行加三对双引号,在引号内部加说明

函数嵌套调用

所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数

  • 示例

def testB():
print('---- testB start----')
print('这里是testB函数执行的代码...(省略)...')
print('---- testB end----')

def testA():
print('---- testA start----')
# 嵌套调用函数B
testB()
print('---- testA end----')

testA()
  • 效果

image-20190219113648783

  • 执行流程

image-20190219113648783

  • 如果函数A中,调用了另外一个函数B,那么先把函数B中的任务都执行完毕之后才会回到上次 函数A执行的位置。

函数应用

打印图形

  1. 打印一条横线

def print_line():
print('-' * 20)


print_line()

image-20190219155107988

  1. 打印多条横线

def print_line():
print('-' * 20)


def print_lines(num):
i = 0
while i < num:
print_line()
i += 1


print_lines(5)

# 自己写的
def print_line():
print("--"*20)

def line_num(number):
i = 0
while i in range(0, number): # i < number
print_line()
i += 1


line_num(int(input('打印行数:')))

image-20190219155040124

函数计算

  1. 求三个数之和

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


result = sum_num(1, 2, 3)
print(result) # 6
  1. 求三个数平均值

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 #以整数形式打印 print('%2d' % average_num(1, 2, 3))

总结

  • 函数的作用:封装代码,高效的代码重用

  • 函数使用步骤

    • 定义函数
    def 函数名():
    代码1
    代码2
    ...
    • 调用函数

    函数名()
  • 函数的参数:函数调用的时候可以传入真实数据,增大函数的使用的灵活性

    • 形参:函数定义时书写的参数(非真实数据)
    • 实参:函数调用时书写的参数(真实数据)
  • 函数的返回值

    • 作用:函数调用后,返回需要的计算结果
    • 写法
    return 表达式
  • 函数的说明文档

    • 作用:保存函数解释说明的信息
    • 写法
    def 函数名():
    """ 函数说明文档 """
  • 函数嵌套调用:一个函数内部嵌套调用另外一个函数