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

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

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


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】获取更多精彩文章。

目录
相关文章
|
JavaScript 开发者
Vue组件生命周期钩子函数有哪些?它们分别在什么时候触发?
Vue组件生命周期钩子函数有哪些?它们分别在什么时候触发?
700 0
|
文件存储
PowerShell系列(十):PowerShell CmdletPowerShell Cmdlet 参数详解
【2月更文挑战第5篇】强制类型参数使用比较频繁,基本上涉及新建、更新、配置等命令都需要针对特定的对应进行操作,所有需要强制输入一个参数来确认操作的对象是谁。
PowerShell系列(十):PowerShell CmdletPowerShell Cmdlet 参数详解
|
JavaScript 前端开发
除了点击事件,`addEventListener` 还能用于处理哪些事件类型?
【10月更文挑战第29天】 `addEventListener` 能够处理的事件类型非常丰富,涵盖了各种用户交互和页面状态变化的场景,通过合理地使用这些事件类型,可以为网页或应用程序添加丰富多样的交互效果和功能。
php常见问题,php.ini文件不存在或者找不到,mb_strlen()函数未定义系列问题,dll模块找不到的解决
本文介绍了解决PHP常见问题的步骤,包括定位和创建`php.ini`文件,以及解决`mb_strlen()`函数未定义和DLL模块加载错误的具体方法。
php常见问题,php.ini文件不存在或者找不到,mb_strlen()函数未定义系列问题,dll模块找不到的解决
|
人工智能 自然语言处理 开发者
Co-op Translator:微软推出面向开发者的开源多语言翻译工具
微软推出的开源多语言翻译工具Co-op Translator,基于Azure AI服务,能够自动化处理项目文档和图像中的文本翻译,简化技术文档的本地化流程,促进全球开发者协作。
506 25
Co-op Translator:微软推出面向开发者的开源多语言翻译工具
|
数据采集 JSON 数据处理
变色龙chameleon模型适配昇腾做训练开发
变色龙chameleon模型的官方仓库(https://github.com/facebookresearch/chameleon)并未开源训练的源代码,需要做训练代码的开发。
|
机器学习/深度学习 计算机视觉
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
本文介绍了如何使用OpenCV进行特定区域的目标检测,包括人脸检测实例,展示了两种实现方法和相应的代码。
483 1
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
|
域名解析 网络协议
阿里云如何找回域名,进行添加或删除?
阿里云如何找回域名,进行添加或删除?
|
存储 NoSQL JavaScript
MongoDB存储过程实战:聚合框架、脚本、最佳实践,一文全掌握!
【8月更文挑战第24天】MongoDB是一款备受欢迎的文档型NoSQL数据库,以灵活的数据模型和强大功能著称。尽管其存储过程支持不如传统关系型数据库,本文深入探讨了MongoDB在此方面的最佳实践。包括利用聚合框架处理复杂业务逻辑、封装业务逻辑提高复用性、运用JavaScript脚本实现类似存储过程的功能以及考虑集成其他工具提升数据处理能力。通过示例代码展示如何创建订单处理集合并定义验证规则,虽未直接实现存储过程,但有效地演示了如何借助JavaScript脚本处理业务逻辑,为开发者提供更多实用指导。
321 2
|
缓存 自然语言处理 JavaScript
Vue 3 渲染机制解密:从模板到页面的魔法
Vue 3 渲染机制解密:从模板到页面的魔法
710 0

热门文章

最新文章