v>
软件测试
广州博才科技开发有限公司
迅捷PDF编辑器
2.5 函数
学习目标:
1. 能够说出函数的作用
2. 能够说出函数定义的的语法格式
3. 能够说出函数编写的单一职责原则是什么
4. 能够说出函数文档的作用
2.5.1 函数的作用
请问: 我家里种地需要锄头, 我是每次去锄地时重新做一把锄头, 还是提前做好一把锄头, 需要时直接拿来用?
很显然, 每次重新做都是重复劳动, 浪费时间. 所以我们选择提前做好一把锄头, 每次直接拿来用, 这里面就是一种复
用的思想. 程序设计思想来源于生活, 所以在程序中也有复用的思想, 只不过复用的是代码.
我们的代码是完成某些固定任务, 如果需要频繁解决这个问题, 那么解决这个问题的代码就可以提前写好, 需要解决
该问题时, 直接拿来用.
例如: 我在代码文件的多个地方都需要计算1-100累加和这个功能, 那么怎么解决这个问题呢?
最简单的方式就是将咱们之前的代码拷贝到需要这个功能的地方. 这么写也很明显带来一个问题, 如果这个累加和的
功能实现改变了, 意味着所有地方都需要修改, 增加了代码的维护量.
怎么解决呢? 通过将这个功能封装成一个单独的功能代码块, 只要需要该功能, 直接使用该功能代码块, 这个功能代
码块我们也叫做函数.
简言之, 函数的作用就是将常用的代码封装起来, 便于以后使用.
2.5.2 函数语法格式
在 Python 中, 函数使用 def 关键字来定义, 包含函数的名字(功能的名字), 函数的实现(实现功能的代码).
函数的行为分为: 函数定义和函数调用.
1. 函数定义是实现函数功能的过程.
2. 函数调用是使用功能.
注意: 函数不调用是不会自动执行的.
def 函数名():
一行或者多行代码
那么1-100这个功能我们就可以写成这样的一个函数(功能代码块).
def my_sum():
i = 1
s = 0
while i <= 100:
s = s + i
i += 1
print("1~100的累积和为:%d" % s)
34软件测试
广州博才科技开发有限公司
迅捷PDF编辑器
# 函数调用
my_sum()
当使用该功能时直接调用该函数即可.
2.5.2.1 函数的参数
再思考一个问题: 我们发现这个函数只能计算1-100的累加和, 我们能否让函数的功能支持从指定开始到结束
的数字累加和?
我们可以将我们要开始和结束数字传递给函数, 让函数按照我们传递的参数来计算.
def my_sum(start, end):
my_start = start
my_end = end
my_sum = 0
while my_start <= my_end:
my_sum = my_sum + my_start
my_start += 1
print("%d~%d的累积和为:%d" % (start, end, my_sum))
# 函数调用
my_sum(2, 50)
函数参数的作用就是让函数依据我们给定的值来进行运算. 这样可以增强函数的通用性. 函数可以有多个参数.
例如: 我们想要编写一个具有加法功能函数, 很显然需要两个参数.
def my_add(num1, num2):
result = num1 + num2
print('num1 + num2 =', result)
my_add(10, 20)
我们在调用函数时传递的真实数据叫做实参, 函数参数叫做形参, 形参只是代表真实传递的数值.
多个函数参数再传递时是从左向右传递的. 当然, 在 Python 中我们也可以指定某个值给那个形参.
def my_add(num1, num2):
result = num1 + num2
print('num1 + num2 =', result)
my_add(num1=10, num2=20)
my_add(num2=20, num1=10)
1. 按照从左向右的顺序传递叫做位置参数.
2. 按照形参名字传递叫做关键字参数.
能否在调用函数时既传递位置参数, 又传递关键字参数呢?
def my_add(num1, num2, num3, num4):
result = num1 + num2 + num3 + num4
return result
my_add(100, 200, 300, num2=10)
35软件测试
广州博才科技开发有限公司
迅捷PDF编辑器
可以, 只需要保证位置参数在关键字参数之前即可.
2.5.2.2 函数的返回值
请思考下面两个问题:
1. 现在我们的函数在计算完结果之后, 把结果放到哪里了?
2. 我的程序需要继续使用函数的结计算果来进行下一步计算, 该怎么办?
使用 return 语句将函数的运行结果返回给函数的调用者.
def my_add(num1, num2):
result = num1 + num2
return result
# 使用一个变量保存函数执行的结果
my_add_result = my_add(10, 20)
# 使用结果进行下一步计算
finish_result = my_add_result + 100
# 输出最终结果
print('最终结果:', finish_result)
print函数 和 return 的区别是什么?
print 只负责将内容输出到屏幕显示. 而 return 会将函数计算结果, 返回给函数的调用者.
比如: 函数类似于一个工厂, 我们将工厂生产所需要的材料通过参数的形式传递给工厂, 工厂使用我们传递的材料生
产出产品.
print 相当于生产完产品后, 说了一句 "产品生产完毕", 但是并不会把产品给用户.
而 return 相当于生产完产品之后, 并将产品交到用户手里. 那么用户就需要用一个篮子来装产品(用变量来保存函数
的返回值). 当然, 虽然工厂将产品给了用户, 用户也可以不要(忽略函数的返回值).
关于 return 注意下以下几点.
1. 只要函数执行碰到 return 就会停止执行.
2. 函数中可以编写多个 return, 但有且只有一个 return 会执行.
3. return 后面可以跟上要返回的值, 也单独使用相当于 return None.
4. break 用在循环中, 用来终止循环执行. return 用在函数中, 用来终止函数执行.
2.5.2.3 局部变量和全局变量
1. 全局变量: 在函数外部定义的变量. 全局指的是该变量在当前 python 文件范围内是可见的. 全局变量可以被当
前 python 文件内的所有函数直接使用.
2. 局部变量: 在函数内部定义的变量. 该变量只能在定义的函数内部使用.
# 定义全局变量
g_val = 100
# 在函数内部可以访问全局变量
def my_function1():
print(g_val)
36软件测试
广州博才科技开发有限公司
迅捷PDF编辑器
# 在函数内部定义局部变量 my_val
def my_function2():
my_val = 100
# 尝试输出 my_function2 函数中定义的局部变量
def my_function3():
print(my_val)
# 函数调用
my_function1()
my_function2()
my_function3()
如果局部变量和全局变量命名冲突, Python 解释器会怎么做?
total_value = 100
def my_function():
total_value = 200
print('total_value:', total_value)
my_function()
请问: 上面的代码输入结果是什么?
Python 解释器会在函数内部搜索变量 total_value, 如果找到了就直接使用, 如果找不到则到全局范围内搜索.
2.5.2.4 函数的缺省参数(默认参数)
默认参数指的是当函数调用中省略了实参时默认使用的值.
默认参数的语法与使用:
1. 在函数声明或定义时, 直接对参数赋值. 这就是设置形参的默认参数.
2. 在函数调用时, 省略部分或全部的参数. 这时可以用默认参数来代替.
def my_function(a, b=20, c=30):
return a+b+c
my_function(10)
my_function(10, 100)
my_function(10, 100, 1000)
注意: 带有默认值的参数一定要位于参数列表的最后面.
2.5.3 函数文档及作用
函数也需要添加注释, 方便函数功能、参数以及返回值的含义能够被调用者知悉. 但普通的单行多行注释, 需
要查看函数定义时才能看到, 有没有一种方式能够在调用时快捷查看函数相关信息?
DocString 是一个重要的工具, 由于它帮助你的程序文档更加简单易懂.
37