查看全课大纲(第 10 / 51 节)
  1. 1.Python 是什么?为什么值得学?
  2. 2.如何为 Python 编程准备一个“全家桶”环境?
  3. 3.Python 有哪几种执行方法?
  4. 4.行与缩进到底有什么用?
  5. 5.注释有什么用,怎么写?
  6. 6.变量:如何给数据起个好名字?
  7. 7.运算符的优先级和常见坑点是什么?
  8. 8.Python 中,数字和布尔值究竟有哪几种?
  9. 9.输入函数 `input()` 和文件读取 `open()` 怎么用?
  10. 10.如何将程序的结果展示给用户或保存下来?
  11. 11.CSV 文件怎么读怎么写才方便?
  12. 12.列表是什么,如何创建和访问它?
  13. 13.列表的修改操作,有哪些方法?
  14. 14.列表切片为什么能取到部分元素?排序和查找又该怎么用?
  15. 15.判断语句:如何让程序根据条件做不同的事?
  16. 16.for 循环如何遍历序列中的元素?
  17. 17.while 循环什么时候才会停?
  18. 18.while 循环的结束条件,你写对了吗?
  19. 19.循环中途想提前结束,怎么办?
  20. 20.`break` 和 `continue` 到底有什么区别?
  21. 21.列表推导式如何让代码更简洁高效?
  22. 22.字符串怎么定义、拼接和操作?
  23. 23.元组:为什么定义单个元素时要加逗号?
  24. 24.集合(set)怎么用?如何快速去重和做集合运算?
  25. 25.字典是什么,为什么比列表更方便?
  26. 26.字典的增删改查与遍历,如何避免 KeyError?
  27. 27.函数里的变量,为什么有的能用有的不能用?
  28. 28.在函数内部修改全局变量,为什么有时不生效?
  29. 29.函数里能修改全局变量吗?返回值怎么用?
  30. 30.匿名函数:如何用 lambda 快速定义简单函数?
  31. 31.面向对象编程是什么,为什么需要它?
  32. 32.类中的方法和属性到底怎么定义和使用?
  33. 33.如何控制对对象内部属性和方法的访问?
  34. 34.异常发生时,程序会怎样继续执行?
  35. 35.如何组织代码:包和模块
  36. 36.`if __name__ == '__main__'` 到底有什么用?
  37. 37.如何用 IDE 的 Debug 功能排查程序错误?
  38. 38.Matplotlib 绘图的第一步该做什么?
  39. 39.Figure 是什么,如何设置图形尺寸?
  40. 40.如何自定义 Matplotlib 的坐标轴?
  41. 41.如何为图表添加图例,让不同曲线一目了然?
  42. 42.饼图怎么画才能直观展示数据占比?
  43. 43.如何用 Matplotlib 绘制散点图?
  44. 44.柱状图怎么画?
  45. 45.如何使用 Matplotlib 绘制等高线图?
  46. 46.如何在 Matplotlib 中绘制子图?
  47. 47.zip 函数如何把多个列表“打包”在一起?
  48. 48.如何给可迭代对象加上索引?
  49. 49.random 模块如何生成随机数?
  50. 50.math 模块怎么用?
  51. 51.Counter 如何快速统计元素出现次数?

如何将程序的结果展示给用户或保存下来?

约 11 分钟

小象实战讲义 · Python 编程从入门到实践

在编写程序时,我们经常需要将计算结果展示给用户,或者将数据保存到文件中供后续使用。本节将学习 Python 中最核心的两种输出方式:向控制台(屏幕)输出和向文件输出。这是数据从程序流向外界的关键一步,也是后续所有程序交互的基础。

💡 核心导读

  • print() 函数:向控制台输出信息的基本工具,可以直接输出变量或字符串。
  • 格式化输出:使用 % 占位符,可以精确控制输出内容的格式(如小数位数、对齐等)。
  • 文件写入:使用 open() 函数以写入模式打开文件,通过 write() 方法将内容保存到磁盘。
  • 文件打开模式:'w'(写入,会覆盖原文件)和 'a'(追加,在文件末尾添加)。
  • 安全操作:使用 with 语句管理文件,可以自动关闭文件,避免资源泄露。

