zoukankan      html  css  js  c++  java
  • 【Python】列表拆包

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

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

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

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

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

    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

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

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

    x, y = [12]
    print(x, y)

    输出:

    1 2

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

    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)

    输出:

    0 1 2
  • 相关阅读:
    jdk环境一键配置
    IIS 浏览aspx页面出现 无法显示 XML 页
    ASP.NET MVC(三)
    ASP.NET MVC(二)
    ASP.NET MVC (一)
    Fatal error: Call to a member function bind_param() on a non-object in
    Eclipse字符集设置方式
    mysql 管理工具
    win7 IIS发布项目遇到的问题
    php 环境的搭建
  • 原文地址:https://www.cnblogs.com/gl1573/p/10868188.html
Copyright © 2011-2022 走看看