一日一技:print大法为什么会浪费你的时间?

简介: 一日一技:print大法为什么会浪费你的时间?

我是极度反对使用Python 2的,但是可能有一些项目由于历史原因不得不使用Python 2,那么你可能会遇到一些非常诡异的问题。

这里给你看一个例子:

下面这一段函数,是从基于Python 2的一个Django项目中摘录出来的例子,让你看看Python 2 + print大法,会如何浪费你的时间。

def check_include(data):
     pattern = '你好.*?世界'
     print '========', data, '========='
     if re.search(pattern, data):
         print '包含'
         return
     print '不包含'

这一段代码用于检查参数 data中是否有『你好』和『世界』两个词语。

首先运行一下代码,可以看到如下的输出:

  1. ========别对我说你好,因为我不是世界=========
  2. 不包含

难道说pattern有问题?这一次改一下代码,把pattern也打印出来:

def check_include(data):
     pattern = '你好.*?世界'
     print '========', pattern, '========', data, '========='
     if re.search(pattern, data):
         print '包含'
         return
     print '不包含'

这一次的输出为:

  1. ========你好.*?世界========别对我说你好,因为我不是世界=========
  2. 不包含

难道正则表达式写错了?于是在Python里面测试正则表达式,发现是可以正确识别的:

>>> import re
>>> data = '别对我说你好,因为我不是世界'
>>> pattern = '你好.*?世界'
>>> re.search(pattern, data)
<_sre.SRE_Match object at 0x109590ac0>

那么为什么代码放在一个项目里面就不能识别呢?

如果你继续使用print大法,你会花很长时间才能定位到问题。但如果你使用PyCharm的调试模式,那么你1秒钟就能找到问题。

我们来看看如果用调试模式,你会看到什么好东西:

注意红框框住的两个变量,data的数据类型是 unicode而pattern的数据类型是 str,由于数据类型不一样,所以导致了正则表达式无法识别。但是,如果你用print直接打印这两个变量,你是无法知道他们的数据类型不一样的!

要解决这个问题也非常简单,只需要修改定义 pattern的这一行:

pattern = u'你好.*?世界'

一切就正常了。如下图所示。

这个问题告诉你如下三点:

  1. 别用Python 2!
  2. 如果必需用Python 2,请把所有字符串全部设置为 unicode类型!
  3. 不要使用print大法。善用调试功能!


目录
相关文章
|
数据可视化 Java 数据库
28个案例问题分析---20---内存长期占用导致系统慢--jvm调优
28个案例问题分析---20---内存长期占用导致系统慢--jvm调优
316 0
|
4月前
|
JavaScript 前端开发
JavaScript,每5秒打印,已运行时间,和还剩多少时间,多少分,多少秒
JavaScript,每5秒打印,已运行时间,和还剩多少时间,多少分,多少秒
|
6月前
|
敏捷开发 测试技术 持续交付
编码过程中有效地管理时间和精力,避免陷入无休止的调试循环
编码过程中有效地管理时间和精力,避免陷入无休止的调试循环
|
存储
ps打开之后切图一段时间C盘存储量变小怎么清理?
首先不想占用C盘空间的话可以打开ps->编辑->首选项->暂存盘,更改为除C盘外的其他盘,这个暂存盘存储的是使用ps切图时产生的临时存储文件,默认是C盘,ps关闭之后,一般会释放。
182 0
|
算法 C语言
04【C语言 & 趣味算法】“抓交通肇事犯”问题。算法改进:设置“标识变量”,有效减少循环次数。
04【C语言 & 趣味算法】“抓交通肇事犯”问题。算法改进:设置“标识变量”,有效减少循环次数。
04【C语言 & 趣味算法】“抓交通肇事犯”问题。算法改进:设置“标识变量”,有效减少循环次数。
|
Python
更好的print :嫌弃print太单调 那么来试试这几种方法吧
更好的print :嫌弃print太单调 那么来试试这几种方法吧
更好的print :嫌弃print太单调 那么来试试这几种方法吧
TeaVM编译耗时太长,为节省时间,跳过test
TeaVM编译耗时太长,为节省时间,跳过test
82 0
|
Oracle 算法 Java
刨根问底---一次OOM试验造成的电脑雪崩引发的思考
刨根问底---一次OOM试验造成的电脑雪崩引发的思考
|
存储 SQL 监控
由一次不断GC并耗费过长的时间所想到的工具 - jvmkill与jvmquake
由一次不断GC并耗费过长的时间所想到的工具 - jvmkill与jvmquake
|
IDE Java 开发工具
推荐一款代码神器,代码量至少省一半!
在我们 Java 项目里面,有很多 Java Bean 需要为每个属性生成 get/ set 方法,增删改属性都需要维护这些 get/ set 方法甚是麻烦。 今天给大家介绍一款能帮助我们简化这些代码的神器:Lombok!有了这个神器,你的 Java Bean 类的代码量至少可以省一半。
179 0
推荐一款代码神器,代码量至少省一半!