【Python】函数参数分类、用法与新特性

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

【Python】函数参数分类、用法与新特性


函数参数看似很平常在深究后发现其中还是有很多东西参数分类、用法和新特性等都可以体会到Python是真的灵活好用。

参数分类

一定义与使用角度

形参函数定义时定义的参数。
实参函数调用时传入的参数。
参数传递的过程就是把实参的引用传递给形参使用实参的值来执行函数体的过程形参的定义决定了实参传入方式。

def print_num(num):
    print(num)

a = 10
print_num(a)  # 实参引用传递給 形参 num

二传参方式角度

Python 传参方式有两种
按位置顺序传参调用时根据参数位置顺序传递包括位置参数、默认参数缺省参数和可变参数
按关键字传参调用时以“关键字=值”形式传递参数包括关键字参数

1位置参数

按照声明时的位置顺序关系依次传递参数形参与实参的数量、顺序、数据类型必须对应否则报错。

def locationParams(m,n):
    print('第一个参数',m)
    print('第一个参数',n)
locationParams(1,2)

2默认参数

定义函数时为某个参数赋予一个默认值具有默认值的参数称为默认参数

def defaultParams(m,n='xiaoming'):
    print('第一个参数',m)
    print('第一个参数',n)
defaultParams('Hello','xiaoli')
defaultParams('Hello') #未传入默认参数
"""
第一个参数 Hello
第二个参数 xiaoli
第一个参数 Hello
第二个参数 xiaoming
"""

Tips:
1默认参数不能在非默认参数之前Python 按照顺序传参无法识别默认参数声明函数时也会报错

SyntaxError: non-default argument follows default argument
def defaultParams(m='xiaoming',n):
    print('第一个参数',m)
    print('第二个参数',n)
defaultParams('Hello')  #Python 按照顺序传参那么没有实参会传递给形参n

2默认参数不能时可变参数默认参数的值时固定的如果是可变参数则参数值会被修改。

def f(a,l=[]):
    l.append(a)
    return l
print(f(1))
print(f(2))
print(f(3))   
## 默认参数l为list其对应的值也被修改了
"""
[1]
[1, 2]
[1, 2, 3]
"""

3可变参数

可变参数是指参数个数是可以变化的可以是0、1或多个可变参数定义时符号“ * ” 表示。在函数调用时可变参数接收的实参会被封装成一个元组。

def variableParams(*params):
    print("参数: ",params)
    sum = 0
    for i in params:
        sum+=i
    print(sum)
variableParams()  # 不传入参数
variableParams(1,2,3,4)  # 传入多个参数
num_list = [1,2,3,4]
variableParams(*num_list) # num_list 加上“*” 将num_list拆解否则num_list被当成一个参数传入
variableParams(num_list[0],num_list[1]) 
"""
参数:  ()   # 元组
0
参数:  (1, 2, 3, 4)  # 元组
10
参数:  (1, 2, 3, 4)   # 元组
10
参数:  (1, 2)
3
"""

4关键字参数

关键字参数与可变参数类似参数的个数都是可变的所以也被称作可变关键字参数。
关键字参数与可变参数区别
1关键字参数会被封装成一个字典可变参数接收的实参会被封装成一个元组。
2函数调用时关键字参数以以“关键字=值”形式传递参数

def keyWordParams(**params):
    print(params)
keyWordParams()  ## 不传参数
keyWordParams(name='xiaoming',age='11',gender='male')  ## 关键字传参
person_info = {'name': 'xiapli', 'age': '20', 'gender': 'male'}
keyWordParams(**person_info)  # **person_info 将字典拆分

"""
{}
{'name': 'xiaoming', 'age': '11', 'gender': 'male'}
{'name': 'xiapli', 'age': '20', 'gender': 'male'}
"""

四类参数可以混合使用但在声明时需要注意顺序位置参数、默认参数、可变参数和关键字参数。否则Python将无法正常解析。

三参数新特性

1仅位置参数

Python3.8 新特性中新增了仅位置参数。**新的函数参数语法 使用 “ / ” 指明有些函数参数必须被指定为位置参数, 不能被用作关键字参数。 仅位置参数 在“ / ”之前“ / ”之后可以是任意类型参数 **

def pos_only(a,/):
    print(a)
pos_only(1)  # 1
pos_only(a=1)  
# TypeError: pos_only() got some positional-only arguments passed as keyword arguments: 'a'

2仅关键字参数命名关键字参数

与仅位置参数对应的是仅关键字参数不过并非Python3.8 新特性仅关键字参数也被称为命名关键字参数。声明函数时在第一个关键字形参前添加“ * ”表明必须以关键字参数形式传参。

def stu_info(name,gender,*,age,city):
    print('name is:',name,' gender is:',gender,' age:',age,' city:',city)
stu_info('Bob','M',age=7,city='TJ')
stu_info('Lucy','F',city='BJ',age=10)

关键字参数和命名关键字参数的区别在于前者可以传递任何名字的参数而后者只能传递 后面名字的参数。

stu_info('Lucy','F',city='BJ',addr=10)
# stu_info() got an unexpected keyword argument 'addr'

如果函数定义中已经有了一个可变参数后面跟着的命名关键字参数就不再需要一个“ * ”了

#args可以传递一个tuple 其后只能传递age和city参数
def stu_info(name,gender,*args,age,city):
    print('name is:',name,' gender is:',gender,' age:',age,' city:',city)
    for i in args:
        print('args:',i)
stu_info('Bob','M',age=7,city='TJ')
stu_info('Lucy','F',(2,3),city='BJ',age=10)

"""
name is: Bob  gender is: M  age: 7  city: TJ
name is: Lucy  gender is: F  age: 10  city: BJ
args: (2, 3)
"""

最后几个题目大家可以测试下是否掌握

def function1(a, b, c=0, *arg, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'kw =', kw)

function1(1,2,3,4,5,A=1,B=2)
# a = 1 b = 2 c = 3 arg= (4, 5) kw = {'A': 1, 'B': 2}


def function2(a,/, b, c=0, *arg, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'kw =', kw)
function2(1,2,3,4,5,A=1,B=2)
# a = 1 b = 2 c = 3 arg= (4, 5) kw = {'A': 1, 'B': 2}


def function3(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)  
function3(1,2,3,d=4,A=1,B=2)
# a = 1 b = 2 c = 3 d = 4 kw = {'A': 1, 'B': 2}


def function4(a, b, c=0, *arg, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'arg=',arg, 'd =', d, 'kw =', kw)
function4(1,2,3,4,5,d=6,A=1,B=2)
# a = 1 b = 2 c = 3 arg= (4, 5) d = 6 kw = {'A': 1, 'B': 2}
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python