一、函数的概念
在日常编程中,如果需要实现一个需求在多处使用,按照目前掌握的知识,你在每次使用时都需要将这个功能实现一次。这样会产生一系列问题、代码重复、可读性差、不易于维护等。因此函数的出现就是为了解决这一问题。函数是一段可复用的代码块,用于执行特定任务。它可以接受输入(参数),进行处理,并返回输出(返回值)。函数的主要作用是提高代码的复用性、可读性和组织性,避免重复代码,使程序更模块化。
二、函数的定义
函数和变量一样,也是先定义后使用。函数的定义的语法如下:
def 函数名(参数1, 参数2, .....):
'''
文档描述
'''
函数体
return 值
这里函数可以没有参数,文档描述是对这个函数功能的描述,日常代码建议写上对函数功能、参数以及返回值的描述,这样日后忘记代码的功能可以快速的查阅。return是函数的返回值,return语句可以不写,默认返回None。下面我们写一个示例函数:
def my_func_01():
print('我的第一个函数')
my_func_01()
## 执行结果
我的第一个函数
以上我们定义了第一个函数,并调用函数产生了运行结果,成功执行了函数体。
三、函数的调用
在上边的示例中,我们使用函数名+括号调用了函数。接下来我们分析一下函数调用的过程。首先函数名my_func_01是一个变量,变量名绑定了一个内存地址,这个内存地址存放在函数体的代码。当调用函数时,函数名绑定内存地址内的代码块就会执行。
函数在定义阶段不会执行代码,但是会检测函数子代码的语法。因此函数体中的逻辑错误在定义阶段是检测不出来的。接下来看调用过程
def my_func_01():
print('我的第一个函数')
print(my_func_01)
## 执行结果
<function my_func_01 at 0x7f7a06712950>
可以看到,函数名就是函数的内存地址。因此函数名+括号也就是这块内存地址+括号,这样就触发了函数的运行。
知道了函数的调用的实质,我们再看一个示例:
a = 1
def func01():
print(a)
print('第一个函数')
func01()
## 执行结果
1
第一个函数
通过这个示例,我们得到函数可以使用函数外定义的变量,那如果在函数外在定义一个函数,函数内能否调用呢?
def func02():
print('第二个函数')
def func01():
func02()
print('第一个函数')
func01()
## 执行结果
第二个函数
第一个函数
如上所示,在函数func01内调用func02是可以正常执行的,因为func02函数名本身可以理解为一个变量名,通过变量名可以获取到第二个函数的内存地址。那我们把函数的定义顺序改一下,先定义func01再定义func02是否会报错?
def func01():
func02()
print('第一个函数')
def func02():
print('第二个函数')
func01()
## 执行结果
第二个函数
第一个函数
执行并不会报错。原因是函数先定义,在定义阶段不会执行代码,先定义func01这时候func02还不存在,但是定义阶段只会检测语法所以不会报错,然后定义func02,最后调用func01时两个函数在内存中都已经存在了,因此可以正常执行。
如果将func01的调用放在func02的定义之前,执行就会报错了,这里读者可以自行测试验证。
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付
