一、位置传参 

a.最常见的传参方式,参数按定义的顺序依次传入函数。

⚠️ 注意:参数顺序不能颠倒,否则语义会出错。

1.1 常见位置传参

 示例1:

#位置传参
def greet(name, age):
    print(f"Hi, I'm {name} and I'm {age} years old.")

greet("Alice", 30)  # 按顺序传递参数
greet(30,"Alice")

运行结果1:

1.2 可变 位置参数

a. 使用 *args 可让函数接受任意数量的位置参数。*args 会将多余的位置参数收集成一个元组

示例2:

def sum(n,*args):
    print('第一个参数:',n)
    total = n
    print('除参数之外的所有参数:',args)
    for i in args:
        total += i
    
    return total
print(sum(1,2,3))
print(sum(1,2,3,4))
print(sum(1,2,3,4,5))

运行结果2:

 

二、关键词传参

a.通过指定参数的名称来传值,无顺序限制,代码可读性较高。

b. 优点:

  • 提高代码可读性

  • 可以与位置参数混合使用(位置参数必须在前!)

2.1 常见关键字传参

示例1:

#关键字传参
def greet(name, age):
    print(f"Hi, I'm {name} and I'm {age} years old.")
greet(age=30, name="Alice")  # 按参数名传递参数

运行结果1:

2.2 可变 关键字参数

a. 使用 **kwargs 可以让函数接受任意数量的关键词参数。**kwargs 会将多余的关键词参数收集成一个字典。

示例2:

def showme(name,sex,**kwargs):
    descript = f'我是{name},是一位{sex}'
    print('参数之外的参数:',kwargs)

    # 定义一个字典 key2title,用来将英文的字段名映射为中文标题
    key2title = {'address':'地址', 'school':'学校', 'tel':'电话'}

    #key,value解构赋值
    #这段代码会遍历 kwargs 中的所有键值对。
    #每次循环时:
    #key 是字段名( 'address', 'school', 'tel')
    #value 是对应的值('上海', 'xxxx', '12345678901')
    for key,value in kwargs.items():
        descript += f',{key2title.get(key, '')}:{value}'

    return descript

#关键字传参
print(showme('xx','先生',address='上海',school='xxxx',tel='12345678901'))

运行结果2:

 

三、可变和不可变参数

3.1 不可变类型

不可变类型包括:int、float、str、tuple、frozenset 等。

传递方式是值传递: 传递给函数的是该对象的值,函数内部修改该值不会影响外部变量的值

示例:

def modify(x):
    print('修改之前:', x, id(x))
    x = 10  		# 修改了 x 的值,但不会影响外部变量
    print('修改之后:',x, id(x))

a = 5
modify(a)
print('原始数据:',a, id(a))

运行结果:

3.2 可变类型

可变类型包括:list、dict、set 等。这些类型的对象可以在原地修改。

传递方式是引用传递 :传递给函数的是对象的引用(即内存地址),在函数内部修改该参数的内容会直接影响外部变量。

示例:

def modify(lst):
    print('修改之前:', lst, id(lst))
    lst.append(4)  # 修改了 lst 对象的内容
    print('修改之后:',lst, id(lst))

a = [1, 2, 3]
modify(a)
print('外部原始数据:',a, id(a)) 

运行结果:

四、解包操作

a.Python 允许在调用函数时解包序列或字典,使其作为位置参数或关键词参数传递给函数。

4.1 解包位置参数

a.使用 * 解包(主要用于解包元组或列表

示例:

def sum(n,*args):
    print('第一个参数:',n)
    total = n
    print('除参数之外的所有参数:',args)
    for i in args:
        total += i
    
    return total
nums = [1,2,3,4,5]
print(sum(*nums))

运行结果:

4.2 解包关键词参数

a.使用 * * 解包(主要用于解包字典)

示例:

#关键字解包
def showme(name,sex,**kwargs):
    descript = f'我是{name},是一位{sex}'
    print('参数之外的参数:',kwargs)

    #key,vlaue解构赋值
    key2title = {'address':'地址', 'school':'学校', 'tel':'电话'}
    for key,value in kwargs.items():
        descript += f',{key2title.get(key, '')}:{value}'

    return descript
stu = {
    "name": "小王",
    "sex": "先生",
    "address": "北京",
    "school": "xxxx大学",
    "tel": "123456789"
}
print(showme(**stu))

运行结果:

五、总结 

在本篇文章中,我们全面梳理了 Python 函数中参数的各种用法,包括:

  • 位置传参:按顺序将实参传入函数,是最基础也最常见的方式;

  • 可变位置参数(*args:可接收任意数量的位置参数,形成一个元组;

  • 关键字传参:通过指定参数名赋值,提高代码的可读性和灵活性;

  • 可变关键字参数(**kwargs:接收任意数量的关键字参数,并将其封装为字典;

  • 参数可变性:理解可变类型与不可变类型的传参差异,有助于避免函数副作用;

  • 参数解包:使用 *** 进行序列或字典的拆包传参,提升函数调用的灵活性。

掌握这些内容,可以让你在日常编程中更高效地定义和调用函数,写出更灵活、更可维护的 Python 代码。

建议多加练习和调试,观察函数中参数的传递方式对外部变量的影响,才能真正吃透这些知识点!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