Python:列表也能拆包?
2024-09-08 04:21:27
前几天,微信学习群里有个小伙伴在看书时遇到了这样一个问题,在群里提问,看下图:
这是常用的 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 = [1, 2]
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
最新文章
- 09 Request/Response
- .NET编译的目标平台(AnyCPU,x86,x64)
- java new synchronized
- 说说QQ空间SEO
- Python分类统计数据
- HTML 详细介绍
- css中element element和element>;element选择器的区别
- POJ 3934 Queue(DP)
- 这交互炸了(四) :一分钟让你拥有微信拖拽透明返回PhotoView
- mybatis源码之BaseStatementHandler
- Java PDF页面设置——页面大小、页边距、纸张方向、页面旋转
- unittest测试用例的执行顺序
- js面向对象和php面向对象的区别
- 取模性质,快速幂,快速乘,gcd和最小公倍数
- C# 下载文件
- express中session的使用
- python的random模块(生成验证码)
- http协议下载文件
- C# 跳转新页面
- Rookey.Frame企业级快速开发框架开源了
热门文章
- Dedecms丨显示指定的导航栏
- 理解SetCapture()和ReleaseCapture()及GetCapture()作用
- STL stl_construct.h
- HTML5视音频标签参考
- HihoCoder1663双阶乘的末尾数字([Offer收割]编程练习赛40)(暴力||数学)
- Java Modifiers
- oracle隐含参数的查看与修改
- Git 系列之tag的用法---为你的代码标记版本号
- ElasticSearch logo 分布式搜索引擎 ElasticSearch
- Java常见设计模式之工厂模式