一、背景
在《Python字符串》一节中我们曾提到过转义字符,就是那些以 反斜杠 \ + 字符'x'
开头的字符。
ASCII 编码为每个字符都分配了唯一的编号,称为编码值。在 Python 中,一个 ASCII 字符除了可以用它的实体(也就是真正的字符)表示,还可以用它的编码值表示。这种使用编码值来间接地表示字符的方式称为转义字符(Escape Character)。
转义字符以\0
或者\x
开头,以\0
开头表示后跟八进制形式的编码值,以\x
开头表示后跟十六进制形式的编码值,Python 中的转义字符只能使用八进制或者十六进制。具体格式如下:
\0dd // dd 表示八进制数字;最大数字为\077,也就可以表示最多64个编码
\xhh // hh 表示十六进制数字;最大数字为\xFF,也就是可以表示最多256个编码。可以 表示所有ASCII 128个字符空间
ASCII 编码共收录了 128 个字符,\0
和\x
后面最多只能跟两位数字,所以八进制形式\0
并不能表示所有的 ASCII 字符,只有十六进制形式\x
才能表示所有 ASCII 字符。
我们一直在说 ASCII 编码,没有提及 Unicode、GBK、Big5 等其它编码(字符集),是因为 Python 转义字符只对 ASCII 编码(128 个字符)有效,超出范围的行为是不确定的。
字符 1、2、3、x、y、z 对应的 ASCII 码的八进制形式分别是 61、62、63、170、171、172,十六进制形式分别是 31、32、33、78、79、7A。下面的例子演示了转义字符的用法:
str1 = "Oct: \061\062\063"
str2 = "Hex: \x31\x32\x33\x78\x79\x7A"
print(str1)
print(str2)
运行结果:
Oct: 123
Hex: 123xyz
[Finished in 189ms]
注意,使用八进制形式的转义字符没法表示 xyz,因为它们的编码值转换成八进制以后有三位。
对于 ASCII 编码,0~31(十进制)范围内的字符为控制字符,它们都是看不见的,不能在显示器上显示,甚至无法从键盘输入,只能用转义字符的形式来表示。不过,直接使用 ASCII 码记忆不方便,也不容易理解,所以,针对常用的控制字符,C语言又定义了简写方式,完整的列表如下。
转义字符 | 说明 |
---|---|
\n | 换行符,将光标位置移到下一行开头。 |
\r | 回车符,将光标位置移到本行开头。 |
\t | 水平制表符,也即 Tab 键,一般相当于四个空格。 |
\v | 垂直制表符,也即 Tab 键,一般相当于四个空格。 |
\a | 蜂鸣器响铃。注意不是喇叭发声,现在的计算机很多都不带蜂鸣器了,所以响铃不一定有效。 |
\b | 退格(Backspace),将光标位置移到前一列。 |
\\ | 反斜线 |
\' | 单引号 |
\" | 双引号 |
\ | 在字符串行尾的续行符,即一行未完,转到下一行继续写。 |
转义字符在书写形式上由多个字符组成,但 Python 将它们看作是一个整体,表示一个字符。
Python 转义字符综合示例:
#使用\t排版
str1 = '网站\t\t\t域名\t\t\t\t\t年龄\t\t价值'
str2 = 'C语言中文网\tc.biancheng.net\t\t8\t\t500W'
str3 = '百度\t\t\twww.baidu.com\t\t20\t\t500000W'
print(str1)
print(str2)
print(str3)
print("--------------------")
# \n在输出时换行,\在书写字符串时换行
info = "Python教程:http://c.biancheng.net/python/\n\
C++教程:http://c.biancheng.net/cplus/\n\
Linux教程:http://c.biancheng.net/linux_tutorial/"
print(info)
运行结果:
二、具体转义字符练习
2.1 \n 换行符
换行显示。
2.2 \r 回车符
将光标位置移到本行开头:
print("-------\r*******\r+++++++\r#######")
#### 输出结果:
-------
*******
+++++++
#######
2.3 \t 水平制表符
水平制表符,也即 Tab 键,一般相当于四个空格。 |
print("-------\n\t*******\n\t\t+++++++\n\t\t\t#######")
#### 输出结果:
------- # 4个空格
******* # 4个空格
+++++++ # 4个空格
####### # 4个空格
2.4 \v 垂直制表符
print("python\vmust")
#### 输出结果:
pythonmust # 垂直制表符,多在打印机上面实现,在显示上,一般没法输出。多以<0x0b>显示
2.5 \a 蜂鸣器响铃
注意不是喇叭发声,现在的计算机很多都不带蜂鸣器了,所以响铃不一定有效.
2.6 \b 退格(Backspace)退格符,将光标前移,覆盖
将光标位置移到前一列
代表退格,即\b后面的一字符替换\b前面的一个字符;若\b后面的是空格则效果上是删除了\b前面的一个字符,其实是\b后面的一各空格替换了\b前面的那个字符;如果\b后面没有任何字符,实际上是没有效果的。更多的,如果出现连续的多个\b则是最后一个\b后面的多个字符替换最前面\b前面的多个字符。
>>> print('hello\bworld')
hellworld
2.7 \\ 转义斜杠
>>> print('http:\\www.baidu.com')
http:\www.baidu.com
2.8 r
字符串前加字母"r"表示后面字符串中不进行转义
>>> print(r'http:\\www.baidu.com')
http:\\www.baidu.com
2.9 \r 回车
return光标移动到本行的开头
示例:
在命令行实现倒计时功能:
import time
for i in range(10):
print(f"\r离程序退出还剩{9 - i}秒", end='')
time.sleep(1)
命令行实现转圈功能 :
import time
lst = ["\\", "|", "/", "———"]
for i in range(20):
j = i % 4
print("\r" + lst[j], end="")
time.sleep(0.2)
实现进度条功能:
# 进度条功能
import time
for i in range(10):
print("\r" + "■"*i, sep="", end="")
time.sleep(0.2)
print("\n下载完成")
实现删除效果功能:
import time
s = "枝上柳绵吹又少,天涯何处无芳草"
l = len(s)
for i in range(l):
print("\r" + s[:l-1-i] + "|", end="")
time.sleep(0.15)
三、 ASCII编码背景知识回顾