函数的设计和使用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计函数时,应注意提高模块的内聚性,同时降低模块之 间的隐式耦合。(高内聚,低耦合)
在实际项目开发中,往往会把一些通用的函数封装到一个 模块中,并把这个通用模块文件放到顶层文件夹中,这样 更方便管理。
5.1 函数定义
• 在编写函数时,应尽量减少副作用,尽量不要修改参数本 身,不要修改除返回值以外的其他内容。
第5章 函数的设计和使用
主要内容
• 函数的定义与调用 • 形参与实参 • 函数的返回 • 位置参数 • 默认参数与关键参数 • 可变长度参数
• 变量作用域 • 生成器函数 • lambda函数 • 递归
5.1 函数定义
将可能需要反复执行的代码封装为函数,并在需要该功能 的地方进行调用,不仅可以实现代码复用,更重要的是可 以保证代码的一致性,只需要修改该函数代码则所有调用 均受到影响。
5.3 参数类型
在Python中,函数参数有很多种:可以为位置参数、默认 值参数、关键参数、可变长度参数等等。
Python在定义函数时不需要指定形参的类型,完全由调用 者传递的实参类型以及Python解释器的理解和推断来决定, 类似于重载和泛型。
Python函数定义时也不需要指定函数的类型,这将由函数 中的return语句来决定,如果没有return语句或者return没 有得到执行,则认为返回空值None。
v.append(item) >>> a = [2] >>> modify(a,3) >>> a [2, 3]
#修改列表元素值 #为列表增加元素
5.2 形参与实参
也就是说,如果传递给函数的是可变序列,并且在函数内 部使用下标或可变序列自身的方法增加、删除元素或修改 元素时,修改后的结果是可以反映到函数之外的,实参也 得到相应的修改。
s=1
参;后声明有默认值的形参。
for i in range(1, n+1):
s *= i
return s//m
可选参数传递
可选参数
def fact(n=10,m=1) : s=1 for i in range(1, n+1): s *= i return s//m
>>> fact() 3628800 >>> fact(11) 39916800 >>> fact(12,3) 159667200
#实参与形参数量必须相同
TypeError: demo() takes 3 positional arguments but 4 were given
>>> def sayHello(s,n):
for i in range(1,n+1):
print(s)
>>>sayHello("Hello",3)
>>>sayHello(3,'Hello')
5.2 形参与实参
编写函数,利用辗转相除法求两个自然数的最大公约数, 并利用该函数求25与45的最大公约数,36与12的最大公 约数。
5.2 形参与实参
对于绝大多数情况下,在函数内部直接修改形参的值不会 影响实参。例如:
>>> def addOne(a): print(a) a += 1 print(a)
>>> def modify(d): #修改字典元素值或为字典增加元素 d['age'] = 38
>>> a = {'name':'Dong', 'age':37, 'sex':'Male'} >>> a {'age': 37, 'name': 'Dong', 'sex': 'Male'} >>> modify(a) >>> a {'age': 38, 'name': 'Dong', 'sex': 'Male'}
-函数定义时,所指定的参数是一种占位符 - 函数定义后,如果不经过调用,不会被执行 -参数、返回值以及变量并不是声明,没有类型约束,可以
传递任意类型的参数给函数,也可以返回任意类型
函数的定义和调用
def语句是实时执行的 -如果直接调用函数名称,相当于python解释执行def语句时,
会创建一个函数对象,并绑定到函数名变量 -函数对象可以赋值给其他的变量名,函数名无特别之处, 关键在于函数所引用的对象 -othername=func -othername( )
函数的定义和调用
def语句是实时执行的 -Python中函数也是对象,所以函数对象可以赋值给变量
5.1 函数定义
在定义函数时,开头部分的注释并不是必需的,但是如果 为函数的定义加上这段注释的话,可以为用户提供友好的 提示和使用帮助。
5.1 函数定义
Python是一种高级动态编程语言,变量类型是随时可以改
>>> func.x = 3
#动态为函数增加新成员
>>> func()
3
>>> func.x
#在外部也可以直接访问函数的成员
3
>>> del func.x
#删除函数成员
>>> func()
#删除之后不可访问
AttributeError: 'function' object has no attribute 'x'
>>> demo(x=1,y=2,z=3) ('y', 2) ('x', 1) ('z', 3)
5.3.4 参数传递的序列解包
传递参数时,可以通过在实参序列前加星号将其解包,然 后传递给多个单变量形参。
>>> def demo(a, b, c): print(a+b+c)
>>> def say( message, times =1 ): print(message * times)
>>> say('hello') hello >>> say('hello',3) hello hello hello >>> say('hi',7) hi hi hi hi hi hi hi
参数传递的两种方式
函数调用时,参数可以按照位置或名称方式传递
位置传递
def fact(n, m=1) : s=1 for i in range(1, n+1): s *= i return s//m
>>> fact( 10,5 ) 725760
名称传递
>>> fact( m=5,n=10 )
725760
5.3 默认值参数
函数的形参可以设置默认值。这种形参通常称为默认参数。 Python允许定义带默认参数的函数,如果在调用函数时不
为这些参数提供值,这些参数就使用默认值;如果在调用 时有实参,则将实参的值传递给形参,形参定义的默认值 将被忽略。 默认值参数必须出现在函数参数列表的最右端,且任何一 个默认值参数右边不能有非默认值参数。
5.3.1 默认值参数
可选参数传递
可选参数
def fact(n, m=1) :
s=1 for i in range(1, n+1):
计算 n!//m
s *= i return s//m
>>> fact(10) 3628800 >>> fact(10,5) 725760
可选参数传递
可选参数
def fact(m=1,n) : 注意:必须先声明没有默认值的形
• 应充分利用Python函数式编程的特点,让自己定义的函数 尽量符合纯函数式编程的要求
5.1 函数定义
函数定义语法:
def 函数名([参数列表]): '''注释''' 函数体
注意事项
函数形参不需要声明其类型,也不需要指定函数返回值类型 即使该函数不需要接收任何参数,也必须保留一对空的圆括号 括号后面的冒号必不可少 函数体相对于def关键字必须保持一定的空格缩进 Python允许嵌套定义函数
>>> a = 3 >>> addOne(a) 3 4 >>> a 3
5.2 形参与实参
在有些情况下,可以通过特殊的方式在函数内部修改实参 的值,例如下面的代码。
>>> def modify(v): v[0] = v[0]+1
>>> a = [2] >>> modify(a) >>> a [3] >>> def modify(v, item):
5.3.3 可变长度参数
可变长度参数主要有两种形式:
*parameter用来接受多个实参并将其放在一个元组中 **parameter接受关键参数并存放到字典中
5.3.3 可变长度参数
*parameter的用法
>>> def demo(*p): print(p)
>>> demo(1,2,3) (1, 2, 3) >>> demo(1,2) (1, 2) >>> demo(1,2,3,4,5,6,7) (1, 2, 3, 4, 5, 6, 7)
5.3.2 关键参数
关键参数主要指实参,即调用函数时的参数传递方式。与 函数定义无关。
通过关键参数,实参顺序可以和形参顺序不一致,但不影 响传递结果,避免了用户需要牢记位置参数顺序的麻烦。
>>> def demo(a,b,c=5): print(a,b,c)
>>> demo(3,7) 375 >>> demo(a=7,b=3,c=6) 736 >>> demo(c=8,a=9,b=0) 908
又称 可选参数
函数定义时可以为某些参数指定默认值,构成可选参数 def <函数名>(<非可选参数>, <可选参数>) : <函数体> return <返回值>
可选参数要放在非可选参数的后面!
5.3.1 默认值参数
调用带有默认值参数的函数时,可以不对默认值参数进行 赋值,也可以赋值,具有较大的灵活性。
5.3 参数类型
位置参数(positional arguments)是比较常用的形式,调
用函数时实参和形参的顺序必须严格一致,并且实参和形
参的数量必须相同。
>>> def demo(a, b, c):
print(a, b, c)
>>> demo(3, 4, 5)
#按位置传递参数
345
>>> demo(1, 2, 3, 4)
5.1 函数定义
生成斐波那契数列的函数定义和调用
def fib(n): a, b = 0, 1 while a < n: print(a, end=' ') a, b = b, a+b print()
fib(1000)
函数的定义和调用
-Python是解释型语言,不像C这样的编译语言。用def编写函数 def是可执行的语句——函数并不存在,直到Python运行了 def后才存在
变的。Python中的函数和自定义对象的成员也是可以随时
发生改变的,可以为函数和自定义对象动态增加新成员。
>>> def func():
print(func.x)
#查看函数func的成员x
>>> func()
#现在函数func还没有成员x,出错
AttributeError: 'function' object has no attribute 'x'
可变长度参数
def paramsFunc(*b): print(type(b)) s=0 for i in b: s+=i return s
>>> paramsFunc(1) >>> paramsFunc(1,2)
5.3.3 可变长度参数
*parameter的用法
>>> def demo(**p): for item in p.items(): print(item)
函数A 函数B 函数B 函数B
调用 调用
返回 返回
调用 返回
调用 ......
返回
函数B 函数B 调用 调用 返回 返回
5.2 形参与实参
函数定义时括弧内为形式参数,简称形参; 一个函数可以没有形参,但是括弧必须要有,表示该函数
不接受参数。 在定义函数时,对参数个数并没有限制,如果有多个形参,
5.1 函数定义和调用
• 利用计算正整数阶乘的函数,编写求阶乘和1!+2!+…+n!的函数,利用 该函数求1!+2!+3!+4!+5!的和。
5.1 函数定义
函数的递归调用是函数调用的一种特殊情况,函数调用自己,自己再 调用自己,自己再调用自己,...,当某个条件得到满足的时候就不 再调用了,然后再一层一层地返回直到该函数的第一次调用。
需要使用逗号进行分割。 调用函数时传入的参数称为实际参数,简称实参。 函数调用时向其传递实参,将实参的值或引用传递给形参。 在定义函数时,函数的形参不代表任何具体的值,只有在
函数调用时,才会有Fra Baidu bibliotek体的值赋给形参
5.2 形参与实参
编写函数,接受两个整数,并输出其中最大数。
def printMax(a, b): if a>b: pirnt(a, 'is the max') else: print(b, 'is the max')
在实际项目开发中,往往会把一些通用的函数封装到一个 模块中,并把这个通用模块文件放到顶层文件夹中,这样 更方便管理。
5.1 函数定义
• 在编写函数时,应尽量减少副作用,尽量不要修改参数本 身,不要修改除返回值以外的其他内容。
第5章 函数的设计和使用
主要内容
• 函数的定义与调用 • 形参与实参 • 函数的返回 • 位置参数 • 默认参数与关键参数 • 可变长度参数
• 变量作用域 • 生成器函数 • lambda函数 • 递归
5.1 函数定义
将可能需要反复执行的代码封装为函数,并在需要该功能 的地方进行调用,不仅可以实现代码复用,更重要的是可 以保证代码的一致性,只需要修改该函数代码则所有调用 均受到影响。
5.3 参数类型
在Python中,函数参数有很多种:可以为位置参数、默认 值参数、关键参数、可变长度参数等等。
Python在定义函数时不需要指定形参的类型,完全由调用 者传递的实参类型以及Python解释器的理解和推断来决定, 类似于重载和泛型。
Python函数定义时也不需要指定函数的类型,这将由函数 中的return语句来决定,如果没有return语句或者return没 有得到执行,则认为返回空值None。
v.append(item) >>> a = [2] >>> modify(a,3) >>> a [2, 3]
#修改列表元素值 #为列表增加元素
5.2 形参与实参
也就是说,如果传递给函数的是可变序列,并且在函数内 部使用下标或可变序列自身的方法增加、删除元素或修改 元素时,修改后的结果是可以反映到函数之外的,实参也 得到相应的修改。
s=1
参;后声明有默认值的形参。
for i in range(1, n+1):
s *= i
return s//m
可选参数传递
可选参数
def fact(n=10,m=1) : s=1 for i in range(1, n+1): s *= i return s//m
>>> fact() 3628800 >>> fact(11) 39916800 >>> fact(12,3) 159667200
#实参与形参数量必须相同
TypeError: demo() takes 3 positional arguments but 4 were given
>>> def sayHello(s,n):
for i in range(1,n+1):
print(s)
>>>sayHello("Hello",3)
>>>sayHello(3,'Hello')
5.2 形参与实参
编写函数,利用辗转相除法求两个自然数的最大公约数, 并利用该函数求25与45的最大公约数,36与12的最大公 约数。
5.2 形参与实参
对于绝大多数情况下,在函数内部直接修改形参的值不会 影响实参。例如:
>>> def addOne(a): print(a) a += 1 print(a)
>>> def modify(d): #修改字典元素值或为字典增加元素 d['age'] = 38
>>> a = {'name':'Dong', 'age':37, 'sex':'Male'} >>> a {'age': 37, 'name': 'Dong', 'sex': 'Male'} >>> modify(a) >>> a {'age': 38, 'name': 'Dong', 'sex': 'Male'}
-函数定义时,所指定的参数是一种占位符 - 函数定义后,如果不经过调用,不会被执行 -参数、返回值以及变量并不是声明,没有类型约束,可以
传递任意类型的参数给函数,也可以返回任意类型
函数的定义和调用
def语句是实时执行的 -如果直接调用函数名称,相当于python解释执行def语句时,
会创建一个函数对象,并绑定到函数名变量 -函数对象可以赋值给其他的变量名,函数名无特别之处, 关键在于函数所引用的对象 -othername=func -othername( )
函数的定义和调用
def语句是实时执行的 -Python中函数也是对象,所以函数对象可以赋值给变量
5.1 函数定义
在定义函数时,开头部分的注释并不是必需的,但是如果 为函数的定义加上这段注释的话,可以为用户提供友好的 提示和使用帮助。
5.1 函数定义
Python是一种高级动态编程语言,变量类型是随时可以改
>>> func.x = 3
#动态为函数增加新成员
>>> func()
3
>>> func.x
#在外部也可以直接访问函数的成员
3
>>> del func.x
#删除函数成员
>>> func()
#删除之后不可访问
AttributeError: 'function' object has no attribute 'x'
>>> demo(x=1,y=2,z=3) ('y', 2) ('x', 1) ('z', 3)
5.3.4 参数传递的序列解包
传递参数时,可以通过在实参序列前加星号将其解包,然 后传递给多个单变量形参。
>>> def demo(a, b, c): print(a+b+c)
>>> def say( message, times =1 ): print(message * times)
>>> say('hello') hello >>> say('hello',3) hello hello hello >>> say('hi',7) hi hi hi hi hi hi hi
参数传递的两种方式
函数调用时,参数可以按照位置或名称方式传递
位置传递
def fact(n, m=1) : s=1 for i in range(1, n+1): s *= i return s//m
>>> fact( 10,5 ) 725760
名称传递
>>> fact( m=5,n=10 )
725760
5.3 默认值参数
函数的形参可以设置默认值。这种形参通常称为默认参数。 Python允许定义带默认参数的函数,如果在调用函数时不
为这些参数提供值,这些参数就使用默认值;如果在调用 时有实参,则将实参的值传递给形参,形参定义的默认值 将被忽略。 默认值参数必须出现在函数参数列表的最右端,且任何一 个默认值参数右边不能有非默认值参数。
5.3.1 默认值参数
可选参数传递
可选参数
def fact(n, m=1) :
s=1 for i in range(1, n+1):
计算 n!//m
s *= i return s//m
>>> fact(10) 3628800 >>> fact(10,5) 725760
可选参数传递
可选参数
def fact(m=1,n) : 注意:必须先声明没有默认值的形
• 应充分利用Python函数式编程的特点,让自己定义的函数 尽量符合纯函数式编程的要求
5.1 函数定义
函数定义语法:
def 函数名([参数列表]): '''注释''' 函数体
注意事项
函数形参不需要声明其类型,也不需要指定函数返回值类型 即使该函数不需要接收任何参数,也必须保留一对空的圆括号 括号后面的冒号必不可少 函数体相对于def关键字必须保持一定的空格缩进 Python允许嵌套定义函数
>>> a = 3 >>> addOne(a) 3 4 >>> a 3
5.2 形参与实参
在有些情况下,可以通过特殊的方式在函数内部修改实参 的值,例如下面的代码。
>>> def modify(v): v[0] = v[0]+1
>>> a = [2] >>> modify(a) >>> a [3] >>> def modify(v, item):
5.3.3 可变长度参数
可变长度参数主要有两种形式:
*parameter用来接受多个实参并将其放在一个元组中 **parameter接受关键参数并存放到字典中
5.3.3 可变长度参数
*parameter的用法
>>> def demo(*p): print(p)
>>> demo(1,2,3) (1, 2, 3) >>> demo(1,2) (1, 2) >>> demo(1,2,3,4,5,6,7) (1, 2, 3, 4, 5, 6, 7)
5.3.2 关键参数
关键参数主要指实参,即调用函数时的参数传递方式。与 函数定义无关。
通过关键参数,实参顺序可以和形参顺序不一致,但不影 响传递结果,避免了用户需要牢记位置参数顺序的麻烦。
>>> def demo(a,b,c=5): print(a,b,c)
>>> demo(3,7) 375 >>> demo(a=7,b=3,c=6) 736 >>> demo(c=8,a=9,b=0) 908
又称 可选参数
函数定义时可以为某些参数指定默认值,构成可选参数 def <函数名>(<非可选参数>, <可选参数>) : <函数体> return <返回值>
可选参数要放在非可选参数的后面!
5.3.1 默认值参数
调用带有默认值参数的函数时,可以不对默认值参数进行 赋值,也可以赋值,具有较大的灵活性。
5.3 参数类型
位置参数(positional arguments)是比较常用的形式,调
用函数时实参和形参的顺序必须严格一致,并且实参和形
参的数量必须相同。
>>> def demo(a, b, c):
print(a, b, c)
>>> demo(3, 4, 5)
#按位置传递参数
345
>>> demo(1, 2, 3, 4)
5.1 函数定义
生成斐波那契数列的函数定义和调用
def fib(n): a, b = 0, 1 while a < n: print(a, end=' ') a, b = b, a+b print()
fib(1000)
函数的定义和调用
-Python是解释型语言,不像C这样的编译语言。用def编写函数 def是可执行的语句——函数并不存在,直到Python运行了 def后才存在
变的。Python中的函数和自定义对象的成员也是可以随时
发生改变的,可以为函数和自定义对象动态增加新成员。
>>> def func():
print(func.x)
#查看函数func的成员x
>>> func()
#现在函数func还没有成员x,出错
AttributeError: 'function' object has no attribute 'x'
可变长度参数
def paramsFunc(*b): print(type(b)) s=0 for i in b: s+=i return s
>>> paramsFunc(1) >>> paramsFunc(1,2)
5.3.3 可变长度参数
*parameter的用法
>>> def demo(**p): for item in p.items(): print(item)
函数A 函数B 函数B 函数B
调用 调用
返回 返回
调用 返回
调用 ......
返回
函数B 函数B 调用 调用 返回 返回
5.2 形参与实参
函数定义时括弧内为形式参数,简称形参; 一个函数可以没有形参,但是括弧必须要有,表示该函数
不接受参数。 在定义函数时,对参数个数并没有限制,如果有多个形参,
5.1 函数定义和调用
• 利用计算正整数阶乘的函数,编写求阶乘和1!+2!+…+n!的函数,利用 该函数求1!+2!+3!+4!+5!的和。
5.1 函数定义
函数的递归调用是函数调用的一种特殊情况,函数调用自己,自己再 调用自己,自己再调用自己,...,当某个条件得到满足的时候就不 再调用了,然后再一层一层地返回直到该函数的第一次调用。
需要使用逗号进行分割。 调用函数时传入的参数称为实际参数,简称实参。 函数调用时向其传递实参,将实参的值或引用传递给形参。 在定义函数时,函数的形参不代表任何具体的值,只有在
函数调用时,才会有Fra Baidu bibliotek体的值赋给形参
5.2 形参与实参
编写函数,接受两个整数,并输出其中最大数。
def printMax(a, b): if a>b: pirnt(a, 'is the max') else: print(b, 'is the max')