
你有没有遇到过这种情况:想输出“我叫张三,今年18岁”,但名字和年龄是变量,每次都要拼接字符串,写一堆+号,还要把数字转成字符串,又慢又容易错。今天我们就来聊聊字符串里的“填空题”——占位符。
什么是占位符?
占位符就是字符串中预留的一个“空位”,等着后面用变量的值去填充。就像我们做填空题:“我叫____,今年__岁”,横线就是占位符,填上具体内容后,完整的句子就出来了。
Python中常用的占位符有三种:%格式化、format()方法和f-string(最推荐)。
用%占位符(老式)
%占位符是最基础的,也是最老式的占位方法,下面是一个实例。
name = "张三" age = 18 print("我叫%s,今年%d岁" % (name, age)) |
在这个实例中,%后的不同字母表示不同的意义:
%s:字符串占位符(s = string)
%d:整数占位符(d = decimal integer)
%f:浮点数占位符,可控制小数位数如%.2f(小数位2位)
但是用%占位符缺点比较明显,需要记住不同类型对应的符号,且变量和占位符位置必须一一对应,在实际使用过程中极容易出错。
用format()方法(通用)
用format()方法进行占位也是目前较为通用的方法,以下是个实例:
name = "张三" age = 18 print("我叫{},今年{}岁".format(name, age)) |
在这个实例中,format()有许多变化:
{}是通用占位符,format()里的参数按顺序填充
可以指定位置:如format(age, name) 中就是先填age再填name
甚至可以指定名称:"{name},{age}".format(name="张三", age=18)
format()占位的优点在于不需要区分类型,功能强大。但是代码略长,尤其是字符串较长时输入比较费时费力且易出错。
f-string(最推荐,Python 3.6+)
使用f-string是目前python中最常用也最方便的占位方法,以下是个实例:
name = "张三" age = 18 print(f"我叫{name},今年{age}岁") |
在使用f-string过程中,要注意以下细节:
在字符串前加f(或F)
直接在{}里写变量名或表达式
可以写计算:f"{age}年后,我{age+10}岁"
相对于前两种方法,使用f-string的优点在于最直观、最简洁、运行速度最快。所以一般是日常开发首选。
占位符的进阶用法
f-string除了常规的占位使用方法之外,还有着以下功能。
1. 控制小数位数
pi = 3.1415926 print(f"圆周率约等于{pi:.2f}") # 输出:3.14 print("{:.2f}".format(pi)) # 同样效果 |
其中“:.2f”表示保留2位小数。
2. 对齐与宽度
name = "张三" print(f"|{name:<10}|") # 左对齐,宽度10 print(f"|{name:>10}|") # 右对齐 print(f"|{name:^10}|") # 居中对齐 |
输出的结果如下:

3. 千位分隔符
num = 1234567 print(f"{num:,}") |
输出的结果如下:

综合案例解析:学生成绩报告单
下面我们通过一个综合案例具体解析占位符的几种用法:
name = "陈小希" # 学生姓名 student_id = 20240506 # 学号 scores = {"语文": 87.5, "数学": 92, "英语": 78.5} # 各科成绩 total = sum(scores.values()) # 总分 average = total / len(scores) # 平均分 # 1. 基础变量嵌入与整数补零 print(f"成绩单 - {name}(学号:{student_id:09d})") # :08d 学号补零成9位 → 20240506 → 020240506 # 2. 遍历输出各科成绩,控制小数位数和对齐 for subject, score in scores.items(): print(f"{subject:<6} {score:>5.1f} 分") # <6左对齐宽度6,>5.1f右对齐宽度5保留1位小数 # 3. 总分与平均分(表达式与格式化) print(f"总分:{total:.1f} 平均分:{average:.2f}") # .1f保留1位小数,.2f保留2位小数 # 4. 等级判断(嵌入三元表达式) grade = "优秀" if average >= 85 else "良好" if average >= 70 else "加油" print(f"综合评级:{grade}") # 5. 千位分隔符演示(假设有更大的数) print(f"本年级总人数:{1234567:,} 人") # :, 输出千位分隔符 → 1,234,567 |
运行结果输出如下:

常见错误与提示
1.为什么print("{name}")没有输出变量值,而是直接输出了{name}?
答:没有在字符串前面加f了。花括号内的name没有被视为变量,只是作为普通字符输出。
2.在f-string里写了{age+1},但age是字符串,结果报错了,为什么?
答:f-string花括号内可以写表达式,但表达式必须能正确执行。如果age是字符串(如从input()直接获得),age+1会触发类型错误,因为字符串不能和整数相加。需要先转换为整数或浮点数,如{int(age)+1}。
3.如果想在f-string里输出花括号本身(比如输出{age}字样),但写{{age}}却输出了{age}而不是带变量的值,怎么办?
答:在f-string中,双花括号{{和}}都会被转义为单个花括号,不进行变量替换。要输出字面花括号,就用两个花括号包裹。例如f"{{age}}"输出{age}。如果想混合变量和花括号,可以写f"{{{age}}}",内层{age}被替换,外层{{和}}转为单花括号,最终输出{变量值}。
4.在f-string里写了大段的表达式,比如列表推导式,代码很长,有办法换行吗?
答:f-string本身不支持在花括号内直接换行,但你可以先在外部将表达式结果赋给一个变量,然后在f-string中引用该变量。例如先计算total = sum(x for x in data if x>0),再写f总和:{total}"。这样既保持了可读性,又避免了长表达式。
5.为什么在f-string里写了嵌套引号会报语法错误?
答:f-string字符串的引号与内部字符串的引号冲突。例如f"他说:"{name}""会提前结束字符串。可以在外部使用双引号时,内部用单引号,如f"他说:'{name}'";或者反过来f'他说:"{name}"'。
占位符就是字符串里的填空题,f-string是最简单好用的方式。
精彩回顾:
一起学Python(009):从零开始学绘图@turtle库使用
一起学Python(008):站在巨人的肩膀上编程@Python库引用
一起学Python(007):Python赋值语句轻松入门@每日饮水记录器
一起学Python(006):分支控制结构让程序学会“做选择”@成绩评定案例
一起学Python(004):Python程序三种控制结构:顺序、分支和循环
一起学Python(003):Python代码书写规则:那些让程序崩溃的“小细节”
一起学Python(002):计算机的“数字秘密”——0和1如何统治世界?
一起学Python(001):为什么文科生也要学Python?
欢迎【点赞】+【转发】❤️
