当前位置: 首页 > 科技观察

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

时间:2023-03-13 01:01:53 科技观察

在公众号粉丝群里,同学们经常会问这样的问题:还有他发这张图的时候,我我知道他想问什么问题,所以我直接给出了答案:删除反斜杠。为什么会有人问这样的问题?为什么我可以毫不犹豫地知道删除反斜杠没有不良影响?这要从Python的单引号、双引号和三引号说起。在Python中,单引号和双引号的作用完全相同。当我们要定义一个字符串的时候,使用单引号和双引号没有区别:#下面两种写法是完全一样的a='kingname'b="kingname"那么什么情况下应该使用单引号和什么情况下应该使用双引号?即当字符串中有单引号时,在最外层使用双引号;当字符串中有双引号时,最外层有单引号:a='kingnamesays:"yes".'b="kingnamesyas:'yes'."那么,如果我要定义的字符串已经同时带有单引号和双引号怎么办?然后我们可以使用三重单引号。a='''庆南说:'单引号'比'双引号'好看'''当然也有三重双引号,和三重单引号作用完全一样,只是在PEP8规范,一般使用三重双引号来写函数文档注释,所以对于多行字符串我们一般不使用三重双引号。如下图所示:Requests源代码顺便说一句,Requests的代码非常规范。当你不知道如何优雅地写代码时,可以参考Requests的源码。你可以随便写。但是我们知道三重单引号用于多行字符串。如果您认为只有几个字符的字符串包含双引号或单引号,则必须移出三重单引号。,那么,你也可以使用反斜杠。例如:a='kingnamesays:\'yes\'.'b="kingnamesays:\"yes\"."c='庆南说:\'单引号\'比"双引号"好看'd="Qingnan说:'单引号'比'双引号'"好看也就是说,如果你在你的字符串外面使用单引号,那么你可以在字符串自带的单引号前加一个反斜杠;如果在字符串外部使用双引号,则可以在字符串附带的双引号前添加反斜杠。这篇文章开头的同学发来一张这样的截图:可以看到在它的字典中,content的值是用三重双引号包裹的,所以value中的单引号不需要加反斜杠。你可能会觉得很奇怪,上面的规则看起来很明显,怎么会有人把它们搞混呢?其实,事情并没有你想的那么简单。有两种情况可能会出错。场景1,在PyCharm的调试模式下。当我们定义一个字符串的时候,调试窗口显示的字符串变量总是用单引号括起来,如下图:不管在代码中,我在定义字符的时候用单引号还是双引号,在里面总是单引号调试窗口中的引号。那么,如果我定义的字符串中包含单引号,调试窗口中肯定会出现反斜杠:图中只有两行代码,可以很好的识别出来。但是如果你在调试别人的代码,看到一个字符串中出现反斜杠,你可能意识不到单引号前面的反斜杠是这样的。当你使用三引号或者双引号来包裹这样的字符串时,你可以直接删除反斜杠。场景2,在JSON中。JSON的Key和Value是用双引号括起来的,如下图:如果你的字符串中有双引号,那么在代码中定义的时候不管你怎么写,最后打印出来的JSON字符串一定有一个里面有反斜杠:有些同学在写爬虫的时候,抓取目标网站的API接口,看到返回的JSON字符串中有反斜杠。他们想都没想,把所有的反斜杠都换成一个.replace就变空了。这种做法显然是错误的。当你发现网站返回的数据是一个JSON字符串时,你应该先传入json.loads进行解析,然后看看数据内容是什么样子的。并且,解析之后,如果你使用PyCharm的debug模式来看的话,那么你还需要注意上面场景1中的情况。例如,下面的JSON字符串就是这两种情况的组合。{“句子”:“\u4eca\u5929\u6211\u4eec\u5b66\u4e60\u82f1\u6587\u53cc\u5f15\u53f7\\”\u548c\u82f1\u6587\u5355\u5f15\u53f7'\u7684\u4f7f\u75","address":"\u4e0a\u6d77"}这个json字符串里面有很多反斜杠,很多人看到这里都想把这些反斜杠全部转成空字符串,但其实只需要使用json.loads去处理,信息立马就正常了,如下图:但是即便如此,如果尝试用debug模式查看解析后的值,会发现里面还是有反斜杠,因为里面有单引号,最后问大家两个问题:在上图的代码中,已知b['sentence'][17]对应的是单引号的个数,那么什么字符会这段代码最后会打印出来吗?如果我们是调试模式,在第10行设置断点,然后通过Evaluate函数执行代码片段b['sentence'][18],下面是什么结果?”,可通过以下二维码关注。转载请联系Code公众号。