python2中的print语句可以不用小括号。_Python 中那些令人防不胜防的坑I

2023-05-16

在学习 Python 的过程中,我为它的简洁优雅而痴迷,但它又是如此的调皮,在提供了很多舒服的功能特性之外,又悄悄挖了很多带有迷惑性的坑,令人防不胜防...

人不能两次踏入同一条河流,在无数次踩进同样的坑里之后,我觉得我有必要整理一下,一为自警,二为给大家提个醒,希望你不要和我犯相同的错误。 这会是一个系列,每篇 5 个 ,系列文章更新不定,不想错过的,记得 点个 关注 ,不迷路。 4ce25120bc3ae9d99c87f68a34c25950.png 0x00 走丢的外部变量

首先我们先来看这么一个例子:

429

PS:except Exception as e 可以捕获除了与程序退出(sys.exit())相关之外的所有异常。

在继续向下看之前,你可以先思考一下上述例子可能出现的结果是什么,也可以自己尝试着在编译器里输入一下。思考完了请继续往下看。

出现的结果如下:

call 

竟然报错了,那么这到底是为什么呢?

其实这是因为在 Python3 中使用 as 分配异常的时候,在 except 的末尾将会把这个异常清除掉(在 Python2 中则不会出现这样的情况)。这就好像将上面的示例变成下面的样子:

429

通过上面的变形代码,我们可以很清楚的看明白发生这一切的根源是什么:因为 e 被删除了。这也变相的告诉我们,如果想要在 except 后面引用 e,必须将它先赋值给其它变量

这样看来,是变量 e 执行了 except 子句而被删除,但是为什么 e 会去执行 except 子句呢?仅仅是因为 e 和 as 后面的 e 长的一毛一样?

答案是否定的,其实这个是因为子句在 Python 中没有独立的作用域,所以上述示例中的所有内容都处于同一个作用域里,所以变量 e 会因为执行了 except 子句而被删除。

0x01 同样是加,却不一定等价

在我们来表示「加」这个概念的时候,一般我们会用两种方式:a = a + b或者是 a += b 。在很多人的概念里这两个其实就是一种,不分彼此,比如之前我就是这么认为的,直到有一天有人拿着下面的坑过来让我踩...

首先我们先来看第一个例子:

>>> a = [1,2,3]

一个很简单的例子,你知道此时的 a 和 b 分别是多少么?请先自己思考一下再继续向下看:

>>> a

估计很多人都会答对,表达式 a = a + [4,5,6] ,等号右边其实是形成了一个新的列表,最后让 a 引用了这个新的列表,而 b = a 引用的是之前的 a,所以 b 保持不变。

明白了上面的例子,我们接下来再看一个稍微有点区别的例子:

>>> a = [1,2,3]

上面的例子和文章开头的例子区别在从 + 变成了 +=,按照我们惯性思维去想,肯定以为这俩例子就是一个东西的两种不同写法而已,可实际上真的是这样吗?让我们来看一下此时的 a,b:

>>> a

咦?同样是印象里的「加」,好像真的哪里有点不一样诶。。

通过上面我们就可以看出 a = a + b 和 a += b 并不总是表现相同,起码在列表上就是这么表现的。在这里的 a += [4,5,6] 实际上使用的是 extend 函数,所以 a 和 b 仍然指向已被修改的同一列表。 

既然在这里说到了 + 和 +=,索性再多补充一点:在使用「加」的概念来连接字符串的时候,+= 其实比 + 的速度更快。 

下面我们来实际的演示一下用 + 连接三个字符串:

>>> import timeit

上面的两个结果很容易看出来,在处理速度上,+= 比 + 处理的速度要快的多。出现这样现象的原因是 += 执行的是追加操作,追加操作的话就会比 + 少了一个销毁然后新建的动作,比如在 a += b + c 上 a 就不会被销毁。

0x02 不一般的小括号

