09. 输出九九乘法表

91 阅读5分钟

燎然,你刚才写的九九乘法表源代码是这样的 👇:

python
复制
# 09. 输出九九乘法表 我的回答
def cf_table():
    for i in range(1, 10):
        for j in range(1, i + 1):
            print(f"{j}*{i}={i*j:<8}", end="")
        print()
    return("打印完毕")

if __name__ == "__main__":
    cf_table()

不换行返回值

return("打印完毕")

是表达式写法,更推荐直接

return "打印完毕"

print不换行怎么

ChatGPT 说:

在 Python 里,默认 print() 打印内容时是自动换行的,因为它默认参数 end='\\n'(换行符)。

✅ 如果你想让 print() 不换行,可以用:

python
复制
print("你好", end='')

这样就不会在输出后换行。

📌 示例:

python
复制
print("我在", end='')
print("学习Python")

输出结果是:

复制
我在学习Python

🧠 拓展:end 可以换成其他字符

比如你想让多个 print 用空格分隔,也可以:

python
复制
print("苹果", end=' ')
print("香蕉", end=' ')
print("葡萄")

输出是:

复制
苹果 香蕉 葡萄

需要我帮你做成一个小函数测试多个 print() 输出组合的效果吗?

您说:

python 里面的制表符是什么

ChatGPT 说:

燎然,Python 里的制表符(Tab)是用来控制水平缩进或对齐文本的特殊字符,常用于打印时排版整齐,或者代码中的缩进(但推荐用空格代替)。

✅ 一、制表符是什么?

制表符在 Python 中用 \\t 表示,属于转义字符(像换行符 \\n 一样)。

🧪 示例:

python
复制
print("姓名\\t年龄\\t性别")
print("小明\\t18\\t男")
print("小红\\t20\\t女")

输出结果是:

复制
姓名    年龄    性别
小明    18      男
小红    20      女

\\t 的作用是“跳到下一个对齐的列”,就像你按下了键盘上的 Tab 键

✅ 二、制表符在实际用途上常见于:

场景

举例

文本对齐输出

让数据像表格一样整齐

日志格式

在 log 文件中插入固定间隔

文本协议

有些旧格式数据用 Tab 分隔,比如 .tsv 文件(Tab Separated Values)

⚠️ 注意:

  • 在代码里不要用 Tab 缩进,推荐用4个空格,以避免不同编辑器显示错乱。
  • \\tprint(..., sep='\\t') 不一样:\\t 是字符,sep='\\t' 是分隔符。

🧠 拓展技巧:字符串用制表符分隔并打印成表格

python
复制
data = [    ["产品", "价格", "库存"],
    ["苹果", "5元", "20个"],
    ["香蕉", "3元", "18个"]
]

for row in data:
    print("\\t".join(row))

输出:

复制
产品	价格	库存
苹果	5元	20个
香蕉	3元	18个

要不要我帮你写一个用 \\t 排版表格的小练习?可以让你更熟悉制表符的使用方式。

您说:

end=\t 对齐吗

ChatGPT 说:

燎然,end='\\t' 不一定能让输出“对齐”,原因我们马上讲清楚。

✅ 一、end='\\t' 是什么意思?

它的意思是:

在 print() 的末尾 添加一个制表符(Tab),而不是默认的换行。

📌 示例:

python
复制
print("苹果", end="\\t")
print("香蕉", end="\\t")
print("葡萄")

输出:

复制
苹果	香蕉	葡萄

它们之间确实是用 \\t 分隔开的,但——

⚠️ 二、为什么 end='\\t' 不一定能对齐?

因为:Tab 的宽度是“相对位置对齐”,而不是固定字宽。

不同字符宽度不同(比如“苹果”是两个汉字、"banana" 是 6 个英文字母),它们在终端里占用的宽度不一致,导致看起来:

📏 制表符“跳到下一个8的倍数位置”,而不是固定 4 或 1 字宽。

所以:

python
复制
print("苹果", end="\\t")
print("香蕉", end="\\t")
print("葡萄")

就不如:

python
复制
print("apple", end="\\t")
print("banana", end="\\t")
print("grape")

对齐得好。

✅ 三、如果你想要完美对齐,建议用 .ljust() 或 format()

方法1:.ljust(对齐宽度)

python
复制
print("产品".ljust(10), "价格".ljust(5), "库存")
print("苹果".ljust(10), "5元".ljust(5), "20个")
print("香蕉".ljust(10), "3元".ljust(5), "18个")

方法2:f-string 对齐(推荐)

python
复制
print(f"{'产品':<10}{'价格':<5}{'库存'}")
print(f"{'苹果':<10}{'5元':<5}{'20个'}")
print(f"{'香蕉':<10}{'3元':<5}{'18个'}")

