[Python][函数]详细讲解

DieSnowK 2024-08-03 16:35:01 阅读 55

目录

1.语法格式1.定义函数2.**调用函数**

2.函数参数3.函数返回值4.变量作用域5.函数调用1.链式调用2.嵌套调用3.栈帧4.函数递归

6.参数默认值7.关键字参数


1.语法格式

1.定义函数

函数体需要带缩进:P

<code>def 函数名(形参列表):

函数体

return 返回值

2.调用函数

函数必须先定义,再使用

函数名(实参列表) # 不考虑返回值

返回值 = 函数名(实参列表) # 考虑返回值


2.函数参数

Python里面,形参只要求个数相同,对类型没有要求 -> 动态类型只要保证传入的参数,在函数体内可以正常运转即可这一点与C/C++等语言不一样


3.函数返回值

返回值并不是必须的,可以有,也可以没有Python中,一个函数可以返回多个值,使用,来分隔多个返回值

def GetPoint():

x = 10

y = 20

return x, y

a, b = GetPoint()

如果只想关注其中的部分返回值,可以使用_来占位,以起到忽略不想要的返回值的作用

def GetPoint():

x = 10

y = 20

return x, y

_, b = GetPoint()


4.变量作用域

局部变量:在函数内部的变量全局变量:不在任何函数内部的变量变量只能在所在的函数内部生效

GetPoint() 内部定义的x, y只是在函数内部生效一旦出了函数的范围,这两个变量就不再生效了 在不同的作用域中, 允许存在同名的变量

虽然名字相同,实际上是不同的变量 如果函数内部尝试访问的变量在局部不存在,就会尝试去全局作用域中查找

# 以下代码会输出20

x = 20

def Test():

print(f'x = { x}')

Test()

如果想在函数内部修改全局变量的值,需要使用global关键字声明

如果没有global声明,x = 20就会被Python认为是在函数内部定义了一个局部变量

# 第一次输出:函数内部 x = 10

# 第二次输出:函数外部 x = 10

x = 20

def test():

global x

x = 10

print(f'函数内部 x = { x}')

test()

print(f'函数外部 x = { x}')

注意:if, else, while, for等关键字也引入了代码块

但是这些代码块不会对变量的作用域产生影响在上述语句代码块内定义的变量,可以在外面被访问这点则与C/C++不同,C/C++只要被{}括起来,就会影响变量作用域


5.函数调用

1.链式调用

链式调用:把一个函数的返回值,作为另一个函数的参数

print(AddNum(10, 20))

执行顺序:先执行里面的函数,再一层一层往外执行外面的函数

人话:要调用一个参数,就要先求它的参数:P

2.嵌套调用

嵌套调用:函数内部还可以调用其他的函数

def test():

print("执行函数内部代码")

一个函数里面可以嵌套调用任意多个函数

3.栈帧

调用函数,则生成对应的栈帧

每个变量是保存在各自的栈帧中的 函数结束,则对应的栈帧就被销毁,里面存的变量自然也就没了

4.函数递归

递归:一个函数自己调用自己递归代码务必要保证

存在递归结束条件每次递归的时候,要保证函数的实参是逐渐逼近结束条件的


6.参数默认值

Python 中的函数,可以给形参指定默认值(缺省值)

带有默认值的参数,可以在调用的时候不传参带有默认值的参数需要放到没有默认值的参数的后面

def add(x, y, debug = False):

if debug:

print(f'调试信息: x={ x}, y={ y}')

return x + y

print(add(10, 20))

print(add(10, 20, True))


7.关键字参数

位置参数:调用函数时,需要给函数指定实参,一般默认情况下是按照形参的顺序,来依次传递实参关键字参数:按照形参的名字来进行传参,可以调整传参顺序,显式指定当前实参传递给哪个形参

# 第一次输出结果:x = 10, y = 20

# 第二次输出结果:x = 200, y = 100

def test(x, y):

print(f'x = { x}')

print(f'y = { y}')

test(x=10, y=20)

test(y=100, x=200)

位置参数和关键字参数可以混用,但是要求位置参数在前,关键字参数灾后关键字参数一般搭配默认参数来使用



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。