第7章 函数

7.1 函数的概念

  函数可以理解为实现某种功能的代码块,这样当程序中需要这个功能时就可以直接调用,而不必每次都编写一次。

  Python中的函数分为内建函数和自定义函数

  

7.2 函数的定义

定义函数后,就相当于有了一个具有某些功能的代码。如果想让程序执行这些代码,则需要调用之前定义的函数,其语法格式如下:

  函数名(参数)

7.3 函数的参数

  参数列表由一系列参数组成,并用逗号隔开。在调用函数时,如果需要向函数传递参数,则被传入的参数称为实参,而函数定义时的参数称为形参,实参与形参之间可以传递数据。

  7.3.1  位置参数

  位置参数是指函数调用时传递实参的顺序与定义函数的形参顺序一致,如例所示

  

  7.3.2  关键参数

  关键参数是指通过对形参赋值传递的参数。关键参数允许函数调用时传递实参的顺序与定义函数的形参顺序不一致,因为 Python解释器能够用形参名匹配实参值,使用户不必记住位置参数的顺序,如例所示。

  7.3.3 默认参数

  如果在函数定义时参数列表中的某个形参有值,就称这个参数为默认参数。注意默认参数必须放在非默认参数的右侧,否则函数将出错,如例所示。

  

  7.3.4 不定长参数

  函数形参可以接收不定个数的实参,即用户可以给函数提供可变长度的参数,这可以通过在形参前面使用*来实现,如例所示

  

  7.3.5 传递不可变与可变对象

  不可变类型——该类型的对象所代表的值不能被改变。当改变某个变量时,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。

  可变类型——该类型的对象所代表的值可以被改变。变量改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟出新的地址。

  

7.4 函数的返回值

  函数调用时的参数传递实现了从函数外部向函数内部输入数据,而函数的return语句实现了从函数内部向函数外部输出数据

7.5 变量的作用域

  7.5.1 局部变量

  在函数内部定义的普通变量只在函数内部起作用,称为局部变量。当函数执行结束后,局部变量自动删除,不可以再使用,如例所示。

  

  7.5.2 全局变量

  如果需要在函数内部给一个定义在函数外的变量赋值,那么这个变量的作用域不能是局部的,而应该是全局的。能够同时作用于函数内外的变量称为全局变量,它通过global关键字来声明,如例所示。

  

7.6 函数的嵌套调用

Python语言允许在函数定义中出现函数调用,从而形成函数的嵌套调用,如例所示。

7.7 函数的递归调用

在函数的嵌套调用中,一个函数除了可以调用其他函数外,还可以调用自身,这就是函数的递归调用。递归必须要有结束条件,否则会无限地递归(Python默认支持997次递归,多于这个次数将终止)。 接下来演示函数的递归调用,如例所示。

8.1 间接调用函数

前面调用函数时,使用函数名加参数列表的形式调用。除此之外,还可以将函数名赋值给一个变量,再通过变量名加参数列表的形式间接调用函数,如例所示。

8.2 匿名函数

匿名函数是指没有函数名称的、临时使用的微函数。它可以通过lambda表达式来声明,其语法格式如下:

  

8.3 闭包

在前面章节中,函数可以通过return返回一个变量。此外,函数也可以返回另外一个函数名,如例所示。

8.4  装饰器

  8.4.1 装饰器的概念

  装饰器本质上还是函数,可以让其他函数在不做任何代码修改的前提下增加额外功能。它通常用于有切面需求的场景,例如,插入日志、性能测试、权限校验等。 在讲解装饰器之前,先看一段简单的程序,如例所示。

  

  8.4.2 @符号的应用

  上例中使用变量名将装饰器函数与被装饰函数联系起来。此外,还可以通过@符号和装饰器名实现两者的联系,如例所示。

  

  8.4.3 装饰有参数的函数

  

  8.4.4  带参数的装饰器——装饰器工厂

  

8.5 偏函数

  函数最重要的一个功能的是复用代码,有时在复用已有函数时,可能需要固定其中的部分参数,除了设置默认值参数外,还可以使用偏函数(用来固定函数调用时部分或全部参数的函数叫偏函数),如例所示。

8.6 常用的内建函数

  在Python中,内建函数是被自动加载的,可以随时调用这些函数,不需要定义,极大地简化了编程。

8.6.1 eval()函数

  eval()函数用于对动态表达式求值,其语法格式如下:

  

8.6.2  exec()函数

  exec()函数用于动态语句的执行,其语法格式如下:

  

8.6.3 compile()函数

  compile()函数用于将一个字符串编译为字节代码,其语法格式如下:

  

8.6.4 map()函数

  程序中经常需要对列表和其他序列中的每个元素进行同一个操作并把其结果集合起来,具体示例如下:

  

8.6.5 filter()函数

  filter()函数可以对指定序列进行过滤操作,其语法格式如下:

  

8.6.6 zip()函数

  zip()函数用于将一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的迭代对象,如例所示。

  

原文地址:https://www.cnblogs.com/yuanzhihui/p/14058999.html