『无为则无心』Python函数 — 25、Python中的函数
Python函数的说明:
Python中函数的应用非常广泛,前面章节中我们已经接触过多个函数,比如 input()
、print()
、range()
、len()
函数等等,这些都是 Python 的内置函数,可以直接使用。
除了可以直接使用的内置函数外,Python 还支持自定义函数,即将一段有规律的、可重复使用的代码定义成函数,从而达到一次编写、多次调用的目的。
函数也是一个对象,对象是内存中专门用来存储数据的一块区域。
1、函数的使用
(1)定义函数
格式:
def 函数名(参数):
代码1
代码2
......
你可以定义一个自己想要功能的函数,以下是简单的规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串,用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的
return
相当于返回None
。
(2)调用函数
函数名(参数)
注意:
- 函数名是自定义的标识符,需符合定义标识符的规则与规范。
- 不同的需求,参数可有可无。
(3)使用函数的注意事项
- 在Python中,函数必须先定义后使用
如果先调用会报错,NameError: name 'info_print' is not defined
。 - 如果没有调用函数,函数里面的代码不会执行,需要调用函数代码才会执行。
- 函数执行流程
- 解释器执行定义函数的时候,函数体内部缩进的代码并没有执行。
- 当函数被调用的时候,解释器回到定义函数的地方去执行下方缩进的代码,当这些代码执行完,回到调用函数的地方继续向下执行。
练习:
# 需求:一个函数:打印hello world
# info_print() # 报错函数未定义
# 定义函数
def info_print():
print('hello world')
# 调用函数
info_print()
2、函数的参数
在Python中,函数参数的写法有很多种,我们先来说一下,最简单参数的写法。
思考:完成需求如下:一个函数完成两个数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)
# 定义函数有2个参数,传入数据也要是2个,一定要相等,否则会报错
# 结果:TypeError: add_num2() missing 1 required positional argument: 'b'
add_num2(100) # 报错
总结:
函数的参数:函数调用的时候可以传入真实数据,增大函数的使用的灵活性.
- 形参:函数定义时书写的参数(非真实数据),定义形参就相当于在函数内部声明了变量,但是并不赋值。
- 实参:函数调用时书写的参数(真实数据)。
如果函数定义时,指定了形参,那么在调用函数时也必须传递实参,实参将会赋值给对应的形参。
简单来说,调用函数时有几个形参就得传几个实参。
3、实参的类型
函数在调用时,解析器不会检查实参的类型,实参可以传递任意类型的对象。
任何数据类型,包括函数对象。
示例:
# 定义函数1
def fn1(a):
print('a =', a)
# 定义函数2
def fn2(b):
print('b =', b)
b = 123 # b = 123
b = True # b = True
b = 'hello' # b = hello
b = None # b = None
b = [1, 2, 3] # b = [1, 2, 3]
fn2(b)
fn2(fn1) # b = <function fn1 at 0x0000000002555948>
没有类型检查,有时候会导致出现一些问题,如下:
def fn3(a, b):
print(a + b)
fn3(123, "456")
# 结果:TypeError: unsupported operand type(s) for +: 'int' and 'str'
# 显示不支持字符串和数值相加
所以以后我们在调用函数的之后,一定要看看传递实参的数据类型是否正确。
以后我们学到异常的时候,可以通过异常来解决因传递参数类型错误,而引发的异常。