一:函数
函数是一段可以重复使用的代码,通过传递的参数返回不同的结果。对于重复使用的代码,可以编写为自定义函数以便于重复使用代码,同时提高开发人员的开发效率。函数可以分为无参数和带参函数
1:无参函数
以关键字def开始,后面跟函数名、小括号、冒号,最后使用return退出函数。用表达式可以传递函数的返回值,如果没有返回值,则返回None。
函数是以字母、数字、下划线组成的字符串,但是不能以数字开头
示例1:使用无参数函数实现两数相加并输出二者之和
该程序首先定义了无参函数add(),它输出10+20的结果值,return没有返回值,直接使用函数名add()进行了调用
把上面代码修改,用return返回结果值,如下:
函数add()使用return语句可以返回两数相加的结果值,变量i接收函数add()返回的值。Python在处理返回值时,如果没有return语句,会默认返回None,程序并不会报错。
示例2:输出九九乘法表代码如下
使用函数时经常会犯一些错,总结如下:
a.函数的定义要先于函数的调用,否则会出错
b.函数体的代码是一个整体,要注意缩进
c.定义函数时要使用冒号,但调用时不可以使用冒号
2.带参函数
语法:
def 函数名称 (形式参数列表)
代码块
return [表达式]
可以看出,带参函数与无参函数的区别是在函数名称后面的小括号中有形式参数列表,简称形参列表。
注意:形式参数列表实际上只是占位符,用于体现参数的个数,每个参数都没有提供具体的数值
调用带参函数时,需要为每个参数传递对应的实际数值,又称实参列表
示例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:编码实现计算器功能。要求:用户输入两个数字和运算符,程序根据用户指定的运算符执行加、减、乘、除运算。为了使程序结构清晰,需要编写两个函数,一个用来处理加减乘除运算,一个用来处理字符串和数值转换
3.函数中变量的作用域
作用域是指变量在程序中的应用范围,而变量声明的位置决定它的作用域。Python按作用域区分有局部变量和全局变量。
全局变量是指在一个模块中最高级别的变量有全局作用域,除非被删除,否则存活到程序运行结束,所有函数都能访问全局变量。
局部变量是指定义在函数内的变量有局部作用域,依赖于定义变量的函数现阶段是否处于活动状态。调用函数时,局部变量产生,暂时存在。一旦函数执行完,局部变量将会被释放
局部变量和全局变量的使用规则:
a.局部变量的作用域仅限于定义它的函数
b.全局变量的作用域在整个模块内部都是可见的
c.在同一个函数中,不允许有同名局部变量
d.在不同的函数中,可以有同名局部变量
d.在同一个程序中,全局变量和局部变量同名时,局部变量具有更高的优先级
示例7:使用函数实现年龄的输出
在Python中尽量不使用全局变量,因为程序的任意代码都可以自由地访问和修改全局变量的值,非常容易出现数据被意外修改的错误,而这种错误很难被发现
global的作用是声明变量为全局变量,即使变量定义在函数内部,加上global后,也可以在全局范围访问。示例如下:
4.lambda函数
lambda函数的作用是创建匿名函数,是一种声明函数的特殊方式。其中params 相当于函数接收的参数列表,expr是函数返回值的表达式。
示例8:编写一个普通函数和一个lamdba函数
实现的是相同的功能,但lambda函数更加简洁,只需一条语句实现,所以lambda也称为lambda表达式。使用1ambda只能是表达式,不能包含if、for等条件循环语句。对于不需要复用、简单的匿名函数,使用lambda能起到很好的效果。
(5)内建函数
Python除了本身的语法结构,还提供了常用的内建函数。内建函数是程序员经常使用到的方法,可以提高程序的编写效率。如float()就是内建的函数。内建函数是自动加载的,Python的解释器可以识别。它不需要导入模块,不必做任何的操作,不需要引用就可以调用。下面开始介绍常用的内建函数。
(1)abs()函数
abs()函数能够返回一个数字的绝对值,即正数,格式如下:
abs (x)
参数x可以是正数,也可以是负数 示例:
参数是10或-10,返回的是绝对值,结果都是10
(2)bool()函数
bool()函数返回值是True或False,它是Boolean(布尔值)的简写,将参数x转换为Boolean 类型,当参数是数字时,8返回False,其他任何值都返回 True。参数是字符串时,None或空字符串返回False:否则返回True。参数是空的列表、元组或字典返回 False;否则返回 True.
示例 18 代码如下:
注意,括号中None,首字母要大写
(3)float()函数
float()函数用于转换数据为float类型
参数x可以是字符串或数字
示例11:
字符串和数字都可以转为float类型。如果不能转换,就会抛出异常
(4)int()
int()函数可以将数据转换为整数
(5)range()
此函数可以生成一个迭代对象
a.第一个参数start表示起始值,是可选参数,默认值是0
b.第二个参数stop表示终止值
c.第三个参数表示步长,是可选参数,可以是正数或负数,默认值是1
从给定的第一个参数开始,到比第二个参数值小1的数字结束,常与for循环一起使用,循环执行指定数字的次数。示例13:
(6)sum()
sum()函数可以对列表中元素求和,示例14:
使用range()生成了一个列表,然后使用sum()对列表中的数值进行累加求和
(7)max()函数
max()函数可以返回列表、元组或字符串中最大的元素,如果元素是英文字母,那么字母是“大于”数字的,而小写字母“大于”大写字母,示例15:
(8)min()函数
此函数返回列表、元组或字符串中最小的元素,与max()的使用方式相反,它取的是最小值,示例16
二:模块与包
如果编写的程序中类和函数较多时,就需要对它们进行有效的组织分类,在Python中模块和包都是组织的方式。复杂度较低可以使用模块管理,复杂度高则还要使用包进行管理。
1:模块
模块是Python中一个重要的概念,实际上就是包含Python函数或者类的程序。模块就是一个包含Python定义和语句的文件,把一组相关的函数或代码组织到一个文件中,一个文件即是一个模块。模块的文件名=模块名+后缀.Py。模块之间代码共享,可以相互调用,实现代码重用,并且模块中函数名称必须唯一。
(1)模块定义
下面代码演示模块的定义,保存的文件名是myModule.py。
在模块myModule中,定义了2个函数,一个加法函数和一个乘法函数。它们处理的问题是同类的,作为一个模块定义。
(2)模块导入
使用模块中的函数时,要先导入模块才能使用,导入有2种方式。在一行导入一个模块,语法如下:
import 模块名
还可以在一行导入多个模块,语法如下:
import 模块名1[,模块名2] [,模块名3]...
模块和变量一样也有作用域的区别。如果在模块的顶层导入,则作用域是全局的。如果在函数中导入,则作用域是局部的,其作用域只是所在的函数中。一个模块只能被加载一次,无论它被导入多少次,可以阻止多重导入时代码被多次执行。在实际编码时,推荐直接在顶层导入。
导入的模块也分几种,有Python的标准块、第三方模块和应用程序自定义的模块加载执行时在搜索路径中找到指定的模块,如果是第一次导入,模块将被加载并执行,之后再调用时就不需要再次加载了。
示例1:导入标准库模块sys。示例代码如下:
Python的标准库模块sys包含了Python环境相关的函数,sys.platform 返回当前平台的系统名称。
示例 2:导入并调用自定义模块myModule示例代码如下:
模块名就是定义的文件名。在调用模块中函数的语句格式是“模块名.函数名”。每个模块都有name 属性,表示模块的名称。
如果不使用模块名,而直接用函数名进行调用,就需要在导入时指定需要使用模块的属性,一行导入一个模块属性的语法如下:
from 模块名 import 属性名
一起导入模块的多个属性语法如下:
from 模块名 import 属性名1[,属性名2] [,属性名3]...
示例:导入模块属性代码
上述代码是先导入模块myModule的add()\mul()函数,然后,可以不使用模块名,直接使用函数名调用,另外,还可以使用as关键字为模块或模块属性重新命名:
语法
import 模块名 as 模块新名称
或
from 模块名 import 属性名 as 属性新名称
2:包
当程序中的模块非常多时,可以把模块再进行划分,组织成包。包实际上就是一个目录,但必须包含一个“ init.py”文件。“init .py”可以是一个空文件,表示当前目录是一个包。包还可以嵌套使用,包中可以包含其它子包。
(1)包的使用
导入包中的模块只需要在模块名前加上包的名称即可,如按以下方式组织的目录:
project/ #目录
project.py
subproject/ #子目录
__init__·py #注意:init 前后都是两个下划线
submodel .py
示例:在subproject目录下创建模块submodel.py
在project目录下创建程序文件project.py