程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

PYTHON函数参数详解(python函数参数的类型)

hfteth 2025-06-03 22:05:24 技术文章 3 ℃

---PYTHON函数参数详解---

在 python 中,函数参数类型丰富且灵活,合理使用不同参数类型可以使代码更简洁、易读和高效。

以下是 python 函数参数类型的详细分类及示例:

一、位置参数 (Positional Arguments)

定义:必须按定义顺序传递的参数。

特点:调用时不可省略,顺序必须与函数定义一致。

示例:

# python

def add(a, b):

return a + b

print(add(3, 5)) # 正确:3 传给 a,5 传给 b

print(add(5, 3)) # 结果不同,顺序敏感


二、默认参数 (Default Arguments)

定义:在函数定义时为参数指定默认值,调用时可省略。

注意:默认值应为不可变对象(如 `None`、数值、字符串等),避免使用可变对象(如列表)导致意外行为。

示例:

# python

def greet(name, greeting = "Hello"):

print(f"{greeting}, {name}!")

greet("Alice") # 输出:Hello, Alice!

greet("Bob", "Hi") # 输出:Hi, Bob!


三、可变位置参数 (*args)

定义:接收任意数量的位置参数,打包为元组。

用途:处理不确定数量的输入。

示例:

# python

def sum_all(*args):

return sum(args)

print(sum_all(1, 2, 3)) # 输出:6

print(sum_all(10, 20, 30, 40))# 输出:100


# 注意sum函数用法sum(iterable, start=0)**详见结尾

四、关键字参数 (**kwargs)

定义:接收任意数量的关键字参数,打包为字典。

用途:处理具名参数或配置选项。

示例:

# python

def print_info(**kwargs):

for key, value in kwargs.items():

print(f"{key}: {value}")

print_info(name="Alice", age=25)

# 输出:

# name: Alice

# age: 25


五、仅限关键字参数 (KeywordOnly Arguments)

定义:在 `*` 或 `*args` 后定义的参数,必须通过关键字传递。

用途:强制提高代码可读性或避免参数歧义。

示例:

# python

def connect(host, *, port=80, timeout=10):

print(f"Connecting to {host}:{port}, timeout={timeout}")

connect("example.com") # 正确:使用默认 port 和 timeout

connect("api.com", port=443, timeout=5) # 正确:显式指定

# connect("localhost", 8080) # 错误:port 必须通过关键字传递


六、仅限位置参数 (PositionalOnly Arguments)

定义:在 `/` 符号前定义的参数,必须通过位置传递(# python 3.8+ 支持)。

用途:限制参数传递方式,避免参数名被滥用。

示例:

# python

def power(x, /, exp=2):

return x ** exp

print(power(3)) # 输出:9 (x=3 必须通过位置传递)

print(power(3, exp=3)) # 输出:27 (exp 可通过关键字传递)

# power(x=3, exp=2) # 错误:x 不能通过关键字传递


七、参数顺序规则

函数定义时参数需按以下顺序排列:

1. 位置参数(或仅限位置参数 `/`)

2. 默认参数

3. 可变位置参数 `*args`

4. 仅限关键字参数 `*`

5. 关键字参数 `**kwargs`

示例:

# python

def func(a, b=0, *args, c, d=1, **kwargs):

pass

# a: 位置参数

# b: 默认参数

# args: 可变位置参数

# c: 仅限关键字参数(无默认值,必须显式传递)

# d: 仅限关键字参数(有默认值)

# kwargs: 关键字参数

八、参数解包

调用函数时,可通过 `*` 和 `**` 解包参数:

`*` 解包可迭代对象为位置参数。

`**` 解包字典为关键字参数。

示例:

# python

def func(a, b, c):

print(a, b, c)

args = [1, 2, 3]

kwargs = {"a": 10, "b": 20, "c": 30}

func(*args) # 输出:1 2 3

func(**kwargs) # 输出:10 20 30

九、常见陷阱

1. 可变默认值问题:

# python

def append_to(element, lst=[]):

lst.append(element)

return lst

print(append_to(1)) # [1]

print(append_to(2)) # [1, 2](默认列表被重复使用!)


修复方法:

# python

def append_to(element, lst=None):

lst = lst or []

lst.append(element)

return lst


2. 参数顺序错误:

# python

# def func(a=1, b): # 语法错误:默认参数不能在位置参数前

def func(a, b=1): # 正确

pass


3.sum(iterable, start=0)

参数1 iterable:必须是一个可迭代对象(如列表、元组、集合等),包含要累加的元素。

参数2 start(可选):累加的初始值,默认为 0。

返回值:从 start 开始,加上 iterable 中所有元素的总和。

例如:

>>> sum([4,5])

9

>>> sum(4,5)

Traceback (most recent call last):

File "<pyshell#26>", line 1, in <module>

sum(4,5)

TypeError: 'int' object is not iterable

总结

灵活运用 python 的参数类型,可以写出更简洁、健壮的代码。关键点:

使用 `*args` 和 `**kwargs` 处理可变参数。

通过 `/` 和 `*` 限制参数传递方式。

避免可变对象作为默认值。

注意参数定义的顺序规则。

最近发表
标签列表