🧠 第三章 编程语言
📄 一句话概括

print 有三个可调参数:sep 换分隔符(本例打出 Hello | AI | 38)、 end 换结尾(end='' 就不换行)、转义字符换排版。纯英文时字符数 8 等于字节数 8。

📝 本节和前面几节的关系

上一节把环境变量理顺了,这一节开始写代码。 第一个动作永远是「把东西打出来」——它也是后面所有调试手段的基础。

一、print 的三个参数

print 不只是「打一行字」,它有三个可调的旋钮: - 第一个参数是要打的东西,可以有多个,用逗号隔开。 - sep 决定多个东西之间的分隔符,默认是一个空格。 - end 决定打完之后的结尾,默认是换行。 Demo 里三行分别试了这三种:sep=' | ' 打出 Hello | AI | 38; sep='' 加 end='' 打出连在一起的 abc;\t 让后面的内容跳到下一个制表位。 做进度条、做表格、做日志,全靠这两个参数。不用它们,就只能用字符串拼接硬凑,很快就乱。

二、转义字符:写不出来就转

有些字符没法直接写在引号里,比如换行、制表符、引号本身。这些用反斜杠加一个字母表示: - \n 换行,\t 制表。 - \\ 表示一个反斜杠本身——所以 Windows 路径要写 C:\\data。 - \' 和 \" 表示引号本身,用来在同类引号里嵌一个引号。 Demo 的表格里 \\ 那一行打出 C:\data,\' 那一行打出 it's。 这几个是日常最常用的,剩下几个用到再查。

三、str 和 repr 不是一回事

同一个字符串,print 出来是给人看的,repr 出来是给程序看的——它会带上引号、 把不可见字符显示成转义形式。 Demo 里 str 打出 Hello AI,repr 打出 'Hello AI',多了两个引号。 调试的时候要看清「是不是多了个空格」「是不是混进了制表符」,必须用 repr。 日志里记变量,也建议记 repr。

四、字符数等于字节数,只对英文成立

Hello AI 的 len 是 8,UTF-8 编码后的字节数也是 8。 这不是巧合,是 ASCII 的性质:英文字母、数字、常见符号,一个字符正好占一个字节。 但只要掺进一个中文,两个数立刻分家——下一篇就撞上这件事。 现在先记住:英文环境下这两个数相等,不能推广。

五、对齐:一张表三种写法

Demo 最后打了一张三行的小表,同一份数据用了三种对齐: - name.ljust(12) 左对齐,右边的空隙在后面。 - 格式化里的 >10 右对齐,数字右对齐才看得出大小。 - 08.2f 补零,定长输出时用。 结果最直观的一列是补零:00003.50、00012.00、00001.25——小数点对齐了,位数也齐了。 这一条看着是排版细节,其实是数据可读性:密密麻麻一堆数字,右对齐和不右对齐的阅读速度差一倍。

六、动手 Demo:print 的分隔、转义与三种对齐

分别用 sep/end/\t 展示 print 的三种控制方式;列一张转义字符对照表并实际打出来; 对比 str 与 repr、字符数与字节数;最后用 ljust、右对齐、补零三种写法打同一张价格表。

print('Hello', 'AI', 38, sep=' | ')   # 换分隔符
print('a', 'b', 'c', sep='', end=' <- end=\'\'\n')

s = 'Hello AI'
print(len(s), len(s.encode('utf-8')))   # 8 8
print(str(s), repr(s))

for name, price in items:
    print(name.ljust(12), '%10s' % name, '%08.2f' % price)

实跑输出:

--------------------------------------------------------------------
输出英文字符:print 的三种分隔、转义与对齐
--------------------------------------------------------------------
  直接打                   Hello AI
  逗号分隔    | Hello | AI | 38
  不换行     abc <- end=''
  制表定位   行1 列2  列3

  转义字符:
  写法   意思         效果
  --------------------------------------
  \n     换行         两行之间断开
  \t     制表         跳到下一个 8 格位置
  \\     反斜杠本身   C:\data
  \'     单引号       it's
  \"     双引号       say "hi"

  str 出来                 Hello AI
  repr 出来                'Hello AI'
  字符数 len               8
  字节数(UTF-8)          8
  纯英文时这两个数相等;一旦掺中文就会分家(下一篇就撞上)。

  对齐:卖的是同一张表,三种写法
  左对齐 apple       |  右对齐      apple|  补零 00003.50
  左对齐 pear        |  右对齐       pear|  补零 00012.00
  左对齐 watermelon  |  右对齐 watermelon|  补零 00001.25
  注意最后一列:数字右对齐才看得出大小,左对齐读起来要一行行数位数。

第一行打出 Hello | AI | 38:分隔符换成竖线,三个值照样一次打完。 注意 38 是整数,print 自动转成了字符串。 第二行 abc <- end='':sep='' 让字母之间没有空隙, end=' <- end=\'\'' 把默认换行换成了这段文字,最后才换行。 str 和 repr 打出来分别是 Hello AI 与 'Hello AI',差的正是那两个引号。 字符数 8、字节数 8,纯英文时才相等。 价格表三列:左对齐那列参差不齐,右对齐那数列尾齐了,补零那列连位数都齐。 同一份数据,可读性差得很明显。

30 秒实验

  1. 用 sep 打一行 CSV,用 end='' 打一条进度条,各写一行。
  2. 把 repr 加进你的日志函数,看能不能立刻发现多出来的空格。
  3. 想一想:为什么「字符数等于字节数」不能推广到中文?

常见误区

  1. 「print 就是打一行字」——不调 sep/end,排版只能靠拼字符串。
  2. 「调试看 print 就够了」——看不出空格和制表符,得用 repr。
  3. 「len 就是字节数」——纯英文时碰巧相等,中文立刻错。
自测三问(点开对答案) 1. `sep` 和 `end` 分别管什么? —— `sep` 管多个值之间的分隔符,`end` 管整行结束打什么。 2. Windows 路径为什么要写双反斜杠? —— 单个 `\\` 是转义引导符,要表示反斜杠本身得写两个。 3. `Hello AI` 的字符数和字节数为什么都是 8? —— ASCII 字符一个占一字节;换成中文这两个数就不等了。

英文能打出来了,换成中文就会撞上编码问题——这正是下一节要拆的。

相关笔记