很多学过别的编程语言的同学,很容易会忽略小括号 “()” 在 Python 中的一个重要表现,那就是小括号还能表示“元组” 这一不可变数据类型

>>> type(())

但是如果小括号内只有一个元素的话,比如像下面这样,它就是小括号内的元素类型:

>>> tur = (
天呐个天... 那么如果想要表示一个元素的元组咋整呢?要像下面这样:
>>> tur = (
加个逗号 “,” 就 ok 啦 ... 8f6515d7a7bcc29e3b2d1e540c2b8ebd.png 0x03 列表的删除没有那么简单 假如我们有一个列表,我想删除列表中的元素:
>
在刚开始学习 Python 之初,这是很多同学容易想到的做法,然而我们来看一下程序运行完以后的结果:
>
看到这个结果,我... 217eb8090525a2a8764efcfe29b1f611.gif 这是为啥子呢?是因为在 for 循环中,如果我们删除了 index = 0 (即 1)的值,原本 index = 1  及其之后的值会向前补位,所以当前 index = 1 的值为之前 index = 2 的值。 列表的删除操作我们经常要用,所以大家要打起十二分的精神来对它。 0x04  is not 不分家 is not 在 Python 中是一伙的,用的时候要靠在一起,分开以后就是两个东西,结果会不一样...
>>> [
这就在于,is not 是个单独的二元运算符,当它两侧的变量指向同一个对象的时候,结果为 False,否则结果为 True,希望引起大家的注意...

看完有所收获?点个在看,让更多人可以看到~谢谢啦

「TOP程序员 交流群」已开放

想入群的可在公众号后台回复「入群」

de381ad4a1f46dc94198890dd07663c5.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python2中的print语句可以不用小括号。_Python 中那些令人防不胜防的坑I 的相关文章

  • Python OpenCV:检测大体运动方向?

    我仍在编写一个书籍扫描脚本 现在 我所需要的只是能够自动检测翻页 这本书占据了 90 的屏幕 我使用一个粗糙的网络摄像头进行运动检测 所以当我翻页时 运动方向基本上是同一个方向 我修改了一个运动跟踪脚本 但导数却无济于事 usr bin e
  • 如何在 Python 中使用 PIL 将一张图像合成到另一张图像上?

    我需要拍摄一张图像并将其放置到新生成的白色背景上 以便将其转换为可下载的桌面壁纸 所以这个过程是这样的 生成尺寸为 1440x900 的新的全白图像 将现有图像放在顶部居中 另存为单张图像 在 PIL 中 我看到ImageDraw对象 但没
  • 在 Idle shell 中导入模块

    我正在尝试学习 python 但在导入模块时遇到问题 我有一个 pyc 文件 我正在尝试将其导入到名为 dfa pyc 的空闲 shell 中 我将该文件放在名为 xyz 的文件夹中 我使用以下命令导航到该文件夹 os chdir User
  • 当参数具有相同名称时如何恢复内置函数? [复制]

    这个问题在这里已经有答案了 我知道你是 不应该 https stackoverflow com questions 2417979 can i use variable name type as function argument in p
  • numpy float:算术运算比内置函数慢 10 倍?

    我对以下代码的计时非常奇怪 import numpy as np s 0 for i in range 10000000 s np float64 1 replace with np float32 and built in float 内
  • Excel 工作表到 Numpy 数组

    我正在尝试做一件令人难以置信的简单事情 将 Excel 工作表的部分内容加载到 Numpy 数组中 我发现了一个有用的拼凑 但它令人尴尬地不Pythonic 假设我的工作表被加载为 ws 代码 A np zeros 37 3 for i i
  • 二维高斯函数不能产生正确的结果

    我想写一个返回一个的函数np array尺寸的nx x ny包含具有均值的中心高斯分布mu and sd sig 下面的代码在某些情况下有效 但在许多情况下无效 有什么问题或者我还应该写什么来获得我需要的东西 import matplotl
  • Anaconda-Python RequestsDependencyWarning:urllib3 (1.22) 或 chardet (2.3.0) 与支持的版本不匹配

    我收到一条警告 该警告似乎没有在任何其他在线资源中涵盖 我安装了 Anaconda Python 3 6 创建新的 Conda 环境时收到的警告是 RequestsDependencyWarning urllib3 1 22 or char
  • ValueError:BitVect 的长度必须相同(rdkit)

    我正在计算 2 个摩尔之间的结构相似性概况rdkit 当我在 google colab 中运行程序时 rdkit 2020 09 2 python 3 7 程序运行良好 当我在 PC 上运行时出现错误 rdkit 2021 03 2 pyt
  • 带参数的多重继承

    我已经阅读了很多有关继承的内容 但我似乎无法理解为什么这会给我一个错误 使用Python 2 7 x class A object def init self value super A self init print First s va
  • 将多嵌套 dict/json 加载到 pandas 中

    我正在尝试加载一个非常令人困惑的多重嵌套JSON变成熊猫 我已经在使用了json 规范化 http pandas pydata org pandas docs stable reference api pandas io json json
  • Numpy:导入错误:无法导入名称测试用例

    我安装了 numpy sudo apt get install numpy 然后在 python2 7 中导入 numpy import numpy 我收到这个错误 Traceback most recent call last File
  • 如何通过 Python 的请求使用 FTP

    是否可以使用requests与 FTP 站点交互的模块 requests获取 HTTP 页面非常方便 但当我尝试使用 FTP 站点时 我似乎遇到架构错误 我有什么遗漏的吗requests允许我执行 FTP 请求 还是不支持 对于像我一样得到
  • 在 docker 中使用 selenium 运行 django 测试

    为了执行测试 我通常运行一个单独的容器 docker compose run rm web bin bash 其中web是django的容器 我不时从 shell 执行 py test 为了能够使用 django 从容器访问 seleniu
  • python 求数组中正数之和的函数

    我需要编写一个函数 它接受一个数字数组并找到所有数字的最大和 换句话说 我需要找到正数的总和 我写了这个 我收到 列表超出范围 想法 def maximum sub A x 0 i 0 for i in A while A i gt 0 x
  • Pyspark 可为空的 uuid 类型 uuid 但表达式的类型为字符变化

    给定一个表格设计不可为 null 的 uuid列和a可为空的 uuid列 如何使用 python 3 7 9 与 Pyspark 2 4 3 数据帧和 postgresql 42 2 18 jar 驱动程序进行插入 table df spa
  • Django 查询集权限

    我正在构建一个相当复杂的Django在电子邮件扫描服务之上使用的应用程序 这Django应用程序是使用 Python 3 5 编写的 该应用程序主要使用Django Rest Framework处理与浏览器前端的通信 我目前遇到的问题是我尝
  • 找不到满足 pkg-resources==0.0.0 要求的版本

    我的应用程序部署在heroku 当我通过推送我的代码时git push heroku master 它给了我这个错误 Collecting pkg resources 0 0 0 from r requirements txt line 1
  • 处理在没有全局变量的情况下跨函数使用的变量

    所以我正在开发一个基本的文字游戏 你会得到一只字母 手 字典对象 你可以用它来创建单词并获得分数 这个 手牌 被用在许多函数的参数中 计算玩家的分数 在玩家使用一个或多个字母后更新手牌中的字母数量 显示手牌 检查玩家单词的有效性 ETC 从
  • 使用 Python 2.7 解析 msg/eml 文件

    有没有可以解析msg或eml文件的库 我编写了一个脚本 一旦将电子邮件转换为 txt 文件 就会对其进行解析 但是我找不到一个电子邮件客户端 可以让我轻松地将电子邮件从 gui 拖放到文件夹中作为 txt 文件 如果有人知道这一点 我会很高

随机推荐