# 练习10.那是什么?
在习题 9 中我们接触了一些新东西。我让你看到两种让字符串扩展到多行的方法。第一种方法是在月份之间用 `\n` (back-slash n )隔开。 这两个字符的作用是在该位置上放入一个“新行(new line)”字符。
使用反斜杠 `\`(back-slash) 可以将难打印出来的字符放到字符串。针对不同的符号有很多这样的所谓“转义序列(escape sequences)”,但有一个特殊的转义序列,就是 双反斜杠(double back-slash) `\\` 。这两个字符组合会打印出一个反斜杠来。接下来我们做几个练习,然后你就知道这些转义序列的意义了。
另外一种重要的转义序列是用来将单引号 ' 和双引号 " 转义。想象你有一个用双引号引用起来的字符串,你想要在字符串的内容里再添加一组双引号进去,比如你想说 `"I "understand" joe."`,Python 就会认为 "understand" 前后的两个引号是字符串的边界,从而把字符串弄错。你需要一种方法告诉 python 字符串里边的双引号是字符串而不是真正的双引号。
要解决这个问题,你需要将双引号和单引号转义,让 Python 将引号也包含到字符串里边去。这里有一个例子:
~~~
"I am 6'2\" tall." # 将字符串中的双引号转义
'I am 6\'2" tall.' # 将字符串中的单引号转义
~~~
第二种方法是使用“三引号(triple-quotes)”,也就是 `"""`,你可以在一组三引号之间放入任意多行的文字。接下来你将看到用法。
~~~
tabby_cat = "\tI'm tabbed in."
persian_cat = "I'm split\non a line."
backslash_cat = "I'm \\ a \\ cat."
fat_cat = """
I'll do a list:
\t* Cat food
\t* Fishies
\t* Catnip\n\t* Grass
"""
print tabby_cat
print persian_cat
print backslash_cat
print fat_cat
~~~
## 你看到的结果
注意你打印出来的制表符,这节练习中的文字间隔对于答案的正确性是很重要的。
~~~
$ python ex10.py
I'm tabbed in.
I'm split
on a line.
I'm \ a \ cat.
I'll do a list:
* Cat food
* Fishies
* Catnip
* Grass
~~~
## 转义序列
| 转义字符 | 实现功能 |
|-----|-----|
| \ | Backslash () |
| \' | Single-quote (') |
| \" | Double-quote (") |
| \a | ASCII bell (BEL) |
| \b | ASCII backspace (BS) |
| \f | ASCII formfeed (FF) |
| \n | ASCII linefeed (LF) |
| \N{name} | Character named name in the Unicode database (Unicode only) |
| \r ASCII | Carriage Return (CR) |
| \t ASCII | Horizontal Tab (TAB) |
| \uxxxx | Character with 16-bit hex value xxxx (Unicode only) |
| \Uxxxxxxxx | Character with 32-bit hex value xxxxxxxx (Unicode only) |
| \v | ASCII vertical tab (VT) |
| \ooo | Character with octal value ooo |
| \xhh | Character with hex value hh |
这里有一小段有意思的代码,尝试说明它们实现了什么功能:
~~~
while True:
for i in ["/","-","|","\\","|"]:
print "%s\r" % i,
~~~
## 附加题
> 1. 通过把它们写在卡片上记住所有的转义序列。
> 1. 使用`'''`(三个单引号)取代三个双引号,看看效果是不是一样的?
> 1. 结合转义序列和格式字符串创建一个更复杂的格式。
> 1. 记得 %r 格式化字符串吗?使用 %r 搭配单引号和双引号转义字符打印一些字符串出来。 将 %r 和 %s 比较一下。 注意到了吗?%r 打印出来的是你写在脚本里的内容,而 %s 打印的是你应该看到的内容。
## 常见问题
### Q:如果我想把所有的月份写在新的一行上,应该怎么做?
> 像这样写就可以: `"\nJan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug"`
### Q: 我还没有完全弄明白最后一句代码,我应该继续研究吗?
> 当然要继续。把每次练习题中你不明白的地方记下来。当你完成更多的练习的时候,定期检查你的笔记,看看你是否可以明白笔记中的内容。有时候你可能需要回去看看之前做过的练习,并且重复的完成它们。
### Q: 是什么让`\\`不同于其他的转义字符?
> 这是一种简单的写出 (`\`)字符的方法. 自己想想为什么我们需要`\\`
### Q:为什么我写`//`或者`/n`的时候,代码没有生效。
> 因为你用的是`/` 而不是`\`.这两个是不同的字符串,他们的作用也是不一样的。
### Q:当我使用`%r` 格式的时候,转义字符都没有生效。
> 因为`%r` 打印出来的是你写在脚本里的内容, 这当然也会包含原始的转移序列的字符。可以使用`%s`。一定要记住:`%r`是调试用的,而`%s` 才是显示输出用的。
### Q:我没有明白附加题3.你所说的“结合”转义序列和格式是什么意思?
> 你需要明白一点,所有的这些练习题,都可以结合起来解决一些难题。这节练习带你了解了格式化字符串,你可以结合使用格式化字符串和转义字符写一些新的代码。
### Q: `'''` 和`"""`哪个更好?
> 这个只依赖于你的代码风格。 现在可以使用`'''` (三个单引号),但是也要做好准备别人都在用的,感觉更好的方式。
- 序言
- 前言
- 简介
- 0:安装和准备
- 1:第一个程序
- 2:注释和“#”井号
- 3:数字和数学计算
- 4:变量和命名
- 5:更多的变量和打印
- 6:字符串和文本
- 7:更多的打印(输出)
- 8:打印, 打印
- 9:打印, 打印, 打印
- 10:那是什么?
- 11:提问
- 12:提示别人
- 13:参数, 解包, 变量
- 14:提示和传递
- 15:读文件
- 16:读写文件
- 17:更多文件操作
- 18:命名, 变量, 代码, 函数
- 19:函数和变量
- 20:函数和文件
- 21:函数的返回值
- 22:到目前为止你学到了什么?
- 23:阅读代码
- 24:更多的练习
- 25:更多更多的练习
- 26:恭喜你,可以进行一次考试了
- 27:记住逻辑
- 28:布尔表达式
- 29:IF 语句
- 30:Else 和 If
- 31:做出决定
- 32:循环和列表
- 33:while循环
- 34:访问列表元素
- 35:分支和函数
- 36:设计和调试
- 37:复习符号
- 38:列表操作
- 39:字典,可爱的字典
- 40:模块, 类和对象
- 41:学会说面向对象
- 42:对象、类、以及从属关系
- 43:基本的面向对象的分析和设计
- 44:继承Vs.包含
- 45:你来制作一个游戏
- 46:项目骨架
- 47:自动化测试
- 48:更复杂的用户输入
- 49:写代码语句
- 50:你的第一个网站
- 51:从浏览器获取输入
- 52:开始你的web游戏
- 来自老程序员的建议
- 下一步
- 附录A:命令行教程
- 简介
- 安装和准备
- 路径, 文件夹, 名录 (pwd)
- 如果你迷路了
- 创建一个路径 (mkdir)
- 改变当前路径 (cd)
- 列出当前路径 (ls)
- 删除路径 (rmdir)
- 目录切换(pushd, popd)
- 生成一个空文件(Touch, New-Item)
- 复制文件 (cp)
- 移动文件 (mv)
- 查看文件 (less, MORE)
- 输出文件 (cat)
- 删除文件 (rm)
- 退出命令行 (exit)
- 下一步