向控制台输出:print() 函数

print() 是 Python 中最常用的输出函数,它将你传入的内容显示在控制台(如终端、Jupyter Notebook 的输出单元格)上。

直接输出

最简单的用法是直接将字符串或变量传给 print()。

import math

# 直接输出字符串
print("Hello, Python!")

# 输出多个内容,print() 会用空格将它们分隔开
name = "小明"
age = 18
print("姓名:", name, "年龄:", age)

# 格式化输出:%5.3f 表示总宽度5位、保留3位小数
print('常量 PI 的值近似为:%5.3f。' % math.pi)
print('PI 的两种精度:%5.3f 和 %5.4f' % (math.pi, math.pi))
Hello, Python!
姓名: 小明 年龄: 18
常量 PI 的值近似为:3.142。
PI 的两种精度:3.142 和 3.1416

格式化输出

当我们需要更精确地控制输出格式时(比如控制小数位数、对齐等),可以使用格式化输出。Python 中一种经典的格式化方法是使用 % 操作符。

基本格式:"格式化字符串" % 值

  • 在字符串中用 % 加格式符(如 %s, %f, %d)作为占位符。
  • 字符串外的 % 后面跟上要填入的值。如果只有一个值,可以直接写;如果有多个值,需要用元组 (值1, 值2, ...) 括起来。

格式符说明:

  • %s:字符串 (String)
  • %d:十进制整数 (Decimal integer)
  • %f:浮点数 (Float)
  • %x / %o:十六进制 / 八进制整数

在 %f 中,可以指定宽度和精度,如 %5.3f:

  • 5 表示最小总宽度(包括小数点和小数部分)。如果实际数字位数不足,会在左侧填充空格;如果位数超出(如 3.1416 有6位),则会按实际宽度显示,不会截断。
  • .3 表示保留3位小数,并进行四舍五入。

向文件输出:保存数据到磁盘

除了在屏幕上显示,我们经常需要将程序生成的数据(如日志、计算结果)永久保存到文件中。

基本文件写入步骤

  1. 打开文件:使用 open(文件路径, 模式) 函数。写入模式常用 'w' (write) 或 'a' (append)。
  2. 写入内容:使用文件对象的 .write(字符串) 方法。
  3. 关闭文件:使用 .close() 方法。这一步非常重要,它能确保数据被真正写入磁盘并释放系统资源。

为满足讲义代码可复制即跑、且不落盘写文件,下面的示例用内存流(io.StringIO)模拟文件;真实项目中把 StringIO() 换成 open('文件路径', 'w') 即可。

import io

# 用 StringIO 在内存中模拟文件,避免依赖本地目录
content = "这是我写的第一行。\n第二行内容\n"
file_buffer = io.StringIO()

# write() 返回写入的字符数
written = file_buffer.write(content)
print("write() 返回:{}".format(written))

# 把指针移回开头,读回刚才写入的内容
file_buffer.seek(0)
print("读回文件内容:")
print(file_buffer.read(), end="")
file_buffer.close()
print("文件已关闭")
write() 返回:16
读回文件内容:
这是我写的第一行。
第二行内容
文件已关闭

真实操作磁盘文件时,把 io.StringIO() 换成 open(文件路径, "w"),其余 write()、close() 的流程不变。content 一共 16 个字符,所以文本模式下 write() 返回 16。

使用 with 语句安全写入

手动调用 .close() 容易忘记,尤其是在程序发生异常时。Python 提供了 with 语句,能自动管理文件的关闭,更加安全可靠。

import io

# with 代码块结束时,文件会自动关闭,无需显式调用 close()
with io.StringIO() as log_file:
    log_file.write("第一行内容。\n")
    log_file.write("这是追加的第二行。\n")
    log_file.seek(0)
    final_content = log_file.read()

