python之打包、解包

部署运行你感兴趣的模型镜像

通俗解释:

打包:将多个物品装到一个盒子里

解包:将盒子里的物品放到不同袋子中

1、python自动实现可迭代对象的打包、解包

打包:多个以逗号分隔的值(可以是不同类型)赋给一个变量时,多个值会被打包成一个元组类型赋值给变量

解包:将可迭代对象中的元素依次赋值给多个变量,左侧变量数==可迭代对象的元素个数,否则会报ValueError

# 打包:python自动将元素打包成元祖
a = 1,2,3  # a为(1,2,3)

# 解包
x, y, z = a   # x=1,y=2,z=3
x, y, z = [1, 2, 3]    # x=1,y=2,z=3
x, y = {'a':1,'b':2}    # x=a,y=b 默认将字典的key赋值给变量
x, y = {'a':1,'b':2}.items()    # x=('a', 1) ,y=('b', 2)
x, y = 'hg'    # x=h,y=g
    
# 可迭代对象包含的元素和前面待赋值变量数量不一致,会报错
x, y = a  # 报错:ValueError: too many values to unpack (expected 2)   包里解压太多元素
x, y, z, o = a  # 报错:ValueError: not enough values to unpack (expected 6, got 5)  包里没有足够元素可以解压

2、*对可迭代对象进行打包/解包

# 打包
x, *y = [1, 'ttt', 66]
print(x,y)    # x=1,y=['ttt', 66]
x, *y = {'a':1,'b':2,'c':3}
print(x,y)    # x=a,y=['b', 'c']
x, *y = 'tykl'
print(x,y)    # x=t,y=['y', 'k', 'l']
x,*y = {1,'ysl','oo'}
print(x,y)    # x=ysl,y=[1, 'oo']
# 异常情况
*x = 1, 2 # 报错:SyntaxError: starred assignment target must be in a list or tuple
*x, = 1, 2 # x=[1, 2]


# 解包
# 元祖
a = (1, 2, 3)
print(*a) # 打印1 2 3
# 列表
b = [1, 2, 3]
print(*b) # 打印1 2 3
# 字典
c = {'a':1,'b':2}
print(*c) # 打印 a b
print(*c.values()) # 打印 1 2
print(*c.items())   # 打印 ('a', 1) ('b', 2)
# 集合
d = {1, 2, 2}
print(*d)  # 打印 1 2
# 字符串
e = '6yt1'
print(*e)  # 打印 6 y t 1 

print()函数只支持 *args,不支持 **kwargs

print(**c) 
# 报错:TypeError: 'a' is an invalid keyword argument for print()

3、打包、解包在函数中的应用

3.1 在函数定义时:使用 */** 收集元素进行打包,不限制传入参数的个数,分为2种:

  • *args:使用元祖获取传入的参数
  • ** kwargs:使用字典接收传入的 k=w 形式的关键字参数
def myfunc(*args, **kwargs):
    print(type(args),type(kwargs))
    print(args)
    print(kwargs)

myfunc(1, 2, 3, a=1, b=2)

执行结果:
<class 'tuple'> <class 'dict'>
(1, 2, 3)
{'a': 1, 'b': 2}

注意点:(1)python语法规定:*args参数需要放在 **kwargs参数前;(2)python语法规定:**kwargs关键字参数后不能有其他参数;(3)(参数1,*args,参数2)必须要求函数传递参数2,且参数2必须是关键字参数

def myfunc5(x, *args, y):
    print(f'x:{x}\nargs:{args}\ny:{y}')

myfunc5(7, 8, 9, 10, 11, y='aa')

执行结果:
x:7
args:(8, 9, 10, 11)
y:aa

3.2 在函数调用时,使用 */** 对参数进行解包

def myfunc2(x, y, z):
    print(x, y, z)

li = [1, 2, 3]
myfunc2(*li)

执行结果:
1 2 3
# 根据key值匹配函数的参数值,依次将value值传入函数中
def myfunc2(a, b, c):
    print(a, b, c)

dic = {'c':1, 'a':2, 'b':3}
myfunc2(**dic)  # 根据字典key将对应value值传入函数中,顺序不重要,但是key不能多不能少

执行结果:
2 3 1

3.3 组合使用

def myfunc3(x, *args, **kwargs):
    print(f'x:{x}\nargs:{args}\nkwargs:{kwargs}')
    pass

li = 'ysl', 99, 88
myfunc3(9, *li, a=9, **{'name':'ysl', 'age': 18})

执行结果:
x:9
args:('ysl', 99, 88)
kwargs:{'a': 9, 'name': 'ysl', 'age': 18}

3.4 函数返回:Return a,b,... ---->实际是返回元组(a, b, ...)

def myfunc4(a, b):
    a += 2
    b += 4
    return a,b

tmp = 1, 2
result = myfunc4(*tmp)
print(type(result))
print(result)

执行结果:
<class 'tuple'>
(3, 6)

有问题或补充欢迎留言

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值