一日一技:难以置信,还有人不知道反斜杠和引号的关系

简介: 一日一技:难以置信,还有人不知道反斜杠和引号的关系

经常有同学问类似下面这样的问题:


1.png


而当他发出来这个图,我就知道他想问什么问题了,所以直接给出了答案:把反斜杠删了


为什么有人会问出这样的问题?为什么我可以毫不犹豫的知道 删除反斜杠没有任何不良影响?这就要从 Python 的单引号、双引号、三引号说起了。


在 Python 里面,单引号和双引号的作用是完全一样的。当我们要定义一个字符串的时候,使用单引号和双引号没有任何区别:


# 下面两种写法完全相同
a = 'kingname'
b = "kingname"


那在什么情况下应该用单引号,什么情况下应该用双引号呢?那就是在字符串里面本来就有单引号的时候,最外面就用双引号;字符串里面本来就有双引号的时候,最外面就有单引号:


a = 'kingname says: "yes".'
b = "kingname syas: 'yes'."


那么如果我想定义的字符串里面本来就既有单引号又有双引号怎么办呢?那么我们可以用三单引号。


a = '''青南说: '单引号'比"双引号"更好看'''


当然,还有三双引号,它的功能跟三单引号完全相同,但是在 PEP8规范里面,三双引号一般用来写函数文档型注释,所以一般多行字符串我们不会使用三双引号。如下图所示:

2.png

                                             requests 源代码


顺带一提,Requests的代码写得非常规范,当你不知道怎么写代码才优雅的时候,你就去参考 Requests 的源代码。它怎么写,你就怎么写。


但我们知道,三单引号是给多行字符串使用的,如果你觉得短短几个字符的字符串,就因为含有双引号或者单引号,你就要搬出三单引号,未免杀鸡用牛刀,那么,你还可以使用反斜杠。例如:


a = 'kingname says: \'yes\'.'
b = "kingname says: \"yes\"."
c = '青南说: \'单引号\'比"双引号"更好看'
d = "青南说: '单引号'比\"双引号\"更好看"


也就是说,如果你字符串最外面使用的是单引号,那么你可以在字符串里面自带的单引号前面加上反斜杠;如果你字符串最外面使用的是双引号,那么你可以在字符串里面自带的双引号前面加上反斜杠。


本文开头的这个同学,他发的截图是这样的:


3.png


可以看到,它的字典中,content的值是使用三双引号包起来的,所以,值里面的单引号没有必要加上反斜杠。


大家可能会觉得非常奇怪,上面这些规则,看起来都是显而易见的,怎么可能有人会搞混呢?实际上,事情真的没有你想的那么简单。有两个场景会让你出问题。


场景1,在 PyCharm 的调试模式中。当我们定义一个字符串的时候,调试窗口里面显示的字符串变量总是使用单引号包裹的,如下图所示:

4.png


无论在代码里面,我定义字符的时候使用的是单引号还是双引号,在调试窗口里面始终都是单引号。那么,如果我定义的字符串包含了单引号,此时在调试窗口里面一定会出现反斜杠:


5.png


图中只有两行代码,你可以很好鉴别。但是如果你是在调试别人的代码,看到了一个字符串里面出现了反斜杠,你不一定能反应过来单引号前面的反斜杠是这样来的。当你自己使用三引号或者双引号包裹这样一段字符串的时候,你是可以直接删除这个反斜杠的。


场景2,在 JSON 中。JSON 的Key 和 Value 都是使用双引号包裹的,如下图所示:


6.png


如果你的字符串里面原本就有双引号,那么,无论你在代码里面定义的时候怎么写,最终打印出来的 JSON 字符串中一定有反斜杠:


7.png


抓目标网站的 API 接口,看到返回的 JSON 字符串里面有反斜杠,想都不想,反手一个.replace把所有反斜杠全部替换成空。这种做法显然是错误的。


当你发现网站返回的数据是 JSON 字符串的时候,你应该首先传入json.loads把它解析一遍,然后再来看数据内容长什么样。并且,解析了以后,如果你使用 PyCharm 的调试模式来看,那么你还需要注意上面场景1的情况。例如下面这个 JSON 字符串,就是两种情况的结合。


{
  "sentence": "\u4eca\u5929\u6211\u4eec\u5b66\u4e60\u82f1\u6587\u53cc\u5f15\u53f7\\"\u548c\u82f1\u6587\u5355\u5f15\u53f7'\u7684\u4f7f\u7528",
  "address": "\u4e0a\u6d77"
}


这个 JSON 字符串里面有非常多的反斜杠,很多人看到这个就很想去把这些反斜杠全部转成空字符串。但实际上,你只需要使用json.loads处理一下,信息马上就正常了,如下图所示:


8.png


但即便如此,如果你试图用调试模式去查看解析以后的值,你会发现里面还是有反斜杠,因为里面有单引号。


最后,考大家两个个问题:


9.png


上面这段代码,已知b['sentence'][17]对应了单引号字。那么这段代码最后会打印出什么字符?


如果我们在调试模式,在第10行打一个断点,然后通过Evaluate功能执行代码片段b['sentence'][18],下面的 result又是什么?


10.png


请关注微信公众号【未闻Code】获取更多精彩文章。

目录
相关文章
|
7月前
|
数据采集 Java 机器人
根据正则表达式截取字串符,这个办法打败99%程序员
作为一名程序员,常常会在以下情况下使用函数功能根据正则表达式截取字符串:
|
9月前
|
Web App开发 数据建模 Java
|
9月前
|
前端开发 JavaScript 程序员
前端中那些让你头疼的英文单词
前端中那些让你头疼的英文单词
|
10月前
|
Java 程序员 索引
我终于把Python中下划线的含义弄清楚了(憋了很久了)
我终于把Python中下划线的含义弄清楚了(憋了很久了)
|
11月前
|
数据采集 存储 人工智能
【每周一坑】自动翻译 | 【解答】单词本
提示:翻译功能可以通过网上的翻译 API 实现,你所要了解的就是如何发起网络请求,以及如果对返回结果进行处理。这也算是基本的爬虫操作。
|
11月前
|
前端开发 JavaScript 数据安全/隐私保护
关于正则表达式,小黄人有话要说!!!
本文将带你逐步学习正则表达式的基础知识和高级技巧,从基本的元字符到实用的正则表达式示例,让你轻松掌握这一重要的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都能帮助你更好地理解和应用正则表达式。
86 0
关于正则表达式,小黄人有话要说!!!
|
11月前
|
存储 JavaScript IDE
程序员常用英文单词/英语单词/词汇表/变量名称
程序员常用英文单词/英语单词/词汇表/变量名称
188 0
|
12月前
|
自然语言处理 IDE 开发工具
C++常见英语单词总结(1)
C++常见英语单词总结(1)
|
Python
[oeasy]python0120_英语的崛起_英文字符_小写字母的由来_不列颠帝国
[oeasy]python0120_英语的崛起_英文字符_小写字母的由来_不列颠帝国
90 0
[oeasy]python0120_英语的崛起_英文字符_小写字母的由来_不列颠帝国
|
JavaScript 前端开发 测试技术
一些正则表达式随记
一些正则表达式随记
181 0