1、函数的定义与调用
函数是组织好的、实现单一功能或相关联功能的代码段。我们可以将函数视为一段有名字的代码,这类代码可以在需要的地方以“函数名()”的形式调用。
开发人员也可以根据自己的需求定义函数,Python中使用关键字def来定义函数,其语法格式如下:
image.png
函数在定义完成后不会立刻执行,直到被程序调用时才会执行。语法格式如下:函数名([参数列表])
无参无返回值函数:
无参无返回值函数:指函数定义时没有设置参数,也没有返回值。
image.png
无参无返回值函数:
无参有返回值函数:指函数定义时没有设置参数,有设置返回值。
image.png
有参无返回值函数:
有参无返回值函数:指函数定义时有设置参数,没有返回值.
image.png
有参有返回值函数:
有参有返回值函数:指函数定义时有设置参数,也有设置返回值.
image.png
2、函数参数的简单传递
我们通常将定义函数时设置的参数称为形式参数(简称为形参),将调用函数时传入的参数称为实际参数(简称为实参)。函数的参数传递是指将实际参数传递给形式参数的过程。
函数参数的简单传递可以分为位置参数传递、关键字参数传递、默认参数传递。
位置参数的传递:
函数在被调用时会将实参按照相应的位置依次传递给形参,也就是说将第一个实参传递给第一个形参,将第二个实参传递给第二个形参,以此类推。
关键字参数的传递:
关键字参数的传递是通过“形参=实参”的格式将实参与形参相关联,将实参按照相应的关键字传递给形参。
默认参数的传递:
函数在定义时可以指定形参的默认值,如此在被调用时可以选择是否给带有默认值的形参传值,若没有给带有默认值的形参传值,则直接使用该形参的默认值。
函数参数的复杂传递:
若希望函数能够处理的参数比当初定义的参数个数多,可以使用不定长参数。基本格式为在定义函数时为形参添加“*”或“**”。
在形参前面添加“*”表示接收位置参数传递的多个值,返回值为元组格式为:
格式为:
def 函数(*args):
函数体
return语句
若函数参数*args为空,则接受到的数据为空元组。
在形参前面添加“**”表示以关键字参数传递的多个值,返回值为字典格式为:
def 函数(**kwargs):
函数体
return语句
若函数参数**kwargs为空,则接受到的数据为空字典。
函数参数传递的方式在定义函数或调用函数时可以混合使用,但是需要遵循一定的规则,具体规则如下。
优先按位置参数传递的方式。
然后按关键字参数传递的方式。
之后按默认参数传递的方式。
最后按不定长参数传递的方式。
注意:在定义函数时:
带有默认值的参数必须位于普通参数之后。
带有“*”标识的参数必须位于带有默认值的参数之后。
带有“**”标识的参数必须位于带有“*”标识的参数之后。
局部变量和全局变量:
变量并非在程序的任意位置都可以被访问,其访问权限取决于变量定义的位置,其所处的有效范围称为变量的作用域。
根据作用域的不同,变量可以划分为局部变量和全局变量。
局部变量:
函数内部定义的变量,只能在函数内部被使用;函数执行结束之后局部变量会被释放,此时无法再进行访问。
不同函数内部可以包含同名的局部变量,这些局部变量的关系类似于不同目录下同名文件的关系,它们相互独立,互不影响。
例如:定义一个函数test(),并调用函数test,打印变量name和score:
def test():
name='张三'
score=88
print('姓名:',name)
print('考试分数:',score)
全局变量:
全局变量可以在整个程序的范围内起作用,它不会受到函数范围的影响。
全局变量在函数内部只能被访问,而无法直接修改。
定义一个函数test(),并调用函数test,打印变量name和score:
name='张三'
score=88
def test():
print('姓名:',name)
print('考试分数:',score)
global和nonlocal 关键字:
函数内部无法直接修改全局变量或在嵌套函数的外层函数声明的变量,但可以使用global或nonlocal关键字修饰变量以间接修改以上变量。
使用global关键字可以将局部变量声明为全局变量,其使用方法如下:
global 变量
使用nonlocal关键字可以在局部作用域中修改嵌套作用域中定义的变量,其使用方法如下:
nonlocal 变量