python函数的参数以及*号的位置

本文详细介绍了Python函数中的形参与实参、关键字参数与位置参数的区别,以及如何传递任意数量的参数。通过实例展示了*号在不同位置的作用,包括可变位置参数和可变关键字参数的使用方法。强调了在函数定义中设置默认值和强制关键字参数的重要性,并给出了各种参数类型的示例代码和运行结果。
摘要由CSDN通过智能技术生成

1. 形参与实参

2. 关键字参数与位置参数

3. 传递任意数量的参数

4. *号的位置

1. 形参与实参
很简单,直接看代码:

def add(a, b):
    return a + b
    
    
c = add(3, 5)
print(c)

在定义add函数中,变量a、b均为形参,函数完成工作所需的一项信息。下面调用add函数,c = add(3, 5) 将实参3、5传递给了形参a,b。

2. 关键字参数与位置参数
当定义的一个函数需要传递多个函数时,可以使用位置参数也可以使用关键字参数。
位置参数:实参的顺序与形参的顺序相同,基于形参的顺序将实参形参关联。
关键字参数:实参都由变量名和值组成,基于参数数名和值将实参形参关联。
代码表示比较直观,先看位置参数:

def student(name, old):
    print(f"I am {name}, {old} years old.")

student("Ming", 23)
student(23, 'Ming')

运行结果:

 I am Ming, 23 years old.
 I am 23, Ming years old.

调用student函数时,必须按照形参的顺序传递实参,不可以随意混乱实参的顺序。
关键字参数:对上面的代码进行修改
def student(name, old):
print(f"I am {name}, {old} years old.")

student(“Ming”, 23)
student(old = 23, name = ‘Ming’)
运行结果:

I am Ming, 23 years old.
I am Ming, 23 years old.

在代码中明确指出形参对应的实参不必考虑形参的顺序。
在编写函数时,可以给每个函数指定默认值,这样在调用时如果没有传递实参,则将默认值传递进去。上代码:

def student(name='Tian', old=16):
    print(f"I am {name}, {old} years old.")

student("Ming")  # 只指定name参数
student(old=23, name='Ming')  # 不按顺序

运行结果:

I am Ming, 16 years old.
I am Ming, 23 years old.

强制关键字参数,在某些时候必须要求变量传输正确,可以使用强制关键字参数,在函数定义时在需要使用关键字参数的前面用*,看代码:

def student(name1, name2, *, height1, height2):
    print(f"我叫{name1}, 身高{height1}")
    print(f"我叫{name2}, 身高{height2}")
    
    student('Ming', 'Tian', height2=56, height1=80)

运行结果:

我叫Ming, 身高80
我叫Tian, 身高56

在*号前面可以使用关键字参数或者位置参数,后面必须使用关键字参数。

3. 传递任意数量的参数
有时候,预先不知道函数需要接受多少个实参,这时候需要函数可以传递任意数量的参数,python可以支持任意数量的位置参数和关键字参数,先看位置参数:
代码:

def student(*name):
    print(name)  #打印参数
    print(type(name)) #查看name类型

student('Ming', 'Tian', 'Yun')

运行结果:

('Ming', 'Tian', 'Yun')
<class 'tuple'>

可变关键字参数实际上以元组的方式传递给函数内部的。

def student(*name):
    print(name)
    print(type(name))
    for n in name:
        print(n)

student('Ming', 'Tian', 'Yun')

运行结果:

('Ming', 'Tian', 'Yun')
<class 'tuple'>
Ming
Tian
Yun

可变关键字参数:
在定义函数时,参数前面有两个*号表示可变关键字参数,可以支持多个关键字参数的传入。
代码如下:

def greet(msg, **name):
    print(msg, name['one'])
    print(msg, name['two'])
    print(name)

greet('新年快乐', one='Ming', two='Yun', three='Tian')

运行结果:

新年快乐 Ming
新年快乐 Yun
{'one': 'Ming', 'two': 'Yun', 'three': 'Tian'}

可以看出,name为一个字典,带**的参数可以支持多个键值对的输入,也可以用作为字典输入,可变关键字参数必须在位置参数之后。
多种混合使用时参数顺序:位置参数、可变位置参数、命名关键字参数、可变关键值参数,代码如下:

def z(a, b, c, d, *args, e, f, **kwargs):
    print(a, b, c, d, e, f)
    print(args, kwargs)

z(1,2,3,4,'z','x','c',e=5, f=6, h=7, i=8, j=9)

运行结果:

1 2 3 4 5 6
('z', 'x', 'c') {'h': 7, 'i': 8, 'j': 9}

*4. 号的位置
*号位置后面的参数必须以关键字参数传入函数。
下面是例子:

def z(a, b, c, d, * ,e, f):
    print(a, b, c, d, e, f)

z(1,2,3,4, e=5, f=6)

在*号之后必须使用关键字参数将参数数传入函数。否则会有类似下面的错误:
TypeError: takes 4 positional arguments but 5 positional arguments (and 1 keyword-only argument) were given

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值