1. 函数定义格式
def 函数名(形参列表)
函数体
return语句
注意:
- 一个函数可以有一个或多个形参,也可以没有形参。
- 一个函数中可以有一个或多个return语句,执行到return语句时函数会立即执行结束,回到调用位置。
- Python是动态类型语言,函数的形参和返回值都不必指定类型,因此一个函数可以支持多种不同类型的参数。
- Python中的一个函数可以有一个或多个返回值,当有多个值需要返回时,使用
,
来分隔这多个返回值 - Python中一个函数能返回多个值,本质就是多元赋值所支持的。如果函数调用者只想关注该函数的部分返回值,那么可以使用
_
来忽略不想要的返回值。
def test(a,b):
return a+b , a-b
a = 10
b = 12
_,dif = test(a,b)
print(dif) # -2
2. 函数的调用方式
2.1 链式调用
链式调用指的是把一个函数的返回值,作为调用另一个函数时的参数进行传入。
def Add(x, y):
return x + y
print(Add(10, 20)) # 30
2.2 嵌套调用
嵌套调用指的是在一个函数的函数体内部,调用了其他函数。
def test():
print('test()')
test()
2.3 递归调用
递归掉是嵌套调用的一种特殊情况,即在一个函数内部嵌套调用自己。
#求一个数的阶乘
def factor(n):
if n == 1:
return 1
return n * factor(n - 1)
使用递归时需要注意:
- 存在递归结束条件。
- 每进行一次递归,都会逐渐逼近结束条件。
- 避免出现无线递归,导致栈溢出
3. 默认参数和变长参数
3.1 默认参数
可以给函数的形参指定默认值,在调用函数时可以不必给带有默认值的形参传参,此时该形参将会使用我们指定的默认值。
def add(a, b = 1):
return a + b
print(add(1))
print(add(1,3))
需要注意的是,带默认参数的形参,需要在没有默认值的参数后面,这一点和C++的半缺省参数的用法一样,都是从右到左且连续
3.2 变长参数
形参名称前面添加*
,这时函数将接收一个参数元组,并且我们可以以 形参名[下标] 的方式相应地访问传入的各个实参。
def Func(*arg):
n = len(arg)
for i in range(n):
print(arg[i])
Func(1) # 1
Func(1, 2, 3) # 1 2 3
4. 变量作用域
每一个变量都有自己的作用域:
- 定义在函数内部的变量,其作用域仅在该函数内部,称为“局部变量”。
- 定义在函数外部的变量,其作用域是全局的,称为“全局变量”。
注意事项:
-
变量只能在自己所在的函数内部生效。
-
在不同的作用域中,允许存在同名的变量。
-
函数内部尝试访问的变量在局部不存在,就会尝试去全局域中查找
a = 10
def test():
print(f'a = {a}')
test() # a = 10
- 如果想要在函数内部修改全局变量的值,就需要使用global关键字进行声明
a = 10
def test():
global a
a = 1000
print(f'a = {a}')
test() # a = 1000
- 在函数内部修改全局变量时没有用global关键字进行声明,那么Python会认为你是想在函数内部创建一个同名的局部变量,此时的修改操作就不会影响到对应的全局变量。
a = 10
def test():
a = 1000
print(f'a = {a}')
test() # a = 1000
print(a) # 10
- if、while、for中的变量
- python中的 if、while、for中的变量和C/C++中的循环中的变量区别很大
- Python中的if、while、for等语句块不会影响变量的作用域,因此在这些语句块中定义的变量,也能在外面正常使用。
for i in range(10):
print(f'函数内: i = {i}')
print(f'函数外部: i = {i}') # i = 9
- 如果把for循环放进函数体内,那就不能在函数外使用这个变量