python函数

python函数介绍

函数对应的是功能,将一些常用的功能进行封装就是函数

# 自定义函数:
def main():
	"""文档描述"""
	print('函数体部分')
	return 0
# def是函数定义的命令,是必须有的,main是函数名,根据需要可自行定义,但是要求清晰且不要和关键字冲突
# 文档描述就是对函数的功能的描述,并不是必须写,一般用来提醒自己或者提醒他人
# 函数体是在函数被调用的时候执行的函数代码
# 返回值就是函数执行之后返回的结果
def add_two(a,b):
	c=a+b
	print(c)
add_two(1,2)  # 函数名加上括号之后函数就会执行,这个函数返回3

函数的参数

函数的参数分为形式参数和实际参数,简称形参和实参:
形参即在定义函数时,括号内声明的参数。形参本质就是一个变量名,用来接收外部传来的值。
实参即在调用函数时,括号内传入的值,值可以是常量、变量、表达式或三者的组合。

形参

# 1. 位置参数
def register(name,age,sex):  # 定义位置形参:name,age,sex,三者都必须被传值
    print('Name:%s Age:%s Sex:%s' %(name,age,sex))
# 位置参数在调用的时候必须传参,否则会报错
# 2. 默认参数
def register(name='liming',age=18,sex='male'): 
    print('Name:%s Age:%s Sex:%s' %(name,age,sex))
# 默认参数在调用的时候可以不被传值,直接使用默认值
register(name='liming',age=18,sex='female')  # Name:liming Age:18 Sex:female
# 注意:默认参数必须在位置参数之后、默认参数的值仅在函数定义阶段被赋值一次

# 3. *args参数,可变长度的位置参数
def foo(x,y,z=1,*args):  # 在最后一个形参名args前加*号
    print(x)
    print(y)
    print(z)
    print(args)
foo(1,2,3,4,5,6,7)  # 实参1、2、3按位置为形参x、y、z赋值,多余的位置实参4、5、6、7都被*接收,以元组的形式保存下来,赋值给args,即args=(4,5,6,7)
# 4. **kwargs可变长度的关键字参数
def foo(x,**kwargs): #在最后一个参数kwargs前加**
    print(x)        
    print(kwargs)   
foo(y=2,x=1,z=3) # 溢出的关键字实参y=2,z=3都被**接收,以字典的形式保存下来,赋值给kwargs
1
{'z': 3, 'y': 2}

# 5. 命名关键字参数
# 在定义了**kwargs参数后,函数调用者就可以传入任意的关键字参数key=value,如果函数体代码的执行需要依赖某个key,必须在函数内进行判断
def register(name,age,**kwargs):
    if 'sex' in kwargs:
        # 指定传入sex参数时执行某段代码
        pass
# 想要限定函数的调用者必须以key=value的形式传值,Python3提供了专门的语法:需要在定义形参时,用作为一个符号*,*号之后的形参称为命名关键字参数,对于这类参数,在函数调用时,必须按照key=value的形式为其传值,且必须被传值(这样就省去了函数体内的判断)
def register(name,age,*,sex,height): #sex,height为命名关键字参数
    pass
register('lili',18,sex='male',height='1.8m') # 正确使用
register('lili',18,'male','1.8m')  # TypeError:未使用关键字的形式为sex和height传值
register('lili',18,height='1.8m')  # TypeError没有为命名关键字参数height传值。
# 命名关键字参数也可以有默认值,从而简化调用
def register(name,age,*,sex='male',height):
    print('Name:%s,Age:%s,Sex:%s,Height:%s' %(name,age,sex,height))
register('lili',18,height='1.8m')
Name:lili,Age:18,Sex:male,Height:1.8m
# 需要强调的是:sex不是默认参数,height也不是位置参数,因为二者均在后,所以都是命名关键字参数,形参sex=’male’属于命名关键字参数的默认值,因而即便是放到形参height之前也不会有问题。另外,如果形参中已经有一个args了,命名关键字参数就不再需要一个单独的*作为分隔符号了
def register(name,age,*args,sex='male',height):
  print('Name:%s,Age:%s,Args:%s,Sex:%s,Height:%s' %(name,age,args,sex,height))
register('lili',18,1,2,3,height='1.8m') #sex与height仍为命名关键字参数
Name:lili,Age:18,Args:(1, 2, 3),Sex:male,Height:1.8m

实参

# 1. 位置参数
def register(name,age,sex): 
    print('Name:%s Age:%s Sex:%s' %(name,age,sex))
register('liming',18,'male')  # 在函数调用时按照定义时的顺序进行传参,如果参数缺少的的话会报错
# 2. 关键字参数
def register(name,age,sex): 
    print('Name:%s Age:%s Sex:%s' %(name,age,sex))
register(sex='male',name='liming',age=19)
# 函数在调用时可以使用位置参数,制定参数的变量名,这样就可以不按照顺序
# 3. *args参数,可变长度的位置参数
def foo(x,y,*args):
    print(x)
    print(y)
    print(args)
L=[3,4,5]
foo(1,2,*L)  # *L就相当于位置参数3,4,5, foo(1,2,*L)就等同于foo(1,2,3,4,5)
1
2
(3, 4, 5)
# 4. **kwargs可变长度的关键字参数
def foo(x,y,**kwargs):
    print(x)
    print(y)
    print(kwargs)
dic={'a':1,'b':2} 
foo(1,2,**dic) #**dic就相当于关键字参数a=1,b=2,foo(1,2,**dic)等同foo(1,2,a=1,b=2)
1
2
{'a': 1, 'b': 2}

形参实参总结

  • *args、**kwargs中的args和kwargs被替换成其他名字并无语法错误,但使用args、kwargs是约定俗成的
  • 参数可任意组合使用,但定义顺序必须是:位置参数、默认参数、*args、命名关键字参数**kwargs
  • 如果一个函数的形参为*args与**kwargs,那么代表该函数可以接收任何形式、任意长度的参数
  • 在函数定义时,星号和双星号可以简单理解成聚合打包成元组和字典的作用,在函数执行的时候,星号和双星号可以理解成拆散的作用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值