python3教程:*和**的打包和解包的用法

一. 打包参数

1. * 的作用:在函数定义中,收集所有的位置参数到一个新的元组,并将这个元组赋值给变量args

>>> def f(*args):
    print(args)

    
>>> f()
()
>>> f(1)
(1,)
>>> f(1, 2, 3, 4)
(1, 2, 3, 4)
>>> 

2. ** 的作用:在函数定义中,收集关键字参数传递给一个字典,并将这个字典赋值给变量kwargs

>>> def f(**kwargs):
    print(kwargs)

    
>>> f()
{}
>>> f(a=1, b=2)
{'a': 1, 'b': 2}
>>> 

二. 解包参数

1. * 的作用:在函数调用中,* 能够将元组或者列表解包成不同的参数

>>> def func(a, b, c, d):
    print(a, b, c, d)

    
>>> args = (1, 2, 3, 4)
>>> func(*args)
1 2 3 4

>>> args = [1, 2, 3, 4]
>>> func(*args)
1 2 3 4

2. ** 的作用:在函数调用中,**会以键/值的形式解包一个字典,使其成为独立的关键字参数

>>> def func(a, b, c, d):
    print(a, b, c, d)

    
>>> kwargs = {"a": 1, "b": 2, "c": 3, "d": 4}
>>> func(**kwargs)
1 2 3 4

三. 注意

1. 在函数定义时,* 表示打包,在函数体内部, * 仍然表示解包(print(*args)实际上也算是调用了print函数)

>>> def foo(*args, **kwargs):
    print(args)       #未解包参数
    print(*args)      #解包参数

    
>>> v = (1, 2, 4)
>>> d = {'a':1, 'b':12}
>>> foo(v, d)
((1, 2, 4), {'a': 1, 'b': 12})
(1, 2, 4) {'a': 1, 'b': 12}

2. 打包和解包并不能脱离函数而存在

表面上看并没有什么函数,实际上是有的,用的就是format的函数调用

>>> c = {"name": 'zhang', "age": 2}
>>> **c
SyntaxError: invalid syntax
>>> 
>>> "Name:{name}, Age:{age}".format(**c)
'Name:zhang, Age:2'

参考源码中对format函数的定义
在这里插入图片描述
但是这个字典解包不能用print函数输出

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> print(**c)
Traceback (most recent call last):
  File "<pyshell#40>", line 1, in <module>
    print(**c)
TypeError: 'age' is an invalid keyword argument for this function
>>> 

因为上述字典解出来的形式是这样的:

**c = name='zhang',age=2

在这里插入图片描述

3. 在ddt中的应用

@ddt.data(*all_caseDatas)中,data是一个函数,调用函数的时候,参数*all_caseDatas自动将参数列表[{}, {}, {}...]解包为{},{},{}...,在def data(*values)函数中,*会自动将各个位置参数打包成新的元组({}, {}, {}...),然后@ddt.data就可以获取每一条数据作为测试用例了

@ddt.data(*all_caseDatas)
    def test_my_request(self, case_data):
        global global_var
        if len(global_var) != 0 and case_data["request_data"] is not None:
            for key, value in global_var.items():
                if case_data["request_data"].find(key) != -1:
                    case_data["request_data"] = case_data["request_data"].replace(key, value)

四. 练习

请写出下列代码的运行结果

def f(str1, *args, **kwargs):
    print(str1, args, kwargs)

l = [1, 2, 3]
t = [4, 5, 6]
d = {"a":7, "b":8, "c":9}

f(1, 2)
f(1, 2, 3, "python")
f("python", a=1, b=2, c=3)

print("================")

f("python", l, d)
f("python", *t)
f("python", *l, **d)
f("python", q="winning", **d)


运行结果:
1 (2,) {}
1 (2, 3, 'python') {}
python () {'a': 1, 'b': 2, 'c': 3}
================
python ([1, 2, 3], {'a': 7, 'b': 8, 'c': 9}) {}
python (4, 5, 6) {}
python (1, 2, 3) {'a': 7, 'b': 8, 'c': 9}
python () {'a': 7, 'b': 8, 'q': 'winning', 'c': 9}

