python 函数与模块
技能
自定义函数
函数的变量作用域
常用的内置函数
python的模块
一:函数
函数是一段可以重复使用的代码,通过传递的参数返回不同的结果,前面章节已经使用了Python 定义的函数如 range()、len()、input()等,本章讲解用户自定义的函数。
对于重复使用的代码,可以编写为自定义函数以便于重复使用代码,同时提高开发人员的开发效率。函数可以分为无参函数和带参函数。
1:无参函数
Python 的自定义无参函数并不复杂。
以关键字 def 开始,后面跟函数名、小括号、冒号,最后使用return 退出函数。用表达式可以传递函数的返回值,如果没有返回值,则返回 None。
函数是以字母、数字和下划线组成的字符串,但是不能以数字开头。
示例 1:
使用无参函数实现两数相加并输出二者之和。示例代如下:
该程序首先定义了无参函数 add(),它输出10+20 的结果值,return 没有返回值,直接使用函数名add()进行了调用。
把上面的代码进行修改,用return 返回结果值,代码如下:
函数add()使用return 语句可以返回两数相加的结果值,变量i 接收函数add()返回的值。Python 在处理返回值时,如果没有 return 语句,会默认返回 None,程序并不会报错。
示例 2:
输出九九乘法表示例代码如下:
使用函数时经常会范围一些错误,总结如下:
函数的定义要先于函数的调用,否则会出错 |
函数体的代码是一个整体,要注意缩进。 |
定义函数时要使用冒号,但调用时不可以使用冒号。 |
2:带参函数
Python 带参函数的语法格式如下。
语法:
def 函数名称(形式参数列表):
代码块
return [表达式]
通过语法可以看出,带参函数与无参函数的区别是在函数名称后面的小括号中有形式参数列表,简称形参列表。
注意:形式参数列表实际上只是占位符,用于体现参数的个数,每个参数都没有提供具体的数值。
调用带参函数时,需要为每个参数传递对应的实际数值,又称实参列表。
示例 4 是完成加法运算的函数代码。
示例 4:
定义并调用带参函数完成两数相加的运算。
当调用函数时,根据传递的实际参数值出现位置与函数定义的形式参数列表进行匹配。
示例 5:
使用位置参数方式或关键字参数方式调用带参函数。示例代码如下:
当程序代码比较繁琐时,参数的顺序很难记住,可以使用关键字参数。关键字参数是在调用函数时,明确指定参数值赋给指定的形参,示例代码如下:
代码中,aa(x=10,y=6)和aa(y=6,x=10)语句在调用函数 aa(x,y)的同时,指定了参数的名称和对应值(x=10,y=6)和(y=6,x=10)。这两个语句明确指定了实参和形参的对应关系,与参数所在的位置无关,所以输出结果是相同的。
调用带参函数时,传入函数的参数个数必须和声明的参数个数一致。当函数包含有多个参数时,一旦实参个数与形参个数不符,就可能出错。为了避免这样的错误发生,Python在函数定义时允许为形参数指定默认值,从而在调用参数时可以少写参数,省略的参数用默认值为其赋值。
下面是使用参数默认值的代码示例:
函数定义时,参数y 的默认值是6。函数调用时,可以不传递y的值,只传递x的值。直接传值或使用参数名并赋值的方式都可以,aa(10)和aa(x=10)的结果是相同的。当传递y的值是5时,此时y的默认值不起作用,所以aa(10,5)和aa(x=10,y=5)输出时 y的值都是5。
定义参数默认值时,要注意:位置参数必须出现在有默认值参数之前。下面的函数定义是错误的。
上面的代码中,位置参数y 出现在有默认值的参数 x=1 的后面,此时,会产生语法错误。纠正错误后的正确写法
下面通过示例 6 加深对带参函数的理。
示例 6:
编码实现计算器功能
要求:用户输入两个数字和运算符,程序根据用户指定的运算符执行加、减、乘、除运算。为了使程序结构清晰,需要编写2个函数,一个是用来处理加减乘除运算,一个是用
来处理字符串和数值转换。实现步骤如下:
2:函数中变量的作用域
作用域是指变量在程序中的应用范围,而变量声明的位置决定它的作用域。Python 按作用域区分有局部变量和全局变量。
全局变量是指在一个模块中最高级别的变量有全局作用域,除非被删除,否则存活到程 序运行结束,所有函数都能访问全局变量。
局部变量是指定义在函数内的变量有局部作用域,依赖于定义变量的函数现阶段是否处于活动状态。调用函数时,局部变量产生,暂时存在。一旦函数执行完,局部变量将会被释放。
局部变量和全局变量的使用规则:
> 局部变量的作用域仅限于定义它的函数, 全局变量的作用域在整个模块内部都是可见的 在同一个函数中,不允许有同名局部变量 在不同的函数中,可以有同名局部变量。 在同一个程序中,全局变量和局部变量同名时,局部变量具有更高的优先级。
示例 7:
使用函数实现年龄的输出。
在 Python 中尽量不使用全局变量,因为程序的任意代码都可以自由地访问和修改全局变量的值,非常容易出现数据被意外修改的错误,而这种错误很难被发现。
global 的作用是声明变量为全局变量,即使变量定义在函数内部,加上 global后,也可以在全局范围访问。
示例代码如下:
3: lambda 函数
lambda 函数的作用是创建匿名函数,是一种声明函数的特殊方式。其中 params 相当于函数接收的参数列表,expr 是函数返回值的表达式。
示例 8:
编写一个普通函数和一个 lambda 函数。
示例代码如下:
实现的是相同的功能,但lambda 函数更加简洁,只需一条语句实现,所以 lambda 也称为 lambda 表达式。使用 lambda 只能是表达式,不能包含 if、for 等条件循环语句。对于不需要复用、简单的匿名函数,使用lambda 能起到很好的效果。
4:内建函数
Python 除了本身的语法结构,还提供了常用的内建函数。内建函数是程序员经常使用到的方法,可以提高程序的编写效率。如float()就是内建的函数。内建函数是自动加载的,Python的解释器可以识别。它不需要导入模块,不必做任何的操作,不需要引用就可以调用。下面开始介绍常用的内建函数。
(1)abs()函数
abs()函数能够返回一个数字的绝对值,即正数。语法格式如下。
语法:
abs (x)
参数x 可以是正数,也可以是负数,示例9代码如下:
参数是10或-10,返回的是绝对值,结果都是10.
(2)bool()函数
bool()函数返回值是 True 或 False,它是Boolean(布尔值)的简写,将参数x 转换为Boolean 类型,当参数是数字时,0返回False,其他任何值都返回 True。参数是字符串时,None 或空字符串返回 False;否则返回 True。参数是空的列表、元组或字典返回 False;否则返回 True。
示例 10 代码如下:
注意,括号中None,首字母要大写
(3)float()函数
float()函数用于转换数据为 float 类型,
参数x 可以是字符串或数字,
示例 11 代码如下:
字符串和数字都可以转为 float 类型。如果不能转换,就会抛出异常。
(4) int()
int()函数可以将数据转换为整数,
示例 12 代码如下:
注意:当参数是字符串时,字符串中只能是整数格式。如果是浮点格式将有异常产生。
(5) range()
range()函数可以生成一个迭代对象,
> 第一个参数 start 表示起始值,是可选参数,默认值是0。 > 第二个参数 stop 表示终止值 > 第三个参数表示步长,是可选参数,可以是正数或负数,默认值是1。
从给定的第一个参数开始,到比第二个参数值小1的数字结束,常与for 循环一起使用,
循环执行指定数字的次数。示例 13 代码如下:
(6)sum()函数
sum()函数可以对列表中元素求和,示例14 代码如下:
使用 range()生成了一个列表,然后使用 sum()对列表中的数值进行累加求和。
(7)max()函数
max()函数可以返回列表、元组或字符串中最大的元素,如果元素是英文字母,那么字母是“大于”数字的,而小写字母“大于”大写字母,示例15代码如下:
(8)min()函数
min()函数返回列表、元组、或字符串中最小的元素,与max()的使用方式相反,它取的是最
小值,示例16 代码如下:
二:模块与包
如果编写的程序中类和函数较多时,就需要对它们进行有效的组织分类,在 Python 中模块和包都是组织的方式。复杂度较低可以使用模块管理,复杂度高则还要使用包进行管理。
1:模块
模块是 Python 中一个重要的概念,实际上就是包含 Python 函数或者类的程序。模块就
是一个包含 Python 定义和语句的文件,把一组相关的函数或代码组织到一个文件中,一个文件即是一个模块。模块的文件名=模块名+后缀.py。模块之间代码共享,可以相互调用,实现代码重用,并且模块中函数名称必须唯一。
(1)模块定义
下面代码演示模块的定义,保存的文件名是 myModule.py。
在模块 myModule 中,定义了2个函数,一个加法函数和一个乘法函数。它们处理的问题是同类的,作为一个模块定义。
(2)模块导入
使用模块中的函数时,要先导入模块才能使用,导入有2种方式。在一行导入一个模块,
语法如下。
语法:
import 模块名
还可以在一行导入多个模块,语法如下。
语法:
import 模块名1[,模块名2][,模块名3] ...
模块和变量一样也有作用域的区别。如果在模块的顶层导入,则作用域是全局的。如果在函数中导入,则作用域是局部的,其作用域只是所在的函数中。一个模块只能被加载一 次,无论它被导入多少次,可以阻止多重导入时代码被多次执行。在实际编码时,推荐直接在顶层导入。
导入的模块也分几种,有Python 的标准库模块、第三方模块和应用程序自定义的模块。加载执行时在搜索路径中找到指定的模块,如果是第一次导入,模块将被加载并执行,之后再调用时不需要再次加载了。
Python 的标准库模块 sys 包含了Python 环境相关的函数,sys.platform 返回当前平台的系统名称。
示例 2:导入并调用自定义模块 myModule示例代码如下:
Python 的标准库模块 sys 包含了Python 环境相关的函数,sys.platform 返回当前平台的系统名称。
示例 2:导入并调用自定义模块 myModule示例代码如下:
模块名就是定义的文件名。在调用模块中函数的语句格式是“模块名.函数名”。每个模块都有 name属性,表示模块的名称。
如果不使用模块名,而直接用函数名进行调用,就需要在导入时指定需要使用模块的属 性,一行导入一个模块属性的语法如下。
语法:
from 模块名 import 属性名
一行导入模块的多个属性语法如下。
语法:
from 模块名 import 属性名1[,属性名2][,属性名3] ...
示例 3:
导入模块属性代码如下所示:
示例3 的代码是先导入模块 myModule 的add()、mul()函数,然后,可以不使用模块名,直接使用函数名调用。另外,还可以使用as 关键字为模块或模块属性重新命名,语法如下。
语法:
import 模块名 as 模块新名称
或
from 模块名 import 属性名 as 属性新名称
示例 4 的代码中,先将函数 add()重命名为 add1,mul 重命名为mul1。随后,程序中可以用新的名称调用函数。
2:包
当程序中的模块非常多时,可以把模块再进行划分,组织成包。包实际上就是一个目录,但必须包含 一个“ init .py”文件。“ init .py”可以是一个空文件,表示当前目录是一个包。包还可以嵌套使 用,包中可以包含其它子包。
(1)包的使用
导入包中的模块只需要在模块名前加上包的名称即可,如按以下方式组织的目录:
project/ #目录
project.py
subproject/ #子目录
__init__.py #注意:init 前后都是两个下划线
submodel.py
示例 5: 在 project.py 中调用包 subproject 中 submodel.py 模块示例代码如下:
在 subproject 目录下创建模块 sub
在 project 目录下创建程序文件
[root@localhost project]# python3 project.py
4 示例 5 中,先导入加入包名 subproject.submodel,再调用执行包 subproject.submodel 中的函数 add()
(2)__init__.py
前面使用的是空 __init__.py 文件,也可以在里添加代码,它的作用实际上是初化包中的公共变 量。在第一次使用 import 导入 subproject 包中的任何部分后,会执行包中的 init.py 文件代码
示例 6: 在 subproject 目录中的__init__.py,加入如下代码
:
[root@localhost project]# python3 project.py subproject->__init__.py
三:常用模块
(1)keyword 模块
使用 keyword 模块可以查看 Python 语言的关键字,它的属性 kwlist 包含了所有 Python 关键 字列表。方法 iskeyword(字符串)用于判断参数是否是 Python 的关键字。如果参数是 Python 的关 字,则返回 True;否则,返回 False。
示例 10:判断 Python 的关键字示例代
(2)random 模块
random 模块用于生成随机的浮点数、整数或字符串,常用的方法如下表所示
方法 操作 random() 生成一个随机的浮点数,范围在 0.0~1.0 之间 uniform([上限][,下限]) 在设定浮点数的范围内随机生成一个浮点数 randint([上限][,下限]) 随机生成一个整数,可以指定这个整数的范围 choice(序列) 从任何序列中选取一个随机的元素返回 choice(序列 随机打乱一个序列中元素的顺序 sample(序列,长度) 从指定的序列中随机截取指定长度的片断,序列本身不做修改
示例 11:使用 random 模块常用方法生成随机整数,并重新排序示例代码如下:
random 模 块 产 生 的 结 果 都 是 随 机 的 , 每 次 运 行 的 结 果 不 一 定 相 同 。 示 例 11 中random.randint(1,100)方法随机返回 1 至 100 之间的一个整数,random.choice(list1)方法随机 列表中一个元素,而 random.shuffle(list1)方法是随机打乱列表元素的顺序。
(3)sys 模块
sys 模块包含与 Python 解释器和运行环境相关的属性和方法,常用的属性和方法如下表:
属性/方法 操作 version 获取解释器的版本信息 path 获取模块的搜索路径,初始化时使用 PYTHONPATH 环境变量的值 platform 获取操作系统平台名称 maxint 最大的 int maxint 最大的 Unicode 值 stdin 读取信息到 Shell 程序中 stdin 向 Shell 程序输出信息 stdin 退出 Shell 程序
示例代码如下所示:
(4)time 模块 t
ime 模块包含各种操作时间的方法,常用方法如下表所示:
属性/方法 操作 time() 获取当前时间戳 localtime() 获取当前时间的元组形式 ctime() 获取当前时间的字符串形式 asctime(t) 将时间转换成字符串,参数 t 是元组形式的时间 sleep(secs) 按指定的时间推迟运行,参数是推迟的时间,单位是秒
Python 中时间有时间戳和元组两种表示形式。时间戳的表现形式是以相对 1970.1.1 00:00:0为起点,以秒计算的偏移量,是唯一的值。而以元组的形式表示则共有 9 个元素,分别是 year(4字组成)、month(1-12)、day(1-31)、hours(0-23)、minutes(0-59)、second(0-59)、weekday(0-60 表示周一)、Julian day(1-366,一年里的天数)、DST flag(-1, 0 或 1,是否是夏令时,默认为-1)。
使用“time.time() ”获得的是以秒为单位的偏移量,在 for 循环开始处获得时间戳,循环结束时再 得时间戳,相减后就是循环执行的时间。
以元组的形式获取时间,示例代码如下: