python基础——函数(一)
本文最后更新于:1 年前
¶(一)概述
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段,能提高应用的模块性,和代码的重复利用率。
¶1. 基本概念:
函数用于在程序中分离不同的任务,主要目的是代码的复用,也就是同一块代码的执行特定功能的重复使用,定义和使用函数是Python程序设计的重要组成部分。
函数允许自己调用自己,此过程称为递归调用。
¶2. 函数功能:
-
实现特定功能:通过函数完成特定功能的设计,可以实现各种复杂算法。
-
结构化程序设计:通过把程序分割为不同的功能模块可以实现自顶向下的结构化设计。
-
减少程序的复杂度:简化程序的结构,提高程序的可阅读性。
-
实现代码复用:一次定义多次调用,实现代码的可重用性。
-
提高代码的质量:实现分割后子任务的代码相对简单,易于开发、调试、修改和维护。
-
协作开发:在将大型项目分割成不同的子任务后,团队多人可以分工合作,同时进行协作开发。
¶3. 函数分类:
-
内置函数:Python语言的内置函数,在程序中可以直接使用,是一些常用的函数。
-
标准库函数:Python语言中有一些标准库,是特定功能/程序的集合,通过import导入标准库后可以使用标准库的函数简化程序实现。
-
第三方库函数:Python语言中的社区开发的其他库,由用户开发,功能繁多,可以根据需要下载、安装、导入再使用其定义的函数。
-
用户自定义的函数,如何利用Python语言定义、使用自己的函数。
下面分别说明函数的定义、调用和函数式编程。
¶(二)定义
¶1. 格式及语法:
def functionname( parameters ):
"函数_文档字符串"
function_suite
return [expression]
-
def:定义函数的关键词,必须包含。
-
functionname:函数标识符,也就是函数名,是我们调用函数时的使用依据。
-
(parameters):形参列表,在**”()“内定义函数需要使用的参数,多个参数用”,“分割,允许使用空形参列表定义函数,但是不能省略“()”和后面的”:“**
形参列表用于接收调用传入的各种参数,形参数量和使用/传入类型必须一一匹配,但注意形参列表中是不需要说明参数类型的,主要是使用时进行检查
-
"函数_文档字符串":函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
现在不建议直接使用此格式,用注释即可完成说明。
如果要使用,可以通过调用Python的help()内置函数或者_doc_属性来查看某个函数的使用说明文档
-
function_suite:执行语句代码块,利用传入的函数和内部的代码完成函数要执行的功能,是函数的主体,允许没有此代码块。
函数的执行会引入一个用于函数局部变量的新符号表,此局部符号表存储了所有新定义的变量和传入的参数变量,而如果是变量引用,会首先在最内层的局部符号表中查找,然后是外层函数的局部符号表,再然后是全局符号表,最后是内置名称的符号表。
在函数被调用时,实际参数(实参)会被引入被调用函数的本地符号表中——实参是通过按值调用传递的,值是对象引用而不是对象的值)。
函数调用另一个函数,会为其创建一个新的本地符号表,新局部符号表被视为内部的符号表。
实质:变量作用域从内向外递归查找。
重命名机制:函数定义会把函数名也引入到符号表中,其类型为用户定义函数类型,此值因此可以分配给一个新的名称,新名称即可作为函数使用。
-
return [expression]:返回值,函数执行命令的处理结果被返回,如果不需要返回值可以不写return,但是实际上还是有函数默认返回值None。
一般情况下需要设置指定返回值,返回值可以返回多个对象,对象间用”,“进行分割,当为多个返回类型时,返回类型被视为一个元组,因此其返回值的保存需要按照元组的赋值来进行。
¶2. 定义的四个基本类型:
¶(1)无参数无返回值,通常是执行一些固定的内容。
例子:
1 |
|
¶(2)无参数有返回值,用于获得一些需要的固定内容:
多个return语句也只会返回第一个执行的return结果
例子:
1 |
|
¶(3)有参数无返回值,可以用于参数的输出或者参数的一些操作等等。
例子:
1 |
|
¶(4)有参数有返回值,最常用。
例子:
1 |
|
¶3. 全局和局部变量:
变量声明的位置不同,其可以被访问的范围也不同。变量的可被访问范围称为变量的作用域。变量按其作用域大致可以分为全局变量、局部变量和类成员变量。
¶(1)全局变量:
在函数和类定义之外声明的变量称为全局变量,其作用域只在定义的模块之内,从其定义的位置开始,直到模块结束的位置。
单个模块的变量可以通过import引入访问。
不同引入模块都可以使用全局变量,多语句对其的修改可能会导致全局变量的管理混乱,降低模块之间的通用性和可读性,应当尽量避免使用去全局变量反复修改,而是作为常量使用。
¶(2)局部变量:
在函数中定义的变量和参数变量都是局部变量,作用域范围只在函数体内,一旦脱离作用域,不允许被使用。
全局代码不能用局部变量,不同函数之间的局部变量也不可以互相使用。
重名的局部变量会覆盖全局变量。
¶(3)global语句和nonlocal语句:
如果想要在函数中直接使用全局变量,需要在函数内对变量增加global声明,此时是显式说明不使用局部变量,而是使用全局变量。
同样的,对于多个函数的嵌套,可以用nonlocal完成相对应的功能。
例子如下:
1 |
|
¶4. 进阶:匿名函数
python 使用 lambda 来创建匿名函数。(lambda是一个关键字)
匿名是指不适用def的标准形式来定义函数。
匿名函数可以省略定义函数的过程,主要目的是精简代码,减少函数命名,便于理解代码和避免只用一次的函数被定义而增大工作量。
¶(1)语法:
lambda函数的语法只包含一个语句:
<variable>=lambda [arg1 [,arg2,.....argn]]:expression
实际上,等价于:
<变量>=lambda 参数列表:return [表达式] 变量
variable表示对lambda的封装,也就是实际上让这个变量作为了一个函数名,很多时候可以省略,省略时就是真正的匿名函数。
arg1,2......n表示的是参数,对应参数列表,expression则是表达式,对应的是返回值的表达式变量。
¶(2)说明:
-
lambda返回的是函数对象(构建的是一个函数对象),所以需要定义一个变量去接收
-
lambda 只是一个表达式,函数体比 def 简单很多。
-
lambda的主体是一个表达式,而不是一个代码块,所以仅仅能在lambda表达式中封装有限的逻辑
-
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数
¶(3)例子:
1 |
|