一个程序可以按不同的功能实现拆分成不同的模块,而函数就是能实现某一部分功能的代码块。
1、函数的概述
定义:在Python中,定义个函数要使用 def 语句,一次写出函数名、括号、括号中的参数和冒号(:),然后在缩进块中编写函数体,函数的返回值用return 语句返回。
def area_of_square(x):
s = x*x
return s
1
def area_of_square(x):
2
s = x*x
3
return s
2、全局变量
定义:在函数外面定义的变量称为全局变量。
作用域:整个代码段(文件、模块),在整个程序代码中都能被访问到。在函数内部可以去访问全局变量。
但不要在函数内部去修改全局变量,否则会得不到想要的结果;因为在函数内部试图去修改一个全局变量是,系统会自动创建一个新的同名局部变量去代替全局变量,采用屏蔽(Shadowing)的方式,当函数调用结束后函数的栈空间会被释放,数据也会随之释放。
如果要在函数内部去修改全局变量的值,并使之在整个程序生效,采用关键字global 即可。
3、局部变量
定义:在函数内部定义的参数和变量称为局部变量
作用域:仅在函数内部。
4、函数的参数
定义:函数的参数就是使得函数个性化的一个实例。
作用:函数有了参数后,输出结果变得可变了;多个参数用逗号 “,” 隔开即可。
4.1 参数传递方式:
在Python中,将函数参数分为三类:位置参数、可变参数、关键字参数。
位置参数:直接传入参数数据即可,如果有多个参数,位置先后顺序不能改变。
定义: 传入参数值按照位置顺序依次赋给参数,这样的参数称为位置参数
可变参数:法一:直接传入参数值
法二:先封装成列表(list)或元组(tuple),再封装后的列表或元组前面添加一个星号 “ * ” 传入。
定义:在定义函数参数的时候,不知道究竟需要多少个参数的时候,只有在参数前面加上星号 “ * ” 即可,这样的参数称为可变参数(又称为收集参数)。
关键字参数:法一:直接传入参数值
法二:先封装成字典(dict),再封装后的字典前面添加两个星号 “ ** ” 传入。
定义:直接给参数赋值,就不会因为顺序不同,导致结果的改变。 在函数调用的时候,通过参数指定需要赋值的参。通常我们在调用一个函数时,参数会有多个,常常会混淆参数的顺序,打不到我们希望的效果。
python引入关键字参数就可以解决这个潜在的问题。
4.2 默认值参数
定义:在定义函数时给参数赋了一个初值,这样的参数称为默认值参数。
5、函数的返回值
函数中如果没有用关键之 return 指定返回值,则返回一个“ None ” 对象。
Python是动态的确定变量类型,Python没有变量,只有名字。Python可以返回多个类型的值。
6、函数的调用
要调用一个函数,需要知道函数的名称和参数; *
函数分为自定义函数和内置函数;自定义函数需要定义再调用,有的内置函数时在特定的模块下,这是需要用 import 命令导入模块后再调用。
可以通过交互式命令help(函数名)查看函数的帮助信息。
6.1 函数嵌套调用
内部函数:函数内部创建另一个函数。内嵌函数的作用域在其内部。
6.2 使用闭包
闭包:函数式编程的一个重要的语法结构。在一个内部函数对一个外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数一分为值闭包(closure)。
注意:不能在全局域内访问闭包,否则会出错。在闭包中,外部函数的局部变量对闭包中的局部变量(相当与全局变量和局部变量的关系),在闭包中能访问外部函数的局部变量,但不能进行修改。
6.3 递归调用
递归的两个条件:调用函数自身;
设置了正确的返回条件。
Python 默认递归深度 100 层( Python 限制)。设置递归的深度系统函数是:sys.setrecursionlimit( stepcount )。参数:stepcount 设置递归的深度。
递归有危险性:消耗时间和空间,因为递归是基于弹栈和出栈操作。
递归忘掉返回使用程序崩溃,消耗掉所有的内存。