首页 > 编程语言 >你能发现这段 Python 代码中的 bug 吗?

你能发现这段 Python 代码中的 bug 吗?

时间:2023-08-17 17:58:29浏览次数:27  
标签:推导 Python 代码 列表 嵌套 bug

点击链接了解详情

img


【CSDN 编者按】大家一起来找 Bug。

原文链接:https://dwrodri.gitlab.io/can-you-spot-the-bug-in-this-python-code/

本文已获作者授权,未经允许,禁止转载!

作者 | Derek Rodriguez

译者 | 弯月

责编 | 夏萌

出品 | CSDN(ID:CSDNnews)

最近,在解析文本时,我遇到了一个十分有趣的问题。在深入探讨之前,让我先来介绍一下背景故事。我的任务是分析文本文件中的一些以逗号分隔的数据,如下所示:

img

这个文本文件包含若干宽度可变的十六进制值,每行至少三个字段。我只关心第一个和第三字个段。在我看来,分析工作可分为三步:

  1. 循环读取每一行数据;
  2. 利用逗号将数据分解成一个列表;
  3. 选取第一个和第三个元素,并将它们转换为整数。

看似很简单,我可以使用 pandas DataFrame 编写几行代码就够了。

下面是我编写的代码:

img

你发现 bug 了吗?反正我没看出来。下面,我来详细解释一下这段代码,并深入剖析我究竟错在哪儿了。

img

代码详解

CSV文件是列表的列表

我简单地认为,CSV 数据就是列表的列表。因此,我可以将各个元素视为嵌入列表。我从网上的一篇帖子中找到了读取嵌入列表的代码,然后复制粘贴:

nested_lists = [[1,2,3],[4,5,6],[7,8,9]]flattened_list = [element for sublist in nested_lists for element in sublist]

以前我曾接触过 C 和 C++,之后才学习了 Python,因此在学习嵌套推导式时,我感觉 Python 只是机器可以理解的伪代码。这个嵌套列表会生成以下字节码:

img

然后,我一些自己的代码进行扩展,最终得到了以下代码:

img

img

错误

事实证明,Python 无法按照我的想象将可迭代的文本分解与推导式结合起来,你必须把 .split(",") 调用放在另一个列表中:

img

这让我有点伤脑筋,因为 .split(",") 本身就是一个列表,将它打包到另一个列表中,岂不变成了双重嵌套列表?我不太明白。我尝试通过编译器浏览器寻找答案。下图展示了正确的生成器表达式与我编写的代码之间的差异:

img

你看出问题所在了吗?代码中的问题在于,在分解文本之前,.split() 的返回值是迭代器。我不确定,但我相信这关系到最初提出列表推导式的建议时确立的实现细节。

最后,我在 CPython 的贡献者 Crowthebird 的帮助下解决了这个问题,他演示了在不使用推导式的情况下重写代码的问题。

错误的写法:

img

正确的写法:

img

img

这个问题可以得到解决吗?

这实际上是因为我对 Python解释器的理解有错,解释器本身没有问题。我不认为按照我的理解修改语言会更好,因为如此很难区分在嵌套的情况下容器何时应该解构,何时应该重用,此外列表推导式会返回元组,而 PEP 202 规定不允许。

img

标签:推导,Python,代码,列表,嵌套,bug
From: https://www.cnblogs.com/codingdevops/p/17638355.html

相关文章

  • Python爬虫初探
    title:Python爬虫初探date:2023-08-0116:16:51categories:CTF-Web入门description:爬取吉大贴吧前十页帖子标题终于到了基础知识的最后一节,python写爬虫程序。Python写简单爬虫主要是两个模块,requests和re,下面分别介绍一下这两个模块。requests模块初探请求模块,用来......
  • python项目 如何快速的导入和导出依赖包
    Python项目依赖包【导出】第一步:安装pipreqs包pip3installpipreqs第二步骤:进入项目的根目录执行以下命令:cd根目录第三步:转成requirements.ext文件:pipreqs./--encoding=utf-8--force如果成功,就会在根目录下生成一个requirements.txt文件,内容为本项目环境以来包已经对......
  • python中3种获取cookie解决方案
    方案一:利用selenium+phantomjs无界面浏览器的形式访问网站,再获取cookie值:fromseleniumimportwebdriverdriver=webdriver.PhantomJS()url="https://et.xiamenair.com/xiamenair/book/findFlights.action?lang=zh&tripType=0&queryFlightInfo=XMN,PEK,2018-01-15"drive......
  • python3添加ssl模块
    1.安装opensslwget https://www.openssl.org/source/openssl-1.1.1v.tar.gztar openssl-1.1.1v.tar.gzcd openssl-1.1.1v./config--prefix=/usr/local/opensslsharedzlib测试/usr/local/openssl/bin/openssl 若报错:/usr/local/openssl/bin/openssl:errorwhileloa......
  • Python实现自定义请求头消息headers
    使用python爬虫爬取数据的时候,经常会遇到一些网站的反爬虫措施,一般就是针对于headers中的User-Agent,如果没有对headers进行设置,User-Agent会声明自己是python脚本,而如果网站有反爬虫的想法的话,必然会拒绝这样的连接。而修改headers可以将自己的爬虫脚本伪装成浏览器的正常访问,来......
  • 【航迹】基于MN逻辑算法实现航迹关联和卡尔曼滤波外推附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘
    写在前面Python中有许多有趣和强大的模块,其中一个非常有趣的模块就是pynupt。pynupt是基于pynput模块的一个封装,用于控制鼠标和键盘。它可以实现自动化操作和游戏外挂等功能。本文将详细介绍pynupt模块的使用方法和常见的功能。1.安装pynput模块在开始使用pynupt之前,我们需要......
  • python3 安装clickhouse_sqlalchemy(greenlet) 失败
    环境信息:centos7操作系统,python3.8执行pip3installclickhouse_sqlalchemy或者pip3installgreenlet报以下报错:Command"/opt/python3.6.10-customized/bin/python3.6-u-c"importsetuptools,tokenize;file='/tmp/pip-install-wbyi43ip/greenlet/setup.py';f=g......
  • 路径规划算法:基于绯鲵鲣算法的机器人路径规划算法- 附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • python中%d、%i、%.nf、%s占位符
     001、%d:整数%i:十进制整数%.nf:浮点数%s:字符串 举例:>>>print("aaaa%dbbbb"%10)##整数aaaa10bbbb>>>print("aaaa%ibbbb"%10)##十进制整数aaaa10bbbb>>>print("aaaa%.2fbbbb"%10)##浮点数......