【一日一技】揭秘字符串的两副“面孔”

简介: 【一日一技】揭秘字符串的两副“面孔”

如果你经常使用Python的命令行交互环境,你一定遇到过下面这个现象:

>>> a = 'test'
>>> a
'test'
>>> print(a)
test

首先定义一个变量a,它的值为字符串test

现在,当你在命令行交互环境直接输入变量名再回车的时候,你看到的是'test',当你输入print(a)的时候,你看到的却是test


直接输入变量名回车,字符串会被单引号包起来。而使用print函数打印变量,字符串又没有引号。


如果说引号只是一个小问题的话,再来看看反斜杠会怎么样:

>>> b = 'D:\game\pal4'
>>> b
'D:\\game\\pal4'
>>> print(b)
D:\game\pal4

在这里,b变量的值为Windows下面的一个文件夹路径。在定义的时候,我使用的是单根反斜杠。

当我输入变量名,然后回车时,看到的结果是'D:\\game\\pal4',不仅有最外层的引号,而且反斜杠全部变成了两根。

但是当我使用print函数打印出来的时候,一切又正常了。


觉得很诡异吗?

实际上,输入变量名,回车以后,你看到的才是这个字符串真正的样子,因为在Python里面是不存在单根反斜杠的。当你要表示反斜杠本身的时候,就应该是\\这种写法。

当然在定义的时候你可以只写单根反斜杠,在大多数情况下,Python会理解你的意图,所以它会自动把单根反斜杠转换为两个反斜杠。

而使用print关键字打印出来的,是经过Python优化,更便于人类阅读的样子。

当然,使用print函数也能看到字符串真正的样子,不过需要修改一下:

>>> b = 'D:\game\pal4'
>>> b
'D:\\game\\pal4'
>>> print(repr(b))
'D:\\game\\pal4'

当你使用repr函数先处理字符串,再打印时,它的效果就和直接输入变量名回车是一样的了。

在Python中,repr(对象)本质上是调用了对象的__repr__方法。而如果直接print(对象),实际上是打印了对象的__str__方法返回的内容。


我们来做一个实验

class Test:

   def __repr__(self):

       return 'hello world!'


   def __str__(self):

       return '为什么我总是对你说你好,因为你是我的世界啊,傻瓜'


you = Test()

动手测试一下,输入you然后直接回车显示的是什么内容。输入print(you)显示的又是什么内容。

运行效果图

从上面的例子可以看出,直接输入变量名回车和直接用print函数打印调用的是对象的不同方法。所以他们当然可以不一样。


回到昨天的问题上来,在PyCharm的调试模式中,你看到的内容实际上是变量对象的__repr__方法返回的内容,这里的内容是字符串在Python里面的真正的样子,所以斜杠会变多。

上面说到,当你输入Windows路径的时候,大多数情况下,Python能够理解你的意图,把单根反斜杠转成双反斜杠。不过也有例外的情况。

例如:

假设有一个文件夹的名字叫做u6211。它在pal4文件夹里面。

那么,路径应该是:D:\game\pal4\u6211

如果在Python里面执行,会出现什么问题?


>>> c = 'D:\game\pal4\u6211'
>>> c
'D:\\game\\pal4我'
>>> print(c)
D:\game\pal4我


怎么和前面的pal4拼在一起了?

因为\u6211是一个Unicode编码,表示中文

这种情况下,你有两种解决方式1.       手动使用双反斜杠:

>>> b = 'D:\game\pal4\\u6211'
>>> b
'D:\\game\\pal4\\u6211'
>>> print(b)
D:\game\pal4\u6211
2.       在定义变量的时候,字符串左侧引号的左边加上字母r:
>>> b = r'D:\game\pal4\u6211'
>>> b
'D:\\game\\pal4\\u6211'
>>> print(b)
D:\game\pal4\u6211


目录
相关文章
|
1月前
|
存储
位运算之妙用:识别独特数字(寻找单身狗)
位运算之妙用:识别独特数字(寻找单身狗)
31 0
|
1月前
|
存储 传感器 数据采集
【数字图像】数字图像平滑处理的奇妙之旅
【数字图像】数字图像平滑处理的奇妙之旅
53 0
|
7月前
|
API
完蛋!我被LLM包围了!
欢迎来的“完蛋!我被LLM包围了”小游戏,《完蛋!我被LLM包围了!》是一款智力挑战游戏。该项目利用LLM, 基于ModelScope社区内现有的LLM对话Gradio应用程序代码,结合知乎文章《如何用“不可能”完成任务》中的预设问题,自动生成了对应的游戏代码,创造了一个独特的游戏体验。
|
6月前
|
流计算
IELTS学习(004) - 单词(太空探索篇)
IELTS学习(004) - 单词(太空探索篇)
28 0
|
11月前
|
数据采集 存储 数据挖掘
【每周一坑】罗马数字转换
由图可知,螺旋数组中的数字运动方向依次 右 -> 下 -> 左 -> 上 -> 右 这样的循环,在合适的条件下变换累加方向即可。
|
11月前
|
数据采集 存储 人工智能
【每周一坑】自动翻译 | 【解答】单词本
提示:翻译功能可以通过网上的翻译 API 实现,你所要了解的就是如何发起网络请求,以及如果对返回结果进行处理。这也算是基本的爬虫操作。
|
算法 JavaScript 前端开发
日拱算法:什么是“情感丰富的文字”?
本篇带来算法题:“情感丰富的文字”
|
算法
日拱算法:只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
|
算法 Python
【完虐算法】「字符串-最长公共前缀」5种方法脑洞大开
最近在专题制作过程中遇到了**最长前缀公共子串**的问题,也是读者最近校招面试到的一个题目。为什么拿出这个来说呢? 可怕的是,他居然给了 5 种解题方法。 更可怕的是,因此他直接少了一轮面试,天哪!!
348 0