理解函数参数中的*(星号)和**(双星号)
*(星号)用于解包序列或可迭代对象,将其元素分配给函数的参数或在列表、元组等数据结构中进行拼接。
Python中的可迭代对象包括但不限于以下几种类型:
序列类型:如列表(List)、元组(Tuple)、字符串(String)等。这些对象内部包含了一系列按顺序排列的元素,可以通过索引访问其中的元素。
映射类型:如字典(Dictionary)。这些对象包含了一系列键值对,可以通过键来访问对应的值。
生成器类型:通过生成器函数或生成器表达式创建的对象,可以逐个生成值。
集合类型:如集合(Set)和冻结集合(Frozen Set)。对象包含了一组唯一的元素,但没有按照顺序排列。
(双星号)用于解包 ** 字典,将其键值对传递给函数的参数或在字典中进行拼接。
1. * 星号
示例:
# 定义求和函数
def sum_values(*args):
total = 0
for num in args:
total += num
return total
# 多个参数
result = sum_values(1, 2, 3, 4, 5)
print(result) # 输出:15
# *号引用列表对象拼接
numbers = [1, 2, 3, 4, 5]
result = [*numbers, 6, 7, 8]
print(result) # 输出:[1, 2, 3, 4, 5, 6, 7, 8]
# 用列表作为参数,参数数量可以灵活变化
get_sum = sum_values(*result)
print(get_sum) # 输出:36
理解:
- 函数参数解包:当你有一个包含多个元素的列表或元组时,可以使用*将其解包,并将每个元素作为单独的参数传递给函数,函数的参数数量不限。
- 序列解包:使用*可以将一个序列解包,拼接到另一个序列中。
2. **双星号
(1)函数按位置调用
在函数调用的时候,如果给缺省参数传递实参值 。
def print_info1(name,age,city):
print ("name :", name)
print ("age :", age)
print ("city :", city)
print_info1("Alice", 25, "New York")
结果:
name : Alice
age : 25
city : New York
按函数的关键字传参,打乱定义的参数顺序:
print_info1(age=25, name="Alice", city="New York")
执行结果同上。
(2)字典传参数
可变数量的关键字参数:在函数定义时,**kwargs可以接受可变数量的关键字参数,参数被封装为一个字典。
def print_info2(**kwargs):
for key, value in kwargs.items():
print (key," :", value)
print_info2(age=25, name="Alice", city="New York")
执行结果:
age : 25
name : Alice
city : New York
可变参数示例,定义字典:
person_info ={'age':25, 'name':"Alice", 'city':"New York",'sex':'female','dept':'test dept'}
print_info2(**person_info)
执行结果:
age : 25
name : Alice
city : New York
sex : female
dept : test dept
最常见的应用就是MySQL数据库连接:
import pymysql
global_config = {
"host": '127.0.0.1',
"user": "root",
"password": "pwd_MySQL",
"database": "mysqldb",
"use_unicode": "True",
"charset": "utf8"
}
# 数据库连接,根据需要修改配置信息
global_db_mysql = pymysql.connect(**global_config)
(3)拼接
两个字典的拼接:
defaults = {"font":"Arial","color": "red", "size": "medium"}
user_preferences = {"size": "large", "theme": "dark"}
result = {**defaults, **user_preferences}
print(result)
执行结果:
{'font': 'Arial', 'color': 'red', 'size': 'large', 'theme': 'dark'}