本文将带你掌握Python函数,深入了解
*args
和**kwargs
。
微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩
一、使代码更整洁、更灵活
想象一下,如果能在Python中创建适应不同场景的函数,而无需每次都重写它们。这就是*args
和**kwargs
的魔力所在。就像为函数准备了一个神奇的袋子,可以装下任意多的参数——使代码更整洁、更灵活。
为了帮助你更好地理解Python中的*args
和**kwargs
,接下来展示一下如果没有这些概念,代码将会是什么样子。
在这里,本文展示一个简单的函数simple_sum
,用于将两个数字相加。
def simple_sum(a, b):
return a + b
result = simple_sum(3, 7)
print(result)
现在,想象一下如果想创建一个将三个数字相加的函数。最终可能会以如下方式重写这个函数:
def simple_sum_three(a, b, c):
return a + b + c
result_three = simple_sum_three(3, 7, 5)
print(result_three)
如果想将四个、五个或更多的数字相加呢?用户将不得不为每种情况创建新函数,这既不优雅也不灵活。
为了解决这个问题,有一个称为“参数打包”的概念,可以在函数定义语句中使用*
符号,将一个参数转换为超级参数,它可以作为一个袋子,并在调用函数时容纳/打包传递它的所有值,存储在一个变量中。
同样的,符号*
也可以用于解包数据结构,具体取决于它的使用方式,本文将在后面学习如何做到这一点。
本文假设你已经熟悉在Python中创建函数,对常规(位置)参数和关键字参数有基本的理解,并且知道元组和字典在Python中是什么。
二、使用*args
进行参数打包
在Python中,当在函数定义中看到一个星号(*
)紧跟在一个参数前面时,这是参数打包的信号。这意味着可以向函数传递任意数量的参数,它们将被整洁地打包成一个元组。就像为函数准备了一个神奇的袋子,使它能够适应不同的情况,而无需不断地重写函数。
def magic_sum(*args):
result = sum(args)
return result
# 三个数字相加
result1 = magic_sum(3, 7, 5)
print("Result 1:", result1) # 预期输出:15(3+7+5)
# 五个数字相加
result2 = magic_sum(1, 2, 3, 4, 5)
print("Result 2:", result2) # 预期输出:15(1+2+3+4+5)
# 相加更多数字
result3 = magic_sum(10, 20, 30, 40, 50, 60)
print("Result 3:", result3) # 预期输出:210(10+20+30+40+50+60)
在这个例子中,magic_sum
函数使用*args
进行参数打包。可以使用不同数量的参数调用这个函数,它会将这些参数整洁地打包成一个元组进行加法运算。在这种情况下,变量args
就变成了一个元组。就像有了一个可以处理任意数量输入的计算器,而无需更改其公式。
三、参数解包
另一方面,在调用函数时,可以使用星号(*
)表示正在解包一个值序列(元组、列表、集合、字符串),并将其元素作为单独的值传递。这种方法适用于将数据保存在集合(例如:元组)中,但希望从集合中提取每个值,并将其作为单独参数传递给函数的情况。
def display_values(a, b, c):
print("Value of a:", a)
print("Value of b:", b)
print("Value of c:", c)
# 解包一个元组并将其元素作为单独的值传递
tuple_values = (7, 14, 21)
display_values(*tuple_values) # 等同于 display_values(7, 14, 21)
可以使用此方法从多个集合类型数据中提取值:
def display_values(a, b, c):
print("Value of a:", a)
print("Value of b:", b)
print("Value of c:", c)
# 解包一个元组并将其元素作为单独的值传递
tuple_values = (7, 14, 21)
display_values(*tuple_values) # 等同于 display_values(7, 14, 21)
# 解包一个列表
list_values = [30, 40, 50]
display_values(*list_values) # 等同于 display_values(30, 40, 50)
# 解包一个字符串(每个字符成为单独的参数)
string_values = "XYZ"
display_values(*string_values) # 等同于 display_values('X', 'Y', 'Z')
# 解包一个集合
set_values = {60, 70, 80}
display_values(*set_values) # 顺序可能会有变化,等同于 display_values(60, 70, 80)
# 解包一个范围
range_values = range(3, 6)
display_values(*range_values) # 等同于 display_values(3, 4, 5)
还可以将函数定义部分的a
、b
、c
更改为values
以接收可变数量的参数。values
将成为传递的所有参数的元组。这可以理解为同时进行打包和解包。
def display_values(*values): # 将数值打包到一个变量中。
print("Values:", values)
# 解包一个元组并将其元素作为单独的值传递
tuple_values = (7, 14, 21)
display_values(*tuple_values)
四、使用**
进行关键字参数打包
接下来,本文将使用双星号(**
),这是Python的一个运算符,它将字典的打包和解包引入其中。当一个函数参数以“**
”为前缀时,它表示相应的参数应该是键值对,并整齐地打包成一个字典。这与元组参数的打包相同,但用于函数参数为关键字参数的情况。
def display_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
# 在函数调用中直接传递关键字参数
display_info(name='Alice', age=25, city='Wonderland')
五、关键字参数解包
解包字典,并将其内容作为单独的关键字参数传递给函数。这种方法适用于将数据保存在字典中,但又想从字典中提取每个键值对,并将其作为单独的关键字参数传递给函数的情况:
def display_person_info(name, age, city):
print("Name:", name)
print("Age:", age)
print("City:", city)
# 解包一个包含预期键值对的字典
person_info = {'name': 'Alice', 'age': 25, 'city': 'Wonderland'}
display_person_info(**person_info)
六、结合使用*args
和**kwargs
结合*args
和**kwargs
的力量,将它们分别视为长度可变的位置参数列表和关键字参数列表。
def display_information(*args, **kwargs):
print("Positional Arguments (*args):")
for arg in args:
print(arg)
print("\nKeyword Arguments (**kwargs):")
for key, value in kwargs.items():
print(f"{key}: {value}")
# 使用位置参数和关键字参数的混合调用函数
display_information(1, 'apple', name='Alice', age=25, city='Wonderland')
在此示例中,display_information
函数接收*args
以处理任意数量的位置参数,接收**kwargs
以处理任意数量的关键字参数。然后,该函数分别打印每种类型的参数。
七、一次性进行多次解包
Python中的另一个有趣功能是能够在单个函数调用中执行多次解包。
def display_values(*args):
for value in args:
print(value)
# 在单个函数调用中进行多次解包
list_values = [1, 2, 3]
tuple_values = (4, 5, 6)
set_values = {7, 8, 9}
display_values(*list_values, *tuple_values, *set_values)
在此示例中,display_values
函数使用多次解包以单行方式调用三种不同的可迭代类型(列表、元组和集合)。在函数调用期间,通过多次解包(*list_values
,*tuple_values
,*set_values
)收集所有值,存储在单个args
参数中。
八、关于命名约定的注意事项
不必将参数命名为“args
”或“kwargs
”,但许多Python工程师会这样做。这就像使用一个特殊的词,编程界的每个人都能理解。“args
”用于位置参数,“kwargs
”用于关键字参数。
推荐书单
《Python从入门到精通(微课精编版)》
《Python从入门到精通(微课精编版)》使用通俗易懂的语言、丰富的案例,详细介绍了Python语言的编程知识和应用技巧。全书共24章,内容包括Python开发环境、变量和数据类型、表达式、程序结构、序列、字典和集合、字符串、正则表达式、函数、类、模块、异常处理和程序调试、进程和线程、文件操作、数据库操作、图形界面编程、网络编程、Web编程、网络爬虫、数据处理等,还详细介绍了多个综合实战项目。其中,第24章为扩展项目在线开发,是一章纯线上内容。全书结构完整,知识点与示例相结合,并配有案例实战,可操作性强,示例源代码大都给出详细注释,读者可轻松学习,快速上手。本书采用O2O教学模式,线下与线上协同,以纸质内容为基础,同时拓展更多超值的线上内容,读者使用手机微信扫一扫即可快速阅读,拓展知识,开阔视野,获取超额实战体验。
《Python从入门到精通(微课精编版)》https://item.jd.com/13524355.html
精彩回顾
微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩
访问【IT今日热榜】,发现每日技术热点