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
'''
目录
相关文章
|
5月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
414 0
|
5月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
486 1
|
5月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
297 0
|
6月前
|
存储 JSON 算法
Python集合:高效处理无序唯一数据的利器
Python集合是一种高效的数据结构,具备自动去重、快速成员检测和无序性等特点,适用于数据去重、集合运算和性能优化等场景。本文通过实例详解其用法与技巧。
192 0
|
7月前
|
存储 索引 Python
python 集合的所有基础知识
python 集合的所有基础知识
660 0
|
5月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
241 4
|
6月前
|
机器学习/深度学习 数据采集 并行计算
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
639 2
|
7月前
|
存储 数据采集 数据处理
Pandas与NumPy:Python数据处理的双剑合璧
Pandas与NumPy是Python数据科学的核心工具。NumPy以高效的多维数组支持数值计算,适用于大规模矩阵运算;Pandas则提供灵活的DataFrame结构,擅长处理表格型数据与缺失值。二者在性能与功能上各具优势,协同构建现代数据分析的技术基石。
571 0
|
11月前
|
存储 缓存 安全
Python frozenset 集合详解:不可变集合的终极指南
frozenset是Python中一个常被忽视但极具价值的不可变集合类型。本文深入解析其本质、操作方法与应用场景,揭示其通过不可变性带来的安全性与性能优势。从底层实现到实战案例,涵盖字典键使用、缓存优化及类型注解等高级场景。同时对比性能数据,提供最佳实践指南,并展望Python 3.11+中的优化。掌握frozenset,可为代码带来更强健性与效率,适合多种特定需求场景。
415 5
|
12月前
|
存储 人工智能 索引
Python数据结构:列表、元组、字典、集合
Python 中的列表、元组、字典和集合是常用数据结构。列表(List)是有序可变集合,支持增删改查操作;元组(Tuple)与列表类似但不可变,适合存储固定数据;字典(Dictionary)以键值对形式存储,无序可变,便于快速查找和修改;集合(Set)为无序不重复集合,支持高效集合运算如并集、交集等。根据需求选择合适的数据结构,可提升代码效率与可读性。

推荐镜像

更多