PYTHON-函数的定义与调用,返回值,和参数

函数基础'''1. 什么是函数    具有某一功能的工具->函数    事先准备工具的过程--->函数的定义    遇到应用场景,拿来就用---->函数的调用    函数分类两大类:        1. 内置函数        2. 自定义函数2. 为什么要用函数    1. 代码冗余    2. 可读性差    3. 可扩展性差一 为什么要用函数之不用函数的问题    #一、代码的组织结构不清晰,可读性差    #二、遇到重复的功能只能重复编写实现代码,代码冗余    #三、功能须要扩展时,须要找出全部实现该功能的地方修改之,没法统一管理且维护难度极大3. 如何用函数    原则:必须先定义,再调用    定义函数的语法:        def 函数名(参数1,参数2,...):            """文档注释"""            code1            code2            code3            ....            return 返回值    调用函数的语法:        函数名(值1,值2,...)'''函数的使用应该分为两个明确的阶段:先定义后调用1. 定义阶段:只检测语法,不执行函数体代码2. 调用阶段:会触发函数体代码的执行二 函数使用的原则:先定义,再调用三 函数在定义阶段都干了哪些事?#只检测语法,不执行代码也就说,语法错误在函数定义阶段就会检测出来,而代码的逻辑错误只有在执行时才会知道函数的定义与调用形式一:定义函数三种形式一、有参:须要根据外部传进来的参数,才能执行相应的逻辑,好比统计长度,求最大值最小值二、无参:应用场景仅仅只是执行一些操做,好比与用户交互,打印三、空函数:设计代码结构'''# 有参函数def func(x):    passfunc(1)# 无参函数def bar():    passbar()# 空函数def shopping():    pass'''二:函数调用的三种形式函数的调用:函数名加括号1 先找到名字2 根据名字调用代码register() # 1,语句形式(单纯的语句操做,没有返回值)def max2(x,y):    if x > y:        return x    else:        return yres=max2(10,20)*12 # 2,表达式(能够+-*/)res=max2(max2(10,20),30) # 3,将函数的调用看成参数传给另一个函数print(res)函数的返回值return注意点:1. 函数的返回值没有类型限制2. 函数的返回值没有个数限制return返回值的三个功能2.1 返回多个值: 多个返回值用逗号分隔开,返回的是元组形式def func():    print('from func')    return 1,1.1,'hello',[1,2,3]res=func()print(res,type(res))2.2 返回1个值: 返回的就是该值自己def func():    return 123res=func()print(res,type(res))2.3 返回0个值或者干脆没有return: 返回Nonedef func():    # return    passres=func()print(res)return除了有返回值的功能,还有结束函数执行的的功能函数内能够有多个return,但只要执行一次,整个函数就当即结束,而且将return后的值返回def func():    print(1)    return    print(2)    return    print(3)func()函数参数的使用!!!!!函数的参数一 形参与实参#形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定一: 函数的参数分为两大类:形式参数(形参): 在定义函数阶段,括号内定义的参数/变量名 称为形参实际参数(实参): 在调用函数阶段,括号内传入的值/变量值 称为实参ps: 在调用函数阶段会将实参(值)的值绑定给形参(变量名),\                  这种绑定关系只在调用函数时生效,在函数执行完毕后就会解除绑定二: 细分:1. 位置\参数:1.1 位置形参: 在定义阶段,按照从左到右的顺序依次定义的形参称之为位置形参特色: 但凡时按照位置定义的形参,必须被传值,多一个不行少一个也不行1.2 位置实参: 在调用阶段,按照从左到右的顺序依次传入的值称之为位置实参特色:与形参一一对应def func(x,y,z):    print(x,y,z)func(2,1,4)2. 关键字实参: 在调用阶段,按照key=value的形式定义的实参称之为关键字实参特色: 能够彻底打乱顺序,但仍然能为指定的形参传值(总结:指名道姓地为指定的形参传值)实参的形式能够是位置实参与关键字实参混合使用,可是必须遵循原则1.位置实参必须放在关键字实参的前面2.不能对同一个形参重复传值func(1,z=3,y=2)func(z=3,1,y=2) #错误func(1,z=3,x=2,y=3) #错误3. 默认形参:在定义阶段,就已经为形参赋值,该形参称之为默认参数特色1. 定义阶段就已经有值意味着调用阶段能够不用传值2. 位置形参必须放到默认形参的前面3. 默认形参的值只在定义时赋值一次,定义阶段以后的改动不会影响该值4. 默认形参的值一般应该是不可变类型def func(x,z=100,y): #  位置形参必须放到默认形参的前面    print(x,y,z)m=10def func(x,y,z=m):    #z=10    print(x,y,z)m=100 # 默认形参的值只在定义时赋值一次,定义阶段以后的改动不会影响该值func(1,2)def add_hobby(name,x,hobbies=[]): # 默认形参的值一般应该是不可变类型    hobbies.append(x)    print('%s 的爱好有 %s' %(name,hobbies))add_hobby('egon练习','read',[])add_hobby('wxx','eat',[])add_hobby('alex','piao',[])正确的作法def add_hobby(name,x,hobbies=None):    if hobbies is None:        hobbies=[]    hobbies.append(x)    print('%s 的爱好有 %s' %(name,hobbies))add_hobby('egon练习','read',)add_hobby('wxx','eat',)add_hobby('alex','piao')4. 可变长参数:可变长实参:指的是在调用阶段,实参值个数是不固定的,实参无非两种形式(位置,关键字实参),  对应着形参也必须有两种解决方案来分别接收溢出位置实参或者关键字实参*--->溢出的位置实参**--->溢出的关键字实参4.1 *的用法在形参前加*:*会将溢出的位置实参存成元组的形式,而后赋值给*后的形参名def func(x,y,*z): #z=(3,4,5)    print(x,y,z)func(1,2,3,4,5)在实参前加*:但凡碰到实参中带*的,先将实参打散成位置实参再与形参作对应func(*[1,2,3,4,5]) #func(1,2,3,4,5)func(*[1,2,3]) #func(1,2,3)func(1111,2222,*[1,2,3,4,5]) #func(1111,2222,1,2,3,4,5)4.2 **的用法在形参前加**:**会将溢出的关键字实参存成字典的形式,而后赋值给**后的形参名def func(x,y,**z): #z={'c':3,'b':2,'a':1}    print(x,y,z)func(1,y=2,a=1,b=2,c=3)在实参前加**:但凡碰到实参中带**的,先将实参打散成关键字实参再与形参作对应def func(x,y,z):    print(x,y,z)func(1,**{'y':2,'z':3}) #func(1,z=3,y=2)func(1,**{'a':2,'y':333,'z':3}) #func(1,a=2,y=333,z=3) # a错误,位置形参必须被传值def func(x,y,**z):    print(x,y,z)func(**{'y':1,'x':2,'a':1111,'b':2222}) #func(y=1,x=2,a=1111,b=2222)形参中:*args,**kwargsdef func(x,*args):    print(x)    print(args)def func(x,**kwargs):    print(x)    print(kwargs)*与**的应用:见练习四种形参的顺序:位置形参---默认形参---*args---**kwargs命名关键字参数: 在定义函数时,*与**之间参数称之为命名关键字参数特色:在调用函数时,命名关键字参数必须按照key=value的形式传值
相关文章
相关标签/搜索