【保姆级入门系列】阿ken教你学 Python(五) ——函数

【保姆级入门系列】阿ken教你学 Python(五) ——函数

你好,我是阿ken

我又双叒叕来了!

                                                                                                                                                           

蓝色、灰色为了解内容,其中蓝色多为引用举例。红色为重点记忆。

                                                                                                                                                           

目录

5.1 函数概述

5.2 函数的基础知识

 5.2.1 函数的定义 

5.2.2 函数的调用

5.3 函数的参数传递

5.3.1 参数的位置传递

5.3.2 参数的关键字传递

5.3.3 参数的默认值传递

5.3.4 包裹传递

5.3.5 解包裹传递

5.3.6 混合传递

5.4 函数的返回值

5.5 变量作用域

5.5.1 局部变量

5.5.2 全局变量

5.6 函数的特殊形式

5.6.1 匿名函数

5.6.2 递归函数

5.7 时间处理模块 —— datetime

5.8 代码抽象与模块化设计

5.9 本文总结


快速通道:

【保姆级入门系列】阿ken教你学 Python(四)

【保姆级入门系列】阿ken教你学 Python(五) ——函数

阿ken:咳咳从此刻开始,调整心情,开始上课!

5.1 函数概述

阿ken:函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段,通过函数的名称表示和调用。函数也可以看作是一段有名字的子程序,可以在需要的地方使用函数名调用执行。在学习本文内容之前,其实我们已经接触过一些函数,比如输出信息到命令行窗口的 print() 函数、接收键盘输入信息的 input() 函数等。

函数是一种功能抽象,它可以完成特定的功能,与黑箱模型的原理一样。黑箱模型是指所建立的模型只考虑输入与输出,而与过程机理无关。现实生活中,应用黑箱原理的实物有很多,比如洗衣机,对于使用者来说,大家只需要了解洗衣机的使用方法,将洗衣粉、水放入,最终得到洗干净的衣服,这个过程是完全封闭的。对于函数外界不需要了解其内部的实现原理,只需要了解函数的输入输出方式即可使用,换言之,调用函数时以不同的参数作为输入,执行函数后以函数的返回值作为输出。
函数大体可以划分为两类,一类是系统内置函数,它们由 Python内置函数库提供,例如我们在前面章节中学习的 print()、input()、type()、int() 等函数;另一类是用户根据需求定义的具有特定功能的一段代码。自定义函数像一个具有某种特殊功能的容器 —— 将多条语句组成一个有名称的代码段,以实现具体的功能。

使用函数的好处主要体现在以下几方面:
(1) 将程序分解成更小的块(模块化)。
(2) 降低理解难度,提高程序质量。
(3) 减小程序体积,提高代码可重用性。
(4) 降低了软件开发和维护的成本。

                                                                          
5.2 函数的基础知识                                                         

阿ken:函数的使用可以分为函数的定义和函数的用两部分,它只需要定义一次,便可
                  以无限次地被重复使用。

 5.2.1 函数的定义 

Python 使用 def 关键字定义函数,基本语法格式如下: 

上述语法的介绍如下: 
(1) 关键字def:标志着函数的开始。
(2) 函数名:函数的唯一标识,其命:名方式遵循标识符的命名规则。
(3) 参数列表:可以有零个、一个或多个参数,多个参数之间使用逗号分隔。根据参数的有无,函数分为带参函数和无参函数。
(4) 冒号:用于标记函数体的开始。
(5) 文档字符串:用于描述函数的功能,可以省略。
(6) 函数体:函数每次调用时执行的代码,由一行或多行Python语句构成。
(7) return语句:标志着函数的结束,用于将函数中的数据返回给函数调用者。若函数需要返回值,则使用 return语句返回,否则 return语句可以省略,函数在函数体顺序执行完毕后结束。

定义函数时,函数参数列表中的参数是形式参数,简称为“形参”,形参用来接收调用该函数时传入函数的参数。注意,形参只会在函数被调用的时候才分配内存空间,一旦调用结束就会即刻释放,因此,形参只在函数内部有效。
定义一个求绝对值的函数,示例如下:

以上定义的 my absolute() 函数接收参数x,使用 if-else 语句区分 x的正负,若 x为正数,它的绝对值就是它本身,直接返回 x;否则返回它的相反数。

5.2.2 函数的调用

函数定义好之后不会立即执行,直到被程序调用时才会生效。调用函数的方式非常简单,一般形式如下:

以上形式的参数列表为会被传递给函数的形参、在函数执行过程中会使用的参数,这些参数是实际参数,简称为“实参”。实参可以是常量、变量、表达式、函数等。
调用上述中定义好的 my_absolute()函数,代码如下:

                                                                                                                                       
以上代码中的-10.0是实参,它将被传递给函数定义中的形参x。注意,函数在使用前必须已经被定义,否则解释器会报错。

                                                                                                                                               
程序执行时若遇到函数调用,会经历以下流程:
(1) 程序在函数调用处暂停执行。
(2) 为函数传入实参。
(3) 执行函数体中的语句。
(4) 程序接收函数的返回值(可选)并继续执行。

                                                                                                                                               
定义和调用函数 my_absolute() 的完整代码如下:

