Python 程序设计:从基础开发到数据分析_PPT第5章 Python自定义函数
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
局部变量的引用比全局变量速度快,应优先考虑使用。
5.3.2 Python全局变量
全局变量指的是能作用于函数内外的变量,即全局变量既可以在各个函数的外部 使用,也可以在各函数内部使用。
定义全局变量的方式有以下 2 种: (1)在函数体外定义的变量,一定是全局变量,如例5-10。
例5-10 同一个变量名demo,函数体外定义的,是全局变量;体内定义的,是局 部变量。
但是,实参的传值方式及顺序,与定义形参的顺序有很大关系。同样一个参数, 由于传值方式不同,会导致不同的叫法,主要有:位置参数、关键字参数、默认参 数、不定长参数。一个参数到底属于什么类型,定义时不能确定,与调用的形式有 关,调用时才能确定。
5.2.1 位置参数(也称必需参数、必选参数)
位置参数:以正确的顺序传入函数,调用时的顺序必须和声明时的顺序一致。
6 test(5,"C语言","Python教程",8) # 第一个参数5为位置参数,其它参数全部转为元组
输出:5 ('C语言', 'Python教程',8) C语言 Python教程 8
5.3 变量的作用域(全局变量和局部变量)
在程序中定义一个变量时,这个变量是有作用范围的,称为变量的作用域。变量 的作用域指的是程序代码能够访问该变量的区域,如果超过该区域,将无法访问该变 量。不同作用域内变量名可以相同,互不影响。
7 y = getSum(1,2,3,5)
8 print(y)
# 输出: 11
例5-6 作为字典的可变长参数(参数前两个星号“**”)。
1 def printSome(**thing): # 参数前面两个星号“**”,表示这个参数为可变的,属于字典类型 2 print(thing) 3 printSome(name='张三',sex='男') # 两个“**”的参数,传值时,必须以关键字参数形式
例5-3 位置参数及参数的数据类型,同一个参数,传值时,可为整数,也可为集 合。
1 def goValue( x, y ): # ------- 定义函数:求两个变量的差,x、y为形式参数 --------------------
2 return x - y
# 定义时,不需要指定参数的数据类型,传值时才能确定
5.2.2 关键字参数
函数调用时,以:参数名= value 形式来确定传入的参数值,这种形式调用的参数, 称为关键字参数。
使用关键字参数调用函数时,参数的顺序与声明时可以不一致,因为Python解释 器能够用参数名匹配参数值。
可以将位置参数与关键字参数混合使用,但必须将位置参数放在关键字参数之前。 混合调用时,必须按照:位置参数、关键字参数顺序赋值,且与定义时的顺序一致。
百度文库
输出:{'name': '张三', 'sex': '男'}
5.2.4 可变长度参数
如果在一个函数中,1个*和2个**的参数都出现,则1个*的参数在前,2个**的参 数在后。如果还出现了别的参数(如:位置参数、默认值参数),则情况比较复杂。 下面通过例子讲解。
例5-7 出现元组可变长参数*parameter和其它参数,其中parameter为元组。
根据定义变量的位置(有效范围),可以将变量分为局部变量和全局变量。
5.3.1 Python 局部变量
局部变量是指在函数内部定义并使用的变量,它只在函数内部有效。
每个函数在执行时,系统都会为该函数分配一块“临时内存空间”,所有的局部 变量都被保存在这块临时内存空间内。当函数执行完成后,这块内存空间就被释放了, 这些局部变量也就失效了,因此离开函数之后就不能再访问局部变量了,否则解释器 会抛出 NameError 错误。
# 中括号内的参数列表,表示可选,即函数可以没有参数 # 函数注释一般放在一对三引号之间
# return语句表示函数的返回值。函数可以没有返回值
自定义函数,必须遵守下面5条规则:
1)函数定义以保留字 def 作为开头,后面是函数的名称及圆括号()、冒号“:”; 2)函数的参数放在圆括号内,若有多个参数,参数之间用逗号分开,也可以没有参数; 3)圆括号后面的冒号“:”必不可少,表示函数语句定义的开始; 4)相对于def关键字,整个函数体必须保持一定的空格缩进 ,默认为4个空格; 5)函数的返回值,用return语句表示;一个函数体可以有多条return语句;函数体执行 时,只要一遇到return语句,函数立即终止,并给出返回值;如果函数体没有return语句,则 返回None。
# 返回 3 ,x、y为必需参数,参数z没有传值,属于默认值调用
6 goValue(5,z=2,y=3)
# 返回 4 ,x为位置参数,y、z为关键字参数调用
7 goValue(z=2,y=3,x=5) # 返回 4 ,x、y、z均为关键字参数调用,此时与定义参数的顺序无关
5.2.4 可变长度参数
可变长参数,又称不定长参数,即传入函数中的参数个数是不确定的。这种结构, 在处理不确定性方面,非常灵活,尤其在大数据领域。
3 4 A = goValue(8,6) 5 B = goValue({1,2,3},{3,4}) 6 print(B)
# 函数调用,给参数传整数值:8,6为形式参数,此时x、y为整数 # 函数调用,给参数传集合,此时,x、y为集合 # 返回两个集合的差:输出{1 ,2}
这样传值对应的形参x、y,均为必选参数,传值的顺序与定义的顺序要一致。
5.1 函数的定义与调用
如:定义一个没有参数、没有返回值的函数。
1 def hello():
# --------- 定义函数:没有参数、没有返回值 ---------
2 print("Hello World!")
3
4 x = hello()
# 函数调用,没有返回值,x为None
输出:Hello World!
1 def getSum(*num): # 参数前面一个星号“*”,表示这个参数为可变长的,属于元组类型
2 s=0 3 for x in num:
# 对元组变量里的元素进行迭代
4
s=s+x
5 return s 6 x = getSum(1,2,3) # 调用时,传值的参数个数不定,Python解释器自动将所有参数转为元组
5.1 函数的定义与调用
例5-1 编写一个函数,给定圆的半径,求圆的面积和周长。
1 import math
# 导入数学库(标准库)
2 def Area(r):
# ------------------ 定义函数:形式参数r 为半径 ----------------------------
3 s = r * r * math.pi
输出:半径为12.08的圆面积为:458.4413062048056 半径为12.08的圆周长为:75.9
5.1.2 为函数提供说明文档
定义函数时,只要把一段字符串放在函数声明之后、函数体之前,这段字符串 将被作为函数的部分,这个文档就是函数的说明文档。程序既可通过 help() 函数查 看函数的说明文档,也可通过函数的 __doc__ 属性访问函数的说明文档。
# 函数调用,输出:8与6中,大的数是: 8
输出:Help on function my_max in module __main__: my_max(x, y) 定义一个函数 my_max(x, y), 输出两个参数x、y之间较大的那个。
5.2 各种各样的函数参数
定义函数时,放在圆括弧内的参数(parameters),叫形式参数,简称形参。调 用函数时,向其传递值的参数,叫实际参数(arguments),简称实参。
1 >>>goValue(5,2) 2 >>>goValue(y=2,x=5) 3 >>>goValue(2,y=5) 4 >>>goValue(2,x=5) 5 >>>goValue(x=5,2)
# 返回3,均为位置参数调用 # 返回3,均为关键字参数调用,x、y的顺序无关 # 返回-3,x为位置参数调用,y为关键字参数调用 # 报错:x不能在后面,这时x为关键字参数,y为位置参数 # 报错,混合调用时,关键字参数x不能在位置参数y之前
1 demo = "C语言中文网"
# 定义一个全局变量
2 def text():
# ------ 在函数体内访问同名的变量,以局部变量为优先 ---------
3 demo="Python语言"
# 定义一个同名的局部变量
4 print("函数体内访问:",demo) # 这个demo为局部变量,在函数体内访问同名的变量
定义函数时不需要声明参数类型,解释器会根据实参的类型自动推断形参类型。
Python函数的参数传递是通过使用地址调用的方式(即指针)。所谓地址调用, 就是将该参数的内存地址传过去。用户不必在参数内设置参数的数据类型。
定义函数时,已经确定了参数的名字及位置。调用时,只需要知道如何正确地给 参数传值、获得返回值即可,至于函数内部是怎么实现的,函数调用者不必了解。
比如:求一组数的和:a+b+c+…,定义函数时,需要确定输入的参数,但是参数 的个数又不确定,这时,可以考虑把所有变量放在元组(tuple)中,以元组的形式, 传进来。
Python定义可变长参数,主要有2种形式:在参数名前加1个星号*或2个星号** :
5.2.4 可变长度参数
例5-5 作为元组的可变长参数(参数前一个星号“*”)。
第 5 章 Python 自定义函数
本章主要内容:
(1)掌握函数定义、函数调用的方法 (2)掌握函数各种参数的使用 (3)掌握函数变量的作用域 (4)掌握lambda函数的使用技巧 (5)掌握生成器的机制 (6)函数的递归(recursion)调用
5.1 函数的定义与调用
定义函数的语法为:
def 函数名([参数列表]): '''函数注释''' 函 数体 [return x]
SyntaxError: positional argument follows keyword argument
5.2.3 默认值参数
函数定义时,有默认值的参数,称为默认值参数。默认参数的位置,必须在必选 参数的后面。调用函数时,如果默认参数没有传递值,则会使用默认值。
例5-4 默认值参数例子。
1 def goValue( x , y , z = 1): # ----------- z 为默认参数,参数x,y的类型与调用有关------------------
2 return (x-y)*z
3
4 goValue(5,2,-1)
# 返回-3 ,x、y、z均为必需参数调用
5 goValue(5,2)
5.1.2 为函数提供说明文档
例5-2 下面程序示范了为函数编写说明文档。
1 def my_max(x, y) : # ------------ 定义函数:求两个数的最大值 ------------------------------
2 '''
3
定义一个函数 my_max(x, y),
4
输出两个参数x、y之间较大的那个。
5 '''
6 z = x if x > y else y
# z等于x、y中较大的值
7 print(str(x)+'与'+str(y)+'中,大的数是:', z) # 函数没有返回值
8 help(my_max)
# 查看函数帮助,或者这样 print(my_max.__doc__)
9 my_max(8,6)
# 计算圆的面积,其中math.pi 为数学常数
4 t = round(2 * r * math.pi,2)
# 计算圆的周长, 四舍五入保留2位小数
5 return s,t
# 函数的返回值,多个返回值之间用逗号
6 s,t = Area(12.08) # 调用函数:半径12.08为实际参数,s、t分别为返回的面积、周长 7 print("半径为" + str(r) + "的圆面积为:" ,s) 8 print("半径为" + str(r) + "的圆周长为:" ,t)
1 def test(a, *books): # -------- 可变长参数books为元组 -------------------------------------
2 print(a)
3 print(books) 4 for b in books:
# 对元组books里的元素进行迭代
5
print(b,end = ' ')
5.3.2 Python全局变量
全局变量指的是能作用于函数内外的变量,即全局变量既可以在各个函数的外部 使用,也可以在各函数内部使用。
定义全局变量的方式有以下 2 种: (1)在函数体外定义的变量,一定是全局变量,如例5-10。
例5-10 同一个变量名demo,函数体外定义的,是全局变量;体内定义的,是局 部变量。
但是,实参的传值方式及顺序,与定义形参的顺序有很大关系。同样一个参数, 由于传值方式不同,会导致不同的叫法,主要有:位置参数、关键字参数、默认参 数、不定长参数。一个参数到底属于什么类型,定义时不能确定,与调用的形式有 关,调用时才能确定。
5.2.1 位置参数(也称必需参数、必选参数)
位置参数:以正确的顺序传入函数,调用时的顺序必须和声明时的顺序一致。
6 test(5,"C语言","Python教程",8) # 第一个参数5为位置参数,其它参数全部转为元组
输出:5 ('C语言', 'Python教程',8) C语言 Python教程 8
5.3 变量的作用域(全局变量和局部变量)
在程序中定义一个变量时,这个变量是有作用范围的,称为变量的作用域。变量 的作用域指的是程序代码能够访问该变量的区域,如果超过该区域,将无法访问该变 量。不同作用域内变量名可以相同,互不影响。
7 y = getSum(1,2,3,5)
8 print(y)
# 输出: 11
例5-6 作为字典的可变长参数(参数前两个星号“**”)。
1 def printSome(**thing): # 参数前面两个星号“**”,表示这个参数为可变的,属于字典类型 2 print(thing) 3 printSome(name='张三',sex='男') # 两个“**”的参数,传值时,必须以关键字参数形式
例5-3 位置参数及参数的数据类型,同一个参数,传值时,可为整数,也可为集 合。
1 def goValue( x, y ): # ------- 定义函数:求两个变量的差,x、y为形式参数 --------------------
2 return x - y
# 定义时,不需要指定参数的数据类型,传值时才能确定
5.2.2 关键字参数
函数调用时,以:参数名= value 形式来确定传入的参数值,这种形式调用的参数, 称为关键字参数。
使用关键字参数调用函数时,参数的顺序与声明时可以不一致,因为Python解释 器能够用参数名匹配参数值。
可以将位置参数与关键字参数混合使用,但必须将位置参数放在关键字参数之前。 混合调用时,必须按照:位置参数、关键字参数顺序赋值,且与定义时的顺序一致。
百度文库
输出:{'name': '张三', 'sex': '男'}
5.2.4 可变长度参数
如果在一个函数中,1个*和2个**的参数都出现,则1个*的参数在前,2个**的参 数在后。如果还出现了别的参数(如:位置参数、默认值参数),则情况比较复杂。 下面通过例子讲解。
例5-7 出现元组可变长参数*parameter和其它参数,其中parameter为元组。
根据定义变量的位置(有效范围),可以将变量分为局部变量和全局变量。
5.3.1 Python 局部变量
局部变量是指在函数内部定义并使用的变量,它只在函数内部有效。
每个函数在执行时,系统都会为该函数分配一块“临时内存空间”,所有的局部 变量都被保存在这块临时内存空间内。当函数执行完成后,这块内存空间就被释放了, 这些局部变量也就失效了,因此离开函数之后就不能再访问局部变量了,否则解释器 会抛出 NameError 错误。
# 中括号内的参数列表,表示可选,即函数可以没有参数 # 函数注释一般放在一对三引号之间
# return语句表示函数的返回值。函数可以没有返回值
自定义函数,必须遵守下面5条规则:
1)函数定义以保留字 def 作为开头,后面是函数的名称及圆括号()、冒号“:”; 2)函数的参数放在圆括号内,若有多个参数,参数之间用逗号分开,也可以没有参数; 3)圆括号后面的冒号“:”必不可少,表示函数语句定义的开始; 4)相对于def关键字,整个函数体必须保持一定的空格缩进 ,默认为4个空格; 5)函数的返回值,用return语句表示;一个函数体可以有多条return语句;函数体执行 时,只要一遇到return语句,函数立即终止,并给出返回值;如果函数体没有return语句,则 返回None。
# 返回 3 ,x、y为必需参数,参数z没有传值,属于默认值调用
6 goValue(5,z=2,y=3)
# 返回 4 ,x为位置参数,y、z为关键字参数调用
7 goValue(z=2,y=3,x=5) # 返回 4 ,x、y、z均为关键字参数调用,此时与定义参数的顺序无关
5.2.4 可变长度参数
可变长参数,又称不定长参数,即传入函数中的参数个数是不确定的。这种结构, 在处理不确定性方面,非常灵活,尤其在大数据领域。
3 4 A = goValue(8,6) 5 B = goValue({1,2,3},{3,4}) 6 print(B)
# 函数调用,给参数传整数值:8,6为形式参数,此时x、y为整数 # 函数调用,给参数传集合,此时,x、y为集合 # 返回两个集合的差:输出{1 ,2}
这样传值对应的形参x、y,均为必选参数,传值的顺序与定义的顺序要一致。
5.1 函数的定义与调用
如:定义一个没有参数、没有返回值的函数。
1 def hello():
# --------- 定义函数:没有参数、没有返回值 ---------
2 print("Hello World!")
3
4 x = hello()
# 函数调用,没有返回值,x为None
输出:Hello World!
1 def getSum(*num): # 参数前面一个星号“*”,表示这个参数为可变长的,属于元组类型
2 s=0 3 for x in num:
# 对元组变量里的元素进行迭代
4
s=s+x
5 return s 6 x = getSum(1,2,3) # 调用时,传值的参数个数不定,Python解释器自动将所有参数转为元组
5.1 函数的定义与调用
例5-1 编写一个函数,给定圆的半径,求圆的面积和周长。
1 import math
# 导入数学库(标准库)
2 def Area(r):
# ------------------ 定义函数:形式参数r 为半径 ----------------------------
3 s = r * r * math.pi
输出:半径为12.08的圆面积为:458.4413062048056 半径为12.08的圆周长为:75.9
5.1.2 为函数提供说明文档
定义函数时,只要把一段字符串放在函数声明之后、函数体之前,这段字符串 将被作为函数的部分,这个文档就是函数的说明文档。程序既可通过 help() 函数查 看函数的说明文档,也可通过函数的 __doc__ 属性访问函数的说明文档。
# 函数调用,输出:8与6中,大的数是: 8
输出:Help on function my_max in module __main__: my_max(x, y) 定义一个函数 my_max(x, y), 输出两个参数x、y之间较大的那个。
5.2 各种各样的函数参数
定义函数时,放在圆括弧内的参数(parameters),叫形式参数,简称形参。调 用函数时,向其传递值的参数,叫实际参数(arguments),简称实参。
1 >>>goValue(5,2) 2 >>>goValue(y=2,x=5) 3 >>>goValue(2,y=5) 4 >>>goValue(2,x=5) 5 >>>goValue(x=5,2)
# 返回3,均为位置参数调用 # 返回3,均为关键字参数调用,x、y的顺序无关 # 返回-3,x为位置参数调用,y为关键字参数调用 # 报错:x不能在后面,这时x为关键字参数,y为位置参数 # 报错,混合调用时,关键字参数x不能在位置参数y之前
1 demo = "C语言中文网"
# 定义一个全局变量
2 def text():
# ------ 在函数体内访问同名的变量,以局部变量为优先 ---------
3 demo="Python语言"
# 定义一个同名的局部变量
4 print("函数体内访问:",demo) # 这个demo为局部变量,在函数体内访问同名的变量
定义函数时不需要声明参数类型,解释器会根据实参的类型自动推断形参类型。
Python函数的参数传递是通过使用地址调用的方式(即指针)。所谓地址调用, 就是将该参数的内存地址传过去。用户不必在参数内设置参数的数据类型。
定义函数时,已经确定了参数的名字及位置。调用时,只需要知道如何正确地给 参数传值、获得返回值即可,至于函数内部是怎么实现的,函数调用者不必了解。
比如:求一组数的和:a+b+c+…,定义函数时,需要确定输入的参数,但是参数 的个数又不确定,这时,可以考虑把所有变量放在元组(tuple)中,以元组的形式, 传进来。
Python定义可变长参数,主要有2种形式:在参数名前加1个星号*或2个星号** :
5.2.4 可变长度参数
例5-5 作为元组的可变长参数(参数前一个星号“*”)。
第 5 章 Python 自定义函数
本章主要内容:
(1)掌握函数定义、函数调用的方法 (2)掌握函数各种参数的使用 (3)掌握函数变量的作用域 (4)掌握lambda函数的使用技巧 (5)掌握生成器的机制 (6)函数的递归(recursion)调用
5.1 函数的定义与调用
定义函数的语法为:
def 函数名([参数列表]): '''函数注释''' 函 数体 [return x]
SyntaxError: positional argument follows keyword argument
5.2.3 默认值参数
函数定义时,有默认值的参数,称为默认值参数。默认参数的位置,必须在必选 参数的后面。调用函数时,如果默认参数没有传递值,则会使用默认值。
例5-4 默认值参数例子。
1 def goValue( x , y , z = 1): # ----------- z 为默认参数,参数x,y的类型与调用有关------------------
2 return (x-y)*z
3
4 goValue(5,2,-1)
# 返回-3 ,x、y、z均为必需参数调用
5 goValue(5,2)
5.1.2 为函数提供说明文档
例5-2 下面程序示范了为函数编写说明文档。
1 def my_max(x, y) : # ------------ 定义函数:求两个数的最大值 ------------------------------
2 '''
3
定义一个函数 my_max(x, y),
4
输出两个参数x、y之间较大的那个。
5 '''
6 z = x if x > y else y
# z等于x、y中较大的值
7 print(str(x)+'与'+str(y)+'中,大的数是:', z) # 函数没有返回值
8 help(my_max)
# 查看函数帮助,或者这样 print(my_max.__doc__)
9 my_max(8,6)
# 计算圆的面积,其中math.pi 为数学常数
4 t = round(2 * r * math.pi,2)
# 计算圆的周长, 四舍五入保留2位小数
5 return s,t
# 函数的返回值,多个返回值之间用逗号
6 s,t = Area(12.08) # 调用函数:半径12.08为实际参数,s、t分别为返回的面积、周长 7 print("半径为" + str(r) + "的圆面积为:" ,s) 8 print("半径为" + str(r) + "的圆周长为:" ,t)
1 def test(a, *books): # -------- 可变长参数books为元组 -------------------------------------
2 print(a)
3 print(books) 4 for b in books:
# 对元组books里的元素进行迭代
5
print(b,end = ' ')