print("模拟追加后的文件内容:")
print(final_content, end="")
print("with 代码块结束,文件已自动关闭。")
模拟追加后的文件内容:
第一行内容。
这是追加的第二行。
with 代码块结束,文件已自动关闭。

追加模式 vs 写入模式

  • 'w' (写入模式):打开文件时,会清空文件原有的所有内容,然后从头开始写入。
  • 'a' (追加模式):打开文件时,保留原有内容,新的写入会从文件末尾开始添加。

StringIO 是内存对象,没有文件打开模式,所以覆盖与追加只能在真实文件上看到效果。下面是两种模式的真实写法(示意:讲义代码禁止落盘,不能实跑):

# 示意:讲义代码禁止落盘,不能实跑
# 'w' 写入模式:打开时清空原内容,从头开始写
with open('log.txt', 'w') as f:
    f.write('第一行内容\n')

# 'a' 追加模式:保留原内容,新内容写到文件末尾
with open('log.txt', 'a') as f:
    f.write('第二行内容\n')

📝 动手练一练

  1. 格式化练习:假设你有一个商品单价 price = 45.6789 元,请使用格式化输出,将其显示为“商品单价:45.68元”(保留两位小数)。
👉 点击查看参考答案

思路:使用 % 格式化,格式符用 %.2f 表示保留两位小数。

price = 45.6789
print('商品单价:%.2f元' % price)
商品单价:45.68元
  1. 日志记录:编写一段代码,模拟将当前日期和一条信息“程序启动成功”以追加模式写入一个名为 my_log.txt 的日志文件。请使用 with 语句确保安全。
👉 点击查看参考答案

思路:打开模式用 'a',在 with 代码块内调用 write() 方法写入格式化的字符串。下面用 StringIO 在内存中演示同样的写入与读回过程。

import io

log_date = "2023-10-27"  # 用固定日期,避免依赖当前时间
log_message = "程序启动成功"

with io.StringIO() as log_file:
    log_file.write("{}: {}\n".format(log_date, log_message))
    log_file.seek(0)
    written_log = log_file.read()

print("模拟写入日志:")
print(written_log, end="")
模拟写入日志:
2023-10-27: 程序启动成功

常见错误

错误写法现象或报错原因正确写法
print "Hello"SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?Python 3 中 print 是函数,必须加括号。print("Hello")
f = open("a.txt", "w")
f.write("hi")
(忘记 close)
程序不报错,但文件可能内容不全或损坏。写入的数据可能还留在内存缓冲区,没有真正写入磁盘。使用 with 语句,或手动调用 f.close()。
多次以 'w' 模式打开同一文件并写入每次打开都会清空之前的内容,只保留最后一次写入的数据。'w' 模式的设计就是覆盖写入。如需保留历史,使用 'a'(追加)模式。

小结

  1. print() 函数是向控制台输出信息的基本方式,可直接输出,也可用 % 进行格式化输出。
  2. 格式化字符串中,%s、%d、%f 是常用占位符,%5.3f 可控制宽度和精度。
  3. 写入文件需要三步:打开 (open)、写入 (write)、关闭 (close)。
  4. 使用 with open(...) as f: 语句可以自动管理文件关闭,是更安全的做法。
  5. 文件打开模式 'w' 会覆盖原文件,'a' 会在文件末尾追加新内容。
  6. 写入文件后务必确保文件被正确关闭,否则可能导致数据丢失。

📋 行动清单

  • 在本地创建一个 Python 脚本,尝试用 % 格式化输出你的身高(假设为 1.753 米),保留两位小数。
  • 使用 with 语句,编写代码将你的名字和今天的学习内容追加到一个名为 study_log.txt 的文件中。
  • 分别用 'w' 和 'a' 模式向同一个文件写入内容,观察最终文件内容的区别。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第1章代码包:输入输出_样例代码(含1 个 Notebook、3 个数据/其他文件)
    ZIP · 2KB
    下载