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 秒实验
- 用
sep打一行 CSV,用end=''打一条进度条,各写一行。 - 把
repr加进你的日志函数,看能不能立刻发现多出来的空格。 - 想一想:为什么「字符数等于字节数」不能推广到中文?
常见误区
- 「print 就是打一行字」——不调
sep/end,排版只能靠拼字符串。 - 「调试看 print 就够了」——看不出空格和制表符,得用
repr。 - 「
len就是字节数」——纯英文时碰巧相等,中文立刻错。
自测三问(点开对答案)
1. `sep` 和 `end` 分别管什么? —— `sep` 管多个值之间的分隔符,`end` 管整行结束打什么。 2. Windows 路径为什么要写双反斜杠? —— 单个 `\\` 是转义引导符,要表示反斜杠本身得写两个。 3. `Hello AI` 的字符数和字节数为什么都是 8? —— ASCII 字符一个占一字节;换成中文这两个数就不等了。英文能打出来了,换成中文就会撞上编码问题——这正是下一节要拆的。
- ☐ (本节完,下一节 3.2.2 使用Python中文编码:输出中文字符)