目录
1. 函数介绍
函数:是组织好的,可重复使用的,用来实现特定功能的代码段。
name = "CCZU"
print(len(name))
为什么随时都可以使用len()统计长度呢?因为,len()是Python内置的函数,这是提前写好的,可以被重复利用,专门用来统计字符串长度这一功能。我们使用过的:input()、print()、str()、int()等都是Python的内置函数。
如果库里没有设置这一内置函数,我们在每次想用这个功能的时候,就要实现下面这好几行代码。
str = "string"
length = 0
for i in str:
length+=1
print(length)
像这种需要经常复用的功能,为了降低代码的重复,Python已经贴心的为大家写好了,想用的时候直接找到对应功能的函数使用即可,这就是将这个功能封装成了函数。
def my_len(str):
length = 0
for i in str:
length += 1
print(length)
# 每次使用的时候直接调用即可
my_len("hello")
my_len("what")
my_len("please")
那我们下面来学习一下怎么将这些频繁使用的代码封装成函数。
2. 函数的定义
注意:
① 参数如不需要,可以省略
② 返回值如不需要,可以省略
③ 函数必须先定义后使用
函数定义之后,想使用定义的函数就要调用,根绝我们的定义来决定怎么调用。有返回值就要用变量来接收,有参数一定要传参数。
def say_hi():
print("hi")
# 调用函数
say_hi()
3. 函数的参数
传入参数的功能是:在函数进行计算的时候,接受外部(调用时)提供的数据。
比如我们要实现一个将两个数相加的功能函数,那我们肯定要让这个函数知道需要哪两个数相加,参数大家可以理解为参考的数据。也就是说这个相加的函数想知道自己要让哪些数加起来,就参考我们传的这些参数。
def add(x,y):
print(x+y)
- 函数定义中,提供的x和y,称之为:形式参数(形参),表示函数声明将要使用2个参数
- 参数之间使用逗号进行分隔
- 函数调用中,提供的5和6,称之为:实际参数(实参),表示函数执行时真正使用的参数值
- 传入的时候,按照顺序传入数据,使用逗号分隔
最后一点大家要尤其注意,因为如果这个功能是实现两个数相除的,那么1/2和2/1可是完全不一样的两个结果。
4. 函数的返回值
如果我们想在调用函数的时候用一个变量接收函数调用后的结果,这个时候需要给函数加上返回值。
def add(x,y):
return x+y
result = add(1,2)
print(result)
函数体在遇到return后就结束了,所以写在return后的代码不会执行。
如果函数没有使用return语句返回数据,那么函数实际上也是有返回值的。Python中有一个特殊的字面量:None,其类型是:<class ‘NoneType‘>。无返回值的函数,实际上就是返回了None这个字面量。
None表示:空的、无实际意义的意思。函数返回的None,就表示这个函数没有返回什么有意义的内容,也就是返回了空的意思。
def say_he11o():
print("He11o...")
# 使用变量接收say_he11o函数的返回值
result = say_he11o()
# 打印返回值
print(result) # 结果None
# 打印返回值类型
print(type(result)) # 结果<cass'NoneType'>
None也可以主动使用return返回,效果等同于不写return语句。
None作为一个特殊的字面量,用于表示:空、无意义,其有非常多的应用场景。
- 用在函数无返回值上
- 用在if判断上:在if判断中,None等同于False;一般用于在函数中主动返回None,配合if判断做相关处理
def check_age(age):
if age > 18:
return "success"
return None
result = check_age(5)
if not result:
# 进入if表明result是None值,也就是False
print("未成年,不可进入")
- 用于声明无内容的变量上:定义变量,但暂时不需要变量有具体值,可以用None来代替
name = None
5. 函数说明文档
函数是纯代码语言,想要理解其含义,就需要一行行的去阅读理解代码,效率比较低。我们可以给函数通过多行注释的形式添加说明文档,辅助理解函数的作用。我们在函数体之前写上函数参数表示什么,返回值什么,函数功能是什么。
def add(x, y):
"""
add函数可以接收2个参数,进行2数相加的功能
:param x: 形参x表示相加的其中一个数字
:param y: 形参y表示相加的另一个数字
:return: 返回值是2数相加的结果
"""
result = x + y
print(f"2数相加的结果是: {result}")
return result
6. 函数的嵌套调用
所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数。
# 定义函数func_b
def func_b():
print("---2---")
# 定义函数func_a,并在内部调用func_b
def func_a():
print("---1---")
# 嵌套调用func_b
func_b()
print("---3---")
# 调用函数func_a
func_a()
如果函数A中,调用了另外一个函数B,那么先把函数B中的任务都执行完毕之后才会回到上次函数A执行的位置。
7. 函数的作用域
变量作用域指的是变量的作用范围(变量在哪里可用,在哪里不可用)。主要分为两类:局部变量和全局变量。
(1). 局部变量
局部变量是定义在函数体内部的变量,即只在函数体内部生效。
def testA():
num = 100
print(num)
testA() # 100
print(num) # 报错:name 'num'is not defined
变量a是定义在`testA`函数内部的变量,在函数外部访问则立即报错。
局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。
(2). 全局变量
所谓全局变量,指的是在函数体内、外都能生效的变量。
如果有一个数据,在函数A和函数B中都要使用,就要将这个数据存储在一个全局变量里面,也就是定义在函数的外面。
# 定义全局变量a
num = 100
# 定义函数testA,并访问全局变量num
def testA():
print(num)
# 定义函数testB,并访问全局变量num
def testB():
print(num)
testA() # 100
testB() # 100
print(num) # 100
(3). global关键字
如果我们想要在函数内部对全局变量的值进行修改,修改的值仅在函数体内部有效。
# 定义全局变量a
num = 100
# 定义函数testA,并访问变量num
def testA():
print(num)
# 定义函数testB,并访问变量num
def testB():
num = 300
print(num)
testA() # 100
testB() # 300
print(num) # 100
这是因为testB里num=300实际上是testB自己又重新定义了一个num的局部对象,跟全局变量num已经不是同一个东西了。为了让这个局部变量num变回全局变量,我们引入了global关键字。
# 定义全局变量a
num = 100
# 定义函数testA,并访问全局变量num
def testA():
print(num)
# 定义函数testB,并访问全局变量num
def testB():
# global关键字用于将变量声明为全局变量
global num
num = 300
print(num)
testA() # 100
testB() # 300
print(num) # 300