前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python:列表也能拆包?

Python:列表也能拆包?

作者头像
丹枫无迹
发布2019-05-17 12:13:57
8510
发布2019-05-17 12:13:57
举报
文章被收录于专栏:学无止境

前几天,微信学习群里有个小伙伴在看书时遇到了这样一个问题,在群里提问,看下图:

这是常用的 matplotlib 库,只是一般我们调用 plot 方法绘图时,不会去关心它的返回值。然而 plt1, = plt.plot(...) 这种写法是什么意思?被赋值的变量和赋值符号之间多了个逗号。

我的确从来没关心过 plot 函数的返回值是什么,所以当我看到这个截图的时候,第一反应是以为返回值有多个,代码只取了第一个,剩余的被忽略了。这种情况一般都是用 _ 做占位符,来忽略不关心的值。

占位符 _ 也可以省略吗?我迅速打开 PyCharm 验证了一把,事实证明,_ 不可以省略,我的想法是错了。

为了查明原因,我去查了 matplotlib 的源码,发现 plot 函数返回的是一个列表,源码如下:

代码语言:javascript
复制
def plot(self, *args, **kwargs):
    scalex = kwargs.pop('scalex', True)
    scaley = kwargs.pop('scaley', True)

    if not self._hold:
        self.cla()
    lines = []

    kwargs = cbook.normalize_kwargs(kwargs, _alias_map)

    for line in self._get_lines(*args, **kwargs):
        self.add_line(line)
        lines.append(line)

    self.autoscale_view(scalex=scalex, scaley=scaley)
    return lines

我这才反应过来,这是列表拆包啊。变量后面的逗号,是因为返回的列表中只有一个元素,所以拆包的时候变量后面要加个逗号,标明这是拆包,不是赋值。

代码中,我们用的比较多的是元组拆包,各种书里也多是讲元组拆包,所以忽略了列表也是可以拆包的。看下面的例子:

代码语言:javascript
复制
x, y = [1, 2]
print(x, y)

输出:

代码语言:javascript
复制
1 2

不仅是元组和列表,所有可迭代对象都可以拆包。我们可以自定义一个可迭代对象(只需要实现其协议即 __iter__ 方法即可),来验证一下,代码如下:

代码语言:javascript
复制
class TestClass:
    def __init__(self):
        self._list = range(3)

    def __iter__(self):
        for i in self._list:
            yield i


x, y, z = TestClass()
print(x, y, z)

输出:

代码语言:javascript
复制
0 1 2
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档