输出整整齐齐,视觉上也更舒服!

🔚 结论:

做法

是否对齐

推荐

end='\\t'

❌ 不一定对齐

🚫 不推荐用于对齐

\\t 连接字符串

❌ 同样问题

🚫

.ljust()f-string

✅ 完全对齐

✅ 强烈推荐

如果你想要,我可以给你出一道练习题,让你用 .ljust()f-string 把一组数据输出成漂亮的表格。要吗?

您说:

.ljust() 是干嘛用的

ChatGPT 说:

好问题,燎然!

✅ .ljust() 是干嘛用的?

.ljust() 是 Python 字符串的一个方法,作用是:

将字符串向左对齐,并在右侧填充空格,直到达到你指定的宽度。

📌 语法:

python
复制
str.ljust(width[, fillchar])

参数

说明

width

你希望字符串变成的总长度

fillchar(可选)

用来填充的字符,默认是空格 ' '

🎯 示例:

python
复制
s = "苹果"
print(s.ljust(10))     # 输出:'苹果        '
print(s.ljust(10, '.'))  # 输出:'苹果........'

👉 注意:原字符串在左边,右边自动补空格或你指定的符号。

✅ 用途:打印时让文字对齐

python
复制
print("产品".ljust(10), "价格".ljust(5), "库存")
print("苹果".ljust(10), "5元".ljust(5), "20个")
print("香蕉".ljust(10), "3元".ljust(5), "18个")

输出效果整整齐齐:

复制
产品        价格   库存
苹果        5元     20个
香蕉        3元     18个

⚠️ 注意事项

  • ljust 不会改变原字符串,而是返回一个新的字符串

  • 如果原字符串长度已经超过指定宽度,不会截断,直接返回原字符串。

    python 复制 "火龙果".ljust(2) # 结果仍是 "火龙果"

🧠 类似方法还有:

方法

对齐方向

举例

.ljust()

左对齐

s.ljust(10)

.rjust()

右对齐

s.rjust(10)

.center()

居中对齐

s.center(10)

需要我给你写一个小练习题来练习 .ljust() 吗?比如输出一个“商品对账单”表格?可以加点挑战。

您说:

ljust 全称是什么

ChatGPT 说:

燎然,.ljust() 的全称其实是:

left justify

🔍 英文解释:

  • left 👉 左边
  • justify 👉 对齐、对正

所以 .ljust() 就是:

“左对齐”字符串,在右边填充空格(或其他字符)来凑满指定宽度。

📌 对应的还有:

方法

全称

含义

.ljust()

left justify

向左对齐,右边补空格

.rjust()

right justify

向右对齐,左边补空格

.center()

center justify

居中对齐,两边补空格

这几个方法都是为了排版整齐、美观输出字符串,特别适合打印表格或日志信息。

如果你喜欢练手,我可以出一道题,让你练会这3种对齐方式,做出一张有趣的小表格?

您说:

format() 这个怎么也能对齐?

ChatGPT 说:

燎然,你问得特别好!是的,format() 和新版的 f-string(f"")确实也能对齐字符串,而且.ljust() 更灵活、更高级,很多专业打印表格场景都是用它。

✅ 一、format() 实现对齐的语法结构

python
复制
"{:<10}".format("苹果")   # 左对齐,占10个宽度
"{:>10}".format("苹果")   # 右对齐,占10个宽度
"{:^10}".format("苹果")   # 居中对齐,占10个宽度

📌 示例:

python
复制
print("{:<10}{:<5}{:<5}".format("产品", "价格", "库存"))
print("{:<10}{:<5}{:<5}".format("苹果", "5元", "20"))
print("{:<10}{:<5}{:<5}".format("香蕉", "3元", "18"))

输出效果:

复制
产品        价格  库存
苹果        5元   20
香蕉        3元   18

✅ 二、f-string 写法(更推荐)

python
复制
product = "苹果"
price = "5元"
stock = "20"

print(f"{product:<10}{price:<5}{stock:<5}")

等价于上面 format() 的写法,但语法更清晰、易读。

✅ 三、对齐控制关键字符对照表

符号

含义

<

左对齐(Left)

>

右对齐(Right)

^

居中对齐(Center)

🎯 举例综合演示:

python
复制
data = [    ["产品", "价格", "库存"],
    ["苹果", "5元", "20"],
    ["香蕉", "3元", "18"]
]

for row in data:
    print(f"{row[0]:<10}{row[1]:^5}{row[2]:>5}")

输出:

复制
产品        价格    库存
苹果        5元     20
香蕉        3元     18

