系列文章

Python 从入门到精通

第 9 / 36 篇

从环境安装和基础语法出发,逐步学习工程实践、自动化、数据处理与 Web 开发。

  1. 01
    Python 怎么装、怎么用
  2. 02
    变量、数字和字符串
  3. 03
    列表:把一组数据放在一起
  4. 04
    元组、集合和字典
  5. 05
    条件判断:让程序做选择
  6. 06
    循环:重复的事交给程序
  7. 07
    函数:把代码整理成可复用的块
  8. 08
    模块与包:拆分你的程序
  9. 09
    输入、输出与字符串格式化正在阅读
  10. 10
    文件读写:保存程序的数据
  11. 11
    异常处理:程序出错时怎么办
  12. 12
    基础阶段练习:命令行记账本
  13. 13
    类和对象:面向对象入门
  14. 14
    继承、组合与特殊方法
  15. 15
    迭代器与生成器
  16. 16
    列表推导式与生成器表达式
  17. 17
    装饰器:给函数增加能力
  18. 18
    上下文管理器与 with
  19. 19
    类型标注与 dataclass
  20. 20
    正则表达式:从文本中找规律
  21. 21
    日期、时间与时区
  22. 22
    日志与调试
  23. 23
    虚拟环境与依赖管理
  24. 24
    测试:让修改不再提心吊胆
  25. 25
    网络请求:用 Python 调用 API
  26. 26
    网页解析与合规采集
  27. 27
    操作 Excel、CSV 与批量文件
  28. 28
    SQLite:给程序加一个数据库
  29. 29
    数据分析入门:NumPy 与 Pandas
  30. 30
    画图:把数据变得直观
  31. 31
    Flask 入门:做一个小网站
  32. 32
    异步编程:同时处理多项任务
  33. 33
    线程、进程与并发选择
  34. 34
    性能分析与优化
  35. 35
    项目结构、配置与发布
  36. 36
    综合项目:从需求到上线

查看整个系列 →

程序不是写给自己看的,是要跟人打交道的:人要输入点什么,程序要输出点什么。这一篇把输入、输出和字符串格式化讲透——别小看它们,这是每个程序的门面。

input():让用户说话

input() 会暂停程序,等用户敲键盘回车,然后返回输入的内容(永远是字符串):

name = input("你叫什么名字?")
print(f"你好,{name}!")

运行效果( 表示用户输入):

你叫什么名字?南山▢
你好,南山!

最容易踩的坑:input() 返回的是字符串!要做数学运算必须先转换:

age = input("你多大了?")
# print(age + 1)  # 报错!TypeError: can only concatenate str (not "int") to str
age = int(input("你多大了?"))   # 先转成整数
print(f"明年你就 {age + 1} 岁了")

用户可能输入乱七八糟的东西,int("abc") 会报 ValueError。健壮的做法是捕获异常(后面异常处理那篇细讲)或用 try 兜底。

print() 的高级用法

print 不止能打印一个值,还有两个好用的参数:

# sep:多个值之间用什么分隔(默认空格)
print("南山", "小站", "开张")        # 南山 小站 开张
print("南山", "小站", "开张", sep="-")  # 南山-小站-开张
print("2026", "08", "14", sep="/")     # 2026/08/14

# end:结尾用什么(默认换行 n)
print("加载中", end="")
print("...完成")                      # 加载中...完成(不换行)
print("第 1 行", end=" | ")
print("第 2 行")                      # 第 1 行 | 第 2 行

f-string 进阶

f-string 除了塞变量,还能做格式化。花括号里变量后面加冒号 + 格式说明:

pi = 3.1415926535
print(f"{pi:.2f}")      # 3.14(保留 2 位小数)
print(f"{pi:.4f}")      # 3.1416(四舍五入)

n = 42
print(f"{n:05d}")       # 00042(补零到 5 位)
print(f"{n:<5}结束")     # 42   结束(左对齐占 5 位)
print(f"{n:>5}")        #    42(右对齐)

money = 1234567
print(f"{money:,}")     # 1,234,567(千分位分隔)

rate = 0.856
print(f"{rate:.1%}")    # 85.6%(百分比格式)

name = "南山"
print(f"{name:*^10}")   # ****南山****(居中,两侧填 *)

这些格式符记不住没关系,知道”冒号后面能跟格式”就行,用到再查。

更早的两种格式化(了解即可)

你会看到老代码用这两种方式,认识一下,别被吓到:

# % 格式化(C 语言风格,老代码常见)
name = "南山"
age = 1
print("%s 已经 %d 岁了" % (name, age))

# format() 方法(Python 2.6+ / 3.x 中间时代)
print("{} 已经 {} 岁了".format(name, age))
print("{0} 和 {1}".format("a", "b"))   # 按下标
print("{name} 在 {city}".format(name="南山", city="敦化"))

新代码统一用 f-string,可读性最好。但读老代码时这两种要认得。

字符串常用方法

趁这篇把字符串的常用操作一起过了:

s = "  Hello, 南山小站  "
print(s.strip())          # "Hello, 南山小站"(去掉首尾空白)
print(s.lower())          # 全小写
print(s.upper())          # 全大写
print(s.replace("南山", "北山"))  # 替换
print(s.split(","))       # ['  Hello', ' 南山小站  '](按逗号切分)
print(s.startswith("  ")) # True(以什么开头)
print(s.endswith("  "))   # True(以什么结尾)
print(len(s))             # 长度
print(s.count("南"))      # 某个字符出现次数
print("abc" in s)         # False(包含判断)

splitjoin 是一对好搭档——切分和拼接:

words = ["南山", "小站", "开张"]
print("-".join(words))    # 南山-小站-开张(join 是字符串的方法,别搞反)
print(" ".join(words))    # 南山 小站 开张

注意是 "分隔符".join(列表),不是 列表.join()——新手经常写反。

新手坑

坑 1:input 忘转换。所有 input 返回都是字符串,算数前先 int()/float()

坑 2:f-string 里的大括号。想输出花括号本身要写两个:

print(f"{{你好}}")   # {你好}

坑 3:join 方向搞反。"-".join(list),分隔符在左边。

小结

  • input() 返回字符串,做运算前先类型转换,注意 ValueError
  • print(..., sep=..., end=...) 控制分隔符和结尾
  • f-string 格式化:{x:.2f} 小数、{n:05d} 补零、{m:,} 千分位、{r:.1%} 百分比
  • 字符串常用:strip/lower/split/join/replace/count/in
  • 新代码用 f-string,老代码的 % 和 format() 认得即可

练习

  1. 写一个程序:输入姓名和出生年份,输出”XX 今年 XX 岁”(用 f-string)
  2. 写一个程序:输入一句英文,统计里面有几个单词(提示:split)
  3. 思考:f"{3.14159:.2f}" 输出什么?f"{123456789:,}" 呢?如果想把 3.14159 显示成 “003.14” 该怎么写?