对以上程序进行分析: Python 解释器读取第 1 ~ 5 行代码时判定此处定义了一个函数,它先将函数名和函数体存储在内存空间中,但不执行;解释器执行第 6行代码,由于此处调了 my_absolute() 函数,程序首先暂停执行,将该函数的实参 -10.0 传递给形参x (x=-10.0),然后执行函数体内部的语句,函数体执行结束之后重新回到第 6行,最后执行第7行的打印语句。

5.3 函数的参数传递

阿ken:函数的参数传递是指将实参传递给形参的过程,Python 中的函数支持以多种方式传递参数,包括位置传递、关键字传递、默认值传递、包裹传递、解包裹传递以及混合传递。本节将针对函数不同的传参方式进行讲解。

5.3.1 参数的位置传递

                                                                                                                    
调用函数时,默认按照位置顺序将对应的实参传递给形参,即将第 1个实参分配给第 1个形参,第 2个实参分配给第 2个形参,以此类推。

假设有个用于判断三角形是否为直角三角形的 is_triangle() 函数, 该函数的定义

具体如下:

由以上定义可知,is_triangle() 函数需要接收 3个表示三角形各边边长 (大于0)的整型参数。调用 is_triangle()函数, 传入 3个整数,代码如下:

以上代码中的第 1 个实参 “1 ” 会被赋给第 1个形参a,第 2个实参 ” 2 ” 会被赋给第 2个形参b,第 3个实参 3会被赋给第 3个形参c。

通过位置传递方式传参时实参的个数必须与形参的个数保持一致,否则程序会出现异常。

5.3.2 参数的关键字传递

阿ken:如果函数中形参的数目过多,开发者很难记住每个参数的作用,这时可以使用关键字方式传递参数。关键字传递通过 ” 形参变量名 = 实参 ” 的形式将形参与实参关联,根据形参的名称进行参数传递、它允许实参和形参的顺序不一致。

例如,有一个构建URL格式序符中的函数 makeup_url(),该函数有两个参数:protocal和 address,分别用于接收协议头和主机地址。它的定义如下所示:

通过关键字方式传参时,可以使用如下两种形式:

这时,我们无须再关心定义函数时参数的顺序,直接在传参时指定对应的名称即可。

5.3.3 参数的默认值传递

函数在定义时可以给每个参数指定默认值,基本形式为:函数名(参数 = 默认值),这样在调用时既可以给带有默认值的参数重新赋值,也可以省略相应的实参,使用参数的默认值。

例如,fun(a=1,b=2,c=3)函数中分别为3个参数a、b、c设置了默认值1、2、3,使用fn(a=7,b=8)调用函数,此时 a和 b的值7和8将覆盖默认值1和2,但是参数 c保持不变,仍然使用默认值3。默认值传递方式并不要求实参与形参的数量相等。

定义 makeup_url() 函数时为参数 protocal 设置默认值,如下所示:

注意,若带有默认值的参数与必选参数同时存在,则带有默认值的参数必须位于必选参数的后面。
调用 makeup_url() 函数可以使用如下两种形式:
makeup_url(address=’www.itcast.cn’)
makeup_url(protocal=”https”,address=’www.baidu.com’)

使用第 1种形式调用函数时,因为没有传值给protocal参数,所以默认会使用该参数的默认值“http”;使用第 2种形式调用函数时,因为同时传值给 protocal和 address参数、所以 address参数的新值会替换该参数的默认值。

5.3.4 包裹传递

若定义函数时不确定需要传递多少个参数,可以使用包裹传递。包裹传递的关键在于定义函数时,在相应的参数前添加 “*” 或 ”**”:若在某个参数名称的前面加 “*”,可以元组形式为该参数传入一组值;若在某个参数名称前加 “**”,可以关键字传递形式为该参数传入一组值。

例如,定义以 “*” 包裹形参 args 的函数test():

调用以上定义的 test()函数时可以传入多个参数,比如传入 5个参数:

由以上运行结果可知,test()的参数 args接收了一个包含 5个元素的元组。
例如,定义带有 “**” 包裹形参 kwargs 的函数 test():

调用 test()函数时能够以关键字传递的方式传递多个参数,例如:

由以上运行结果可知,test()的参数 args接收了一个包含 5个键值对的字典。

5.3.5 解包裹传递

在调用函数时,若函数接收的实参为元组或字典类型,可以使用 “*” 和 “**” 对函数参数解包裹,将实参拆分为多个值,并按照位置传递方式或关键字传递方式将值赋给各个形参。

(1) 元组解包裹
下面来看一个对元组解包裹的示例,代码如下:

以上代码先定义了需要接收 3个参数的 func() 函数,然后调用 func()函数并向该函数传入了一个包含 3个元素的元组 args,由于元组 args的前面添加了 “*”,Python 对 kwargs 进行解包裹操作,将 args元组中的 3 个元素拆分为 3个值,并分别按顺序赋值给形参a、b、c。

(2) 字典解包裹
下面来看一下对字典解包裹的示例,代码如下:

来源:请叫我阿ken

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年5月6日
下一篇 2021年5月6日

相关推荐