Python:列表也能拆包?

前幾天,微信學習羣裏有個小夥伴在看書時遇到了這樣一個問題,在羣裏提問,看下圖:python

這是經常使用的 matplotlib 庫,只是通常咱們調用 plot 方法繪圖時,不會去關心它的返回值。然而 plt1, = plt.plot(...) 這種寫法是什麼意思?被賦值的變量和賦值符號之間多了個逗號。bash

個人確歷來沒關心過 plot 函數的返回值是什麼,因此當我看到這個截圖的時候,第一反應是覺得返回值有多個,代碼只取了第一個,剩餘的被忽略了。這種狀況通常都是用 _ 作佔位符,來忽略不關心的值。微信

佔位符 _ 也能夠省略嗎?我迅速打開 PyCharm 驗證了一把,事實證實,_ 不能夠省略,個人想法是錯了。app

爲了查明緣由,我去查了 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
複製代碼

我這才反應過來,這是列表拆包啊。變量後面的逗號,是由於返回的列表中只有一個元素,因此拆包的時候變量後面要加個逗號,標明這是拆包,不是賦值。學習

代碼中,咱們用的比較多的是元組拆包,各類書裏也可能是講元組拆包,因此忽略了列表也是能夠拆包的。看下面的例子:spa

x, y = [1, 2]
print(x, y)
複製代碼

輸出:3d

1 2
複製代碼

不只是元組和列表,全部可迭代對象均可以拆包。咱們能夠自定義一個可迭代對象(只須要實現其協議即 __iter__ 方法便可),來驗證一下,代碼以下:code

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)
複製代碼

輸出:orm

0 1 2
複製代碼

掃碼關注個人公衆號

大齡碼農的Python之路
相關文章
相關標籤/搜索