python在列表、元素、字典、集合和numpy的数组前加上星号 * 是什么含义,以及*args和**kwargs的使用

简介: python在列表、元素、字典、集合和numpy的数组前加上星号 * 是什么含义,以及*args和**kwargs的使用

在函数名前面加两个星号https://github.com/ultralytics/yolov5/blob/master/detect.py#L256

1 从示例开始认识*的作用

List = ['a', 2, 3]
Tuple = ('b', 'c', 5)
Dict = {
   'name': 'Ada', 'age': 23}

print(List)
print(Tuple)
print(Dict)

print(*List)
print(*Tuple)
print(*Dict)



import numpy as np
ndarray = np.array([2, 3, 4])
print(ndarray)
print(*ndarray)

##################################
# 输出结果如下:
'''
['a', 2, 3]
('b', 'c', 5)
{'name': 'Ada', 'age': 23}
{2, 4, 5}

a 2 3
b c 5
name age
2 4 5

[2 3 4]
2 3 4
'''

从上面可以看出:在列表、元组、字典、集合、数组前面加上*,打印的输出结果可以看出,这些数据结构中元素都被分成一个一个的独立元素

2 python函数的形参:*args 和 **kwargs 的使用

在分析列表、元组、字典、集合前加 * 的用处前,先说以下:函数中的*args 和 **kwargs这两个形参

  • *args:接收若干个位置参数转换成元组tuple形式
  • **kwargs:接收若干个关键字参数转换成字典dict形式

2.1 *args形参的使用

当传入多个位置参数,这多个位置参数会自动组成一个元组,然后我们就可以遍历这个元组中的参数啦

def fun(*args):
    print(type(args))
    print(args)
    for item in args:
        print(item)

fun(2, 'alex', [3])

# 输出结果如下
'''
<class 'tuple'>
(2, 'alex', [3])

2
alex
[3]
'''

2.2 **kwargs形参的使用

当传入多个关键字参数,这多个位置参数会自动组成一个字典,然后我们就可以遍历这个字典中的参数

def fun(**kwargs):
    print(type(kwargs))
    print(kwargs)
    for key in kwargs.keys():
        print(key, kwargs[key])


fun(name='Alvin', age=23, things=[1, 2, 'a'])

# 输出结果如下:
'''
<class 'dict'>
{'name': 'Alvin', 'age': 23, 'things': [1, 2, 'a']}

name Alvin
age 23
things [1, 2, 'a']
'''

比如下方在类Alex的构造函数中定义了多个关键字参数,然后我们在函数gen_model中就可以适用**kwargs函数,这样我们就不需要再函数gen_model中把所有对应的参数都在定义一遍,只需要在使用哪个参数,在调用的时候以关键字参数填入即可!具体实例代码如下:

class Alex(object):
    def __init__(self, block, layers, dropout_keep_prob=0, embedding=128, fp16=False):
        self.block = block
        self.layers = layers
        self.dropout_keep_prob=dropout_keep_prob
        self.embedding = embedding
        self.fp16 = fp16

        print('kwargs:', self.embedding)

    def _make_layers(self):
        raise NotImplementedError('Must be overridden by all subclasses.')



def gen_model(block, layers, **kwargs):
    model = Alex(block, layers, **kwargs)
    return model



def main():
    block = None
    layers = None
    alex_model = gen_model(block, layers, embedding=16)


if __name__ == '__main__':
    main()

**kwargs直接传入一个字典:(参考

img_norm_cfg = dict(
    mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False)
train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='LoadAnnotations', with_bbox=True, with_label=False),
    dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),
    dict(type='RandomFlip', flip_ratio=0.5),
    dict(type='Normalize', **img_norm_cfg),    # 直接传入一个字典
    dict(type='Pad', size_divisor=32),
    dict(type='DefaultFormatBundle'),
    dict(type='Collect', keys=['img', 'gt_bboxes']),
]
>>> img_norm_cfg = dict(mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False)
>>> dict(type='Normalize', **img_norm_cfg)
{
   'type': 'Normalize', 'mean': [103.53, 116.28, 123.675], 'std': [1.0, 1.0, 1.0], 'to_rgb': False}
>>>