需要注意的是f("python", *t)是把列表t先解包成 4, 5, 6,然后在def f(str1, *args, **kwargs):中将4, 5, 6重新打包成新的元组(4, 5, 6)再传递给变量args

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python3教程:*和**的打包和解包的用法 - Python技术站

(0)
上一篇 2023年4月2日 下午5:29
下一篇 2023年4月2日 下午5:29

相关文章

  • Python中logging模块用法

    一、低配logging 日志总共分为以下五个级别,这个五个级别自下而上进行匹配 debug–>info–>warning–>error–>critical,默认最低级别为warning级别。 1.v1 import logging logging.debug(‘调试信息’) logging.info(‘正常信息’) loggi…

    Python开发 2023年3月31日
    00
  • python返回多个值与赋值多个值

    一、总结 一句话总结: 返回多个值:def min_max(list1): return min(list1),max(list1) 赋值多个值:min1,max1=min_max([1,3,5]) 1、b,=tuple2 怎么理解? 当tuple2是元组或者列表,并且里面只有一个元素的时候,这样变量b可以取得这个tuple2里面的元素,而不是tuple2本…

    Python开发 2023年4月2日
    00
  • Python递归的几个经典案例

    当我们碰到诸如需要求阶乘或斐波那契数列的问题时,使用普通的循环往往比较麻烦,但如果我们使用递归时,会简单许多,起到事半功倍的效果。这篇文章主要和大家分享一些和递归有关的经典案例,结合一些资料谈一下个人的理解,也借此加深自己对递归的理解和掌握一些递归基础的用法。 一、递归的简介 1、递归的百度百科定义 程序调用自身的编程技巧称为递归( recursion)。 …

    Python开发 2023年4月2日
    00
  • Python关于异常处理的教程

    一、什么是异常 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止),在python中,错误触发的异常如下 1 语法错误 语法错误,根本过不了python解释器的语法检测,必须在程序执行前就改正。 # 语法错误示范一 if # 语法错误示范二 def test: pass # 语法错误…

    Python开发 2023年3月31日
    00
  • python中主要的英语单词汇总

    path [ pɑ:θ ] 路径 unexpected [ˌʌnɪkˈspektɪd] 不期望的 class [klɑ:s] 类 usage [ˈju:sɪdʒ] 使用 public [‘p ʌblik] 公共的,公用的 version [ˈvɜ:ʃn] 版本 private [‘praivit] 私有的,私人的 author [ˈɔ:θə®] 作者 sta…

    Python开发 2023年4月2日
    00
  • python3教程:默认参数为列表

    默认参数的坑 定义一个函数,传入一个list,添加一个end再返回 def add_end(L=[]): L.append(‘END’) return L 正常调用时,结果似乎不错 print (add_end([1,2,3])) #[1, 2, 3, ‘END’] 使用默认参数调用时,一开始结果也是对的,但是再次调用时,结果就不对了 ”’ 学习中遇到问题…

    Python开发 2023年4月2日
    00
  • Python的OptionParser模块教程

    Python中强大的选项处理模块。 示例 #!/usr/bin/pythonfrom optparse import OptionParser parser = OptionParser() parser.add_option(“-f”, “–file”, dest=”filename”, help=”write report to FILE”, meta…

    Python开发 2023年3月31日
    00
  • Python多任务教程

    一.并发和并行 多任务:一定时间段内,充分利用cpu资源,同时去执行多个任务 并发: 快速交替的 去执行多任务 并行: 真正同时的 去执行多任务 ,就是同时进行 二.多进程 1.多进程入门 知识点: 进程含义: 运行中的程序 进程特点: cpu资源分配的 最小单位 多进程模块: multiprocessing 进程类: Process 使用步骤: 导包 : …

    Python开发 2023年3月31日
    00
合作推广
合作推广
分享本页
返回顶部