前几天,微信学习群里有个小伙伴在看书时遇到了这样一个问题,在群里提问,看下图:python
这是经常使用的 matplotlib 库,只是通常咱们调用 plot
方法绘图时,不会去关心它的返回值。然而 plt1, = plt.plot(...)
这种写法是什么意思?被赋值的变量和赋值符号之间多了个逗号。微信
个人确历来没关心过 plot
函数的返回值是什么,因此当我看到这个截图的时候,第一反应是觉得返回值有多个,代码只取了第一个,剩余的被忽略了。这种状况通常都是用 _
作占位符,来忽略不关心的值。app
占位符 _
也能够省略吗?我迅速打开 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
我这才反应过来,这是列表拆包啊。变量后面的逗号,是由于返回的列表中只有一个元素,因此拆包的时候变量后面要加个逗号,标明这是拆包,不是赋值。spa
代码中,咱们用的比较多的是元组拆包,各类书里也可能是讲元组拆包,因此忽略了列表也是能够拆包的。看下面的例子:code
x, y = [1, 2]
print(x, y)
输出:orm
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)
输出:blog
0 1 2