3 分析列表、元组、字典、集合和数组前加 * 有什么用处

参考

def print_item(*args):
    print(type(args))
    print(args)
    for item in args:
        print(item)


List = ['apple', 23, 'orange', 9]
print_item(List)
print_item(*List)


# 打印输出结果
'''
<class 'tuple'>
(['apple', 23, 'orange', 9],)  # 这个元组里面只有一个元素
['apple', 23, 'orange', 9]

<class 'tuple'>
('apple', 23, 'orange', 9)  # 加星号之后,直接把列表中的元素都取出来放到一个元组中,然后可以直接遍历
apple
23
orange
9
'''
目录
相关文章
|
3月前
|
存储 缓存 安全
Python frozenset 集合详解:不可变集合的终极指南
frozenset是Python中一个常被忽视但极具价值的不可变集合类型。本文深入解析其本质、操作方法与应用场景,揭示其通过不可变性带来的安全性与性能优势。从底层实现到实战案例,涵盖字典键使用、缓存优化及类型注解等高级场景。同时对比性能数据,提供最佳实践指南,并展望Python 3.11+中的优化。掌握frozenset,可为代码带来更强健性与效率,适合多种特定需求场景。
132 5
|
9月前
|
安全 网络安全 文件存储
思科设备巡检命令Python脚本大集合
【10月更文挑战第18天】
269 1
思科设备巡检命令Python脚本大集合
|
4月前
|
存储 人工智能 索引
Python数据结构:列表、元组、字典、集合
Python 中的列表、元组、字典和集合是常用数据结构。列表(List)是有序可变集合,支持增删改查操作;元组(Tuple)与列表类似但不可变,适合存储固定数据;字典(Dictionary)以键值对形式存储,无序可变,便于快速查找和修改;集合(Set)为无序不重复集合,支持高效集合运算如并集、交集等。根据需求选择合适的数据结构,可提升代码效率与可读性。
|
6月前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
198 2
|
8月前
|
XML JSON API
如何使用Python将字典转换为XML
本文介绍了如何使用Python中的`xml.etree.ElementTree`库将字典数据结构转换为XML格式。通过定义递归函数处理字典到XML元素的转换,生成符合标准的XML文档,适用于与旧系统交互或需支持复杂文档结构的场景。示例代码展示了将一个简单字典转换为XML的具体实现过程。
102 1
|
9月前
|
存储 安全 Serverless
Python学习四:流程控制语句(if-else、while、for),高级数据类型(字符串、列表、元组、字典)的操作
这篇文章主要介绍了Python中的流程控制语句(包括if-else、while、for循环)和高级数据类型(字符串、列表、元组、字典)的操作。
142 0
|
10月前
|
机器学习/深度学习 数据处理 Python
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
220 1
|
11月前
|
机器学习/深度学习 数据处理 计算机视觉
NumPy实践宝典:Python高手教你如何轻松玩转数据处理!
【8月更文挑战第22天】NumPy是Python科学计算的核心库,专长于大型数组与矩阵运算,并提供了丰富的数学函数。首先需安装NumPy (`pip install numpy`)。之后可通过创建数组、索引与切片、执行数学与逻辑运算、变换数组形状及类型、计算统计量和进行矩阵运算等操作来实践学习。NumPy的应用范围广泛,从基础的数据处理到图像处理都能胜任,是数据科学领域的必备工具。
121 0
|
10月前
|
机器学习/深度学习 算法 数据可视化
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
特征工程是机器学习流程中的关键步骤,通过将原始数据转换为更具意义的特征,增强模型对数据关系的理解能力。本文重点介绍处理数值变量的高级特征工程技术,包括归一化、多项式特征、FunctionTransformer、KBinsDiscretizer、对数变换、PowerTransformer、QuantileTransformer和PCA,旨在提升模型性能。这些技术能够揭示数据中的潜在模式、优化变量表示,并应对数据分布和内在特性带来的挑战,从而提高模型的稳健性和泛化能力。每种技术都有其独特优势,适用于不同类型的数据和问题。通过实验和验证选择最适合的变换方法至关重要。
281 6
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
|
8月前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
205 3

热门文章

最新文章

推荐镜像

更多