您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > AI人工智能 > Python5-函数设计与使用
第5章函数设计与使用函数•在实际开发中,有许多操作时完全相同或非常相似的,仅仅是要处理的数据不同,为此需要实现代码复用。•函数:可能需要反复执行的代码封装为函数,并在需要该段代码功能的地方调用。•可以实现代码的复用•更重要的是可以保证代码的一致性,只需要修改该函数代码则所有调用均受到影响•Python提供了许多常用的内置函数如len(),sum()等,也可以自定义函数。•另一种代码复用方式:定义面向对象程序设计中的类5.1函数定义与调用5.1函数定义与调用•创建或定义函数要使用def关键字•函数定义(声明)格式:def函数名([形参列表]):'''可选的注释'''函数体•函数调用:函数名([实参列表])•注意:•函数名命名规则建议为全小写字母,可以用下划线增加阅读性,如my_func•形参列表用()括起来,一个函数可以没有形参(parameter),表示不需要接收任何参数,但是括弧必须要有•括号后面的冒号必不可少,表示接下来是函数体#!/usr/local/bin/python3#-*-coding:utf-8-*-functiondemodeffib(n):'''acceptanintegern.returnthenumberslessthanninFibonaccisequence.'''a,b=1,1whilean:print(a,end='')a,b=b,a+bprint()deftest_fib():n=int(input('请输入整数n:'))fib(n)5.1函数定义与调用•创建或定义函数要使用def关键字•函数定义(声明)格式:def函数名([形参列表]):'''注释'''函数体•函数调用:函数名([实参列表])deffib(n):'''acceptanintegern.returnthenumberslessthanninFibonaccisequence.'''a,b=1,1whilean:print(a,end='')a,b=b,a+bprint()defcubic(n):returnn**3•函数体一般包括多行,相对于def关键字必须保持一定的空格缩进,是函数执行的代码块•如果函数体比较简单时,也可以与def在同一行:•pass语句为空语句,经常用在定义一个空函数,以后再扩充•函数可以返回值,也可以不返回。•如果函数体中包含return语句,则执行到那里时从函数中返回(同时返回return语句中相应表达式的值,如果未指定则为None),后面的代码不再执行•如果执行到函数结束也无return语句,则等价于returnNone•函数调用时,根据需要,可指定实际传入的参数值,同时获取返回值5.1函数定义与调用•定义函数(及模块)时,开头部分的注释并不是必需的,但是如果为函数的定义加上这段注释的话,可以为用户提供友好的提示和使用帮助。•该字符串保存在函数(及模块)对象的__doc__属性中,称为docstring•help(fib)可以查看相应的__doc__属性•IDE界面会给出相应的calltip#!/usr/local/bin/python3#-*-coding:utf-8-*-functiondemodeffib(n):'''acceptanintegern.returnthenumberslessthanninFibonaccisequence.'''a,b=1,1whilean:print(a,end='')a,b=b,a+bprint()deftest_fib():n=int(input('请输入整数n:'))fib(n)5.2形参与实参5.2形参与实参•函数定义(声明)格式:def函数名([形参列表]):'''注释'''函数体•函数调用:函数名([实参列表])deffib(n):'''acceptanintegern.returnthenumberslessthanninFibonaccisequence.'''a,b=1,1whilean:print(a,end='')a,b=b,a+bprint()fib(1000)#函数调用1123581321345589144233377610987形参(parameter)实参(argument)5.2形参与实参•定义函数时,对参数个数没有限制,如有多个形参,则需要使用逗号进行分隔。如:编写函数,接受两个整数,并输出其中最大数。defprintMax(a,b):ifab:print(a,'isthemax')else:print(b,'isthemax')printMax(3,4)4isthemax注意:这个程序如果输入的参数不支持比较运算,会出错。5.2形参与实参•为了避免sideeffect,函数中的形参(变量)的使用范围为函数体(作用域部分会详细介绍)•函数调用时向其传递实参,python采用赋值传递(passbyassignment)的策略•与其它高级语言的passbyvalue以及passbyreference不同•形参变量=实参变量,即形参变量与实参变量指向同一个对象•绝大多数情况下,在函数内部直接修改形参的值不会影响实参•对于不可变对象,显然如此•对于可变对象,如果不是采用in-place(原地)方法来改变该可变对象的值时,也不会影响defaddOne(a):print(a)a+=1print(a)a=3addOne(a)34a35.2形参与实参•可变对象的原地操作会影响函数外部实参的值,许多时候会要利用该特性defmodify(v):#修改列表元素值v[0]=v[0]+1a=[2]modify(a)a[3]注意:如果传递给函数的是Python可变序列,并且在函数内部使用下标或其他方式为可变序列增加、删除元素或修改元素值时,可以使得实参得到相应的修改。defmodify(v,item):#为列表增加元素v.append(item)a=[2]modify(a,3)a[2,3]defmodify(d):#修改字典元素值或为字典增加元素d['age']=38a={'name':'Dong','age':37,'sex':'Male'}a{'sex':'Male','age':37,'name':'Dong'}modify(a)a{'sex':'Male','age':38,'name':'Dong'}5.3参数类型5.3参数类型•在Python中,函数参数有很多种:•普通参数•默认值参数•关键参数•可变长度参数等等。•Python函数的定义非常灵活,在定义函数时不需要指定参数的类型,形参的类型完全由调用者传递的实参类型以及Python解释器的理解和推断来决定,类似于重载和泛型(polymorphism);•函数编写如果有问题,只有在调用时才能被发现,传递某些参数时执行正确,而传递另一些类型的参数时则出现错误。5.3.1默认值参数•Python在定义函数时,支持默认值参数,即可为形参设置默认值。def函数名(……,形参名=默认值)函数体•仅仅包含形参名的参数称为位置(positional)参数,根据其出现的位置顺序来逐个匹配相应的实参•调用带有默认值参数的函数时,可以不对默认值参数进行赋值,也可以赋值,具有较大的灵活性。•使用“函数名.__defaults__”以元组的形式查看函数所有默认值参数的当前值。defsay(message,times=1):print(message*times)say('hello')#不为默认值参数传值hellosay('hello',3)#使用调用者显示传递的值hellohellohellosay('hi',7)#使用调用者显示传递的值hihihihihihihisay.__defaults__(1,)5.3.1默认值参数(defaultsparameter)•函数定义时最前面是位置参数,然后是默认值参数•即默认值参数右边不能再有位置参数。•为什么这样设计?函数调用时默认值参数可能并没有包含在实参中!5.3.1默认值参数•例:使用指定分隔符将列表中所有字符串元素连接成一个字符串,默认空格。defJoin(List,sep=None):return(sepor'').join(List)aList=['a','b','c']Join(aList)'abc‘Join(aList,',')'a,b,c'5.3.1默认值参数•在函数定义时,计算默认值得到一个tuple,然后保存在func.__defaults__•函数调用时如何确定默认值参数的值?•如果实参中给出了相应的值,则该形参指向实参所引用的对象•如果实参没有传递值,则该形参变量赋予默认值,而默认值保存在func.__defaults__•如果默认值参数的默认值为可变对象,且前面调用该函数时原地修改了该对象,保存在__defaults__元组中的默认值也会被修改•这种特性可能导致很难发现的逻辑错误。•也可能是故意这样来设计在函数的多次调用间保存状态信息5.3.1默认值参数defdemo(newitem,old_list=[]):old_list.append(newitem)returnold_listprint(demo('5',[1,2,3,4]))#right[1,2,3,4,'5']print(demo('aaa',['a','b']))#right['a','b','aaa']print(demo('a'))#right['a']print(demo('b'))['a','b']print(demo.__defaults__)(['a','b'],)注意:多次调用函数并且不为默认值参数传递值时,默认值参数值在第一次调用时被更改,可以使用函数名.__defaults__查看默认参数的当前值如何修改?5.3.1默认值参数•修改程序如下:defdemo(newitem,old_list=None):ifold_listisNone:old_list=[]old_list.append(newitem)returnold_listprint(demo('5',[1,2,3,4]))#rightprint(demo('aaa',['a','b']))#rightprint(demo('a'))#rightprint(demo.__defaults__)print(demo('b'))+运行该程序,看看和前面的有什么不同?缺省值参数的缺省值避免采用可变对象,或者采用可变对象但是函数体不要进行原地操作。除非故意设计以利用可变对象的这一特征5.3.2关键字参数(keywordargument)•关键字参数主要指实参,即调用函数时的参数传递方式。•通过关键字参数可以按参数名字传递值,实参顺序可以和形参顺序不一致,但不影响传递结果,避免了用户需要牢记位置参数顺序的麻烦。•在函数定义中有多个缺省值参数时通过关键字参数来明确传递哪些参数,哪些采用缺省值•注意关键字参数与函数定义时的缺省值参数的区别,虽然两者形式一致,但两者之间并不等同•调用时可以使用位置参数和关键字来传递参数,但是与函数定义时类似,关键字参数右边不能有位置参数defdemo(a,b,c=5):print(a,b,c)demo(3,7)375demo(a=7,b=3,c=6)736demo(c=8,a=9,b=0)908deffunc(a,b,c=5,d=6):print(a,b,c,d)func(1,2,7)func(1,2,5,8)func(b=1,a=2,c=7)func(1,2,d=8)func(1,b=2,d=8)5.3.3可变长度参数(variable-lengthparameters)•可变长度参数在定义函数时主要有两种形式:•*par
本文标题:Python5-函数设计与使用
链接地址:https://www.777doc.com/doc-1899964 .html