👉 你可以自由组合左对齐、中对齐、右对齐,排版能力比 .ljust() 更强大!

✅ 小结:什么时候用哪个?

方法

是否支持数字

是否灵活

推荐程度

.ljust()

仅字符串

一般

✅ 基础打印

format()

✅字符串+数字

很强

✅✅ 推荐

f-string

✅字符串+变量

最清晰

✅✅✅ 强烈推荐

要不要我给你出一道题,练习 format() 排版对齐和 f-string 实战?比如做个“订单对账表” 😎?

您说:

: 这是什么

ChatGPT 说:

燎然,这个问题非常关键!你在问 "{}"f"{...}" 里的那个 冒号 : 是干嘛的 ——它其实是 Python 格式化输出里的格式控制符的起点

✅ 冒号 : 是「格式说明符」的开始标志

在 format() 或 f-string 中,冒号后面跟的是“对齐方式、宽度、填充、数字格式”等控制输出的格式规则。

🔍 举个简单例子:

python
复制
print("{:<10}".format("苹果"))  # 左对齐,占10宽度
print("{:>10}".format("苹果"))  # 右对齐,占10宽度
print("{:^10}".format("苹果"))  # 居中对齐,占10宽度

输出:

markdown
复制
苹果
      苹果
   苹果

✅ 冒号后面可以加很多格式说明:

格式

含义

示例

:<10

左对齐,占10宽度

"{:<10}".format("苹果")

:>10

右对齐,占10宽度

"{:>10}".format("苹果")

:^10

居中对齐,占10宽度

"{:^10}".format("苹果")

:.2f

保留2位小数(float)

"{:.2f}".format(3.14159)

:03d

整数左边补0,宽度3

"{:03d}".format(7) 输出 007

:,

加千分位逗号

"{:,}".format(1000000) 输出 1,000,000

🧠 总结语法结构:

python
复制
"{变量:填充符对齐宽度.小数位f}"

比如:

python
复制
price = 5.6789
print(f"¥{price:>10.2f}")

输出:

复制
¥      5.68

✅ 所以:冒号 : 就是开启「格式控制」的大门。

没有冒号,就只是单纯地插入值;

加了冒号,你就可以对这个值“排版、美化、控制数字格式”。

如果你想,我可以给你做一个可视化小表格,列出所有常用的格式化用法,让你以后随查随用。需要吗?

您说:

print(f"{j}

{i}={i

j}:<10") 这样对吗

ChatGPT 说:

燎然,你这个写法差了一点点格式位置,冒号 : 是在大括号 {} 里面用的,你现在的写法:

python
复制
print(f"{j}*{i}={i*j}:<10")  ❌ 错误

这个会被当成字符串拼接,不会对齐。

✅ 正确写法是:

python
复制
print(f"{j}*{i}={i*j:<10}")

👉 把 :<10 放在 {}= 后面,专门格式化结果 i*j

📌 示例:九九乘法表中对齐一列

python
复制
for i in range(1, 10):
    for j in range(1, i+1):
        print(f"{j}*{i}={i*j:<3}", end='  ')  # 每项占宽3位,靠左对齐
    print()

输出整齐漂亮:

markdown
复制
1*1=1
1*2=2   2*2=4
1*3=3   2*3=6   3*3=9
1*4=4   2*4=8   3*4=12  4*4=16
... 直到 9*9=81

✅ 小结:

| 错误写法 | print(f"{a}*{b}={a*b}:<10") | ❌ 错误,:格式 写在了 {} 外面 |

| 正确写法 | print(f"{a}*{b}={a*b:<10}") | ✅ 正确,格式写在 {} 内部 |

需要我出一道更进阶的格式控制练习题吗?比如让你做一个对齐的“表格成绩单”或者“账单清单”?很实用哟~

您说:

print(f"{j:<2}

{i:<2}=:<2{i

j:<2}",end="") 这样呢

ChatGPT 说:

燎然,你这个写法看得出来你已经很接近目标了,但语法结构有点混乱了,尤其是这段:

python
复制
f"{j:<2}*{i:<2}=:<2{i*j:<2}"

这里的问题是:

  • 你把 =:<2 当成格式控制,但 = 是字符串,:... 是格式说明;
  • 你把多个 {} 嵌套得不对,还把 i*j:<2 放进了错的位置;
  • Python 的 f-string 不支持在 {} 里面再嵌套 {}

✅ 正确写法应该是分开格式化每一个变量:

我们要做的是:

把 j 和 i 打印出来,左对齐宽度为 2;

然后打印 =

再把 i*j 左对齐宽度为 2。

✅ 正确示范:

python
复制
print(f"{j:<2}*{i:<2}= {i*j:<2}", end="  ")

🔍 解释: