趣味的Python解包方法

python中的解包你可以这个样子来理解:一个list是一个整体,想把list中的每一个元素都当成一个个个体剥离出来,这样的一个过程就是解包,让我们先来看下面的这一些例子(总共分为12个部分)。

1.将list的每一个元素都赋值给一个变量

>>> name

'Bob'

>>> age

20

>>> date
趣味的Python解包方法
>>> name, age, date = ['Bob', 20, '2018-1-1']

2.可迭代的对象都可以这个样子来做

>>> a,b,c = ['a', 'b', 'c']

>>> a

'a'

>>> a,b,c = enumerate(['a', 'b', 'c'])

>>> a

(0, 'a')

# 元组

>>> a,b,c = ('a', 'b', 'c')

>>> a

'a'

# 字典

>>> a,b,c = {'a':1, 'b':2, 'c':3}

>>> a

'a'

>>> a,b,c = {'a':1, 'b':2, 'c':3}.items()

>>> a

('a', 1)

# 字符串

>>> a,b,c = 'abc'

>>> a

'a'

# 生成器

>>> a,b,c = (x + 1 for x in range(3))

>>> a
趣味的Python解包方法
趣味的Python解包方法

列表

如果可迭代对象包含的元素和前面待赋值变量数量不一致,则会报错。但是可以通过*来表示多个元素

3.星号的使用方法

比如我们想要计算一个平均分,先去除最高分和最低分,我们除了可以用切片以外,还可以使用解包的方式获得中间的数值

>>> new
趣味的Python解包方法
>>> first, *new, last = [94, 85, 73, 46]

用*来表示多个数值

4.压包过程

压包就是解包的逆过程,使用zip函数来实现,下面的例子可以让你对压包有比较一个直观的感受

>>> b = [1, 2, 3]

>>> for i in zip(a, b):

... print(i)

...

('a', 1)

('b', 2)
趣味的Python解包方法
>>> a = ['a', 'b', 'c']

5.压包与解包混合的例子

下面的这个例子实现:两个列表对应数值相加

>>> b = [1, 2, 3]

>>> for i, j in zip(a, b):

... print(i+j)

...

1

3
趣味的Python解包方法
>>> a = [0, 1, 2]

细细拆解上面过程,可以看出步骤是这样的

  • 先是zip函数将a b压包成为一个可迭代对象对可迭代对象的每一个元素(('a', 1))进行解包(i, j = ('a', 1))此时就可以分别调用i j变量进行计算

下面我们加入星号

... ('Mary', '1996-1-4', 50),

... ('Nancy', '1993-3-1', 55),]

>>> for name, *args in l:

... print(name, args)

...

Bob ['1990-1-1', 60]

Mary ['1996-1-4', 50]
趣味的Python解包方法
>>> l = [('Bob', '1990-1-1', 60),

6._的使用方法

当有一些元素你不想用时,使用_表示是更好的写法了,这样就可以让读代码的人知道这个元素是不person = ('Bob', 20, 50, (11, 20, 2000))要的

>>> name, *_, (*_, year) = person

>>> name

'Bob'

>>> year
趣味的Python解包方法
>>> person = ('Bob', 2, 50, (11, 20, 2000))

7.多变量同时赋值

之前的赋值符号右侧都是可迭代对象,其实>>> a, b = 侧也可以多个变量

>>> a

1

>>> b

2

>>> a = 1, 2

>>> a
趣味的Python解包方法
>>> a, b = 1, 2

下面的使用方法都会报错

趣味的Python解包方法
*a = 1, 2

可以这样

趣味的Python解包方法

8.之可变参数*

在定义函数时,我们使用*的可变参数,其实也是压包解包过程

... print(num)

...

>>> myfun(1,2,5,6)
趣味的Python解包方法

``

def myfun(num):
``
参数用
num表示,num变量就可以当成元组调用了。

其实这个过程相当于*num, = 1,2,5,6

9.之关键字参数*

... print(kw)

...

>>> myfun(name = "Bob", age = 20, weight = 50)

{'weight': 50, 'name': 'Bob', 'age': 20}

键值对传入**kw,kw就可以表示相应字典。

**的用法只在函数定义中使用,不能这样使用

趣味的Python解包方法
>>> def myfun(**kw):

10.可变参数与关键字参数的细节问题

1.函数传入实参时,可变参数(*)之前的参数不能指定参数名

... print(a)

... print(b)

...

>>> myfun(a=1, 2,3,4)

File "<stdin>", line 1

SyntaxError: positional argument follows keyword argument

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

1
趣味的Python解包方法
>>> def myfun(a, *b):

2.当函数传入实参时,可变参数(*)之后的参数必须指定参数名,否则就会被归入到可变参数之中

... print(a)

... print(b)

... print(c)

...

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

1

(2, 3, 4)

None

>>> myfun(1, 2,3,c=4)

1

(2, 3)
趣味的Python解包方法
趣味的Python解包方法
>>> def myfun(a, *b, c=None):

如果一个函数想要使用的时候必须明确指定参数名,可以将所有参数都放在可变参数之后,而可变参数不用管它就可以,也不用命名,如下

... print(a)

... print(b)

...

>>> myfun(a = 1,b = 2)

1
趣味的Python解包方法
>>> def myfun(*, a, b):

可变参数的这两条特性,可以用于将 只需要按照位置赋值的参数 和 需要明确指定参数名的参数区分开来

3.关键字参数都只能作为最后一个参数,前面的参数按照位置赋值还是名称赋值都可以

下面展示一个既用可变参数有用关键字参数的例子

... print(a)

... print(b)

... print(c)

... print(d)

...

>>> myfun(1, 2, 3, c= 4, m = 5, n = 6)

1

(2, 3)

4
趣味的Python解包方法
>>> def myfun(a, *b, c, **d):

4.可变参数与关键词参数共同使用以表示任意参数4下面是这一点在装饰器当中的使用

... def wrapper(*args, **kw):

... print('I am using a decorator.')

... return func(*args, **kw)

... return wrapper

...

>>> @mydecorator

... def myfun(a, b):

... print(a)

... print(b)

...

>>> myfun(1, b = 2)

I am using a decorator.

1
趣味的Python解包方法
趣味的Python解包方法
>>> def mydecorator(func):

(如果有的读者不熟悉装饰器,只需要知道,使用@定义myfun相当于myfun = mydecorator(myfun),定义出来的myfun其实是返回结果wrapper函数)

wrapper函数使用*args, *kw作为参数,则被修饰的myfun函数需要的参数无论是什么样的,传入wrapper都不会报错,这保证了装饰器可以修饰各种各样函数的灵活性。毕竟我们一般在函数中传入参数时,要么所有参数名都写,要么前面几个不写,后面的会写,这样使用args, **kw完全没有问题。

11.解包作为参数传入函数中

首先定义一个函数

趣味的Python解包方法

def myfun(a, b):

列表元组的解包

>>> myfun(*n)

3

>>> m = (1, 2)

>>> myfun(*m)
趣味的Python解包方法
>>> n = [1, 2]

字典的解包

>>> myfun(**mydict)

3

>>> myfun(*mydict)
趣味的Python解包方法
>>> mydict = {'a':1, 'b': 2}

一个应用

>>> "{name}'s age is {age}".format(**bob)
趣味的Python解包方法
>>> bob = {'name': 'Bob', 'age': 30}

12.多返回值函数

下面过程也涉及到了解包

return a + 1, b + 2

>>> m, n = myfun(1, 2)

>>> m

2

>>> n
趣味的Python解包方法
def myfun(a, b):

其实本身是一个元组

趣味的Python解包方法

Python学习交流群:834+179+111,群里有很多的学习资料。欢迎欢迎各位前来交流学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • 1、图形化界面设计的基本理解当前流行的计算机桌面应用程序大多数为图形化用户界面(Graphic User Inte...
    IIronMan阅读 257,086评论 15 243
  • Windows 常用消息大全 表A-1 Windows消息分布 消息范围说 明 0 ~ WM_USER – 1系统...
    北风知我意阅读 2,034评论 0 0
  • 1、窗体 1、常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。 ...
    Moment__格调阅读 4,540评论 0 11
  • 忽略第四只小人幸福的笑歪了的咧嘴~ 老师说用勾线笔勾线时可以慢慢来,但不能断开,画的时候有些许的焦躁,难免要手抖。...
    高山子阅读 1,934评论 5 1
  • 在运行时识别对象和类的信息有两种方式: RTTI(Run-Time Type Identification,运行时...
    SeaRise阅读 363评论 0 0