字符串的三种定义方式、拼接、格式化——我终于搞懂了f“{name}“是什么意思
如果你还记得第二篇的内容,有一行代码是这样的:
print("我叫" + name + ",今年" + age + "岁")当时我们用 str(age) 解决了报错。但其实有更优雅的方式——不用加号,也不用 str(),一行就能搞定。这个方式就是 f-string。
前几篇我学了变量、数据类型、类型转换和运算符。其实这些东西写来写去,都绕不开一个东西——字符串。
第一行代码print("Hello World")里有它,变量name = "张三"里有它,拼接报错TypeError也是因为它。字符串几乎无处不在,但我一直没有正儿八经地学过它。今天就来补上这一课。
一、字符串的三种定义方式
前几篇我只用了双引号,但其实字符串有三种定义方式。
1. 单引号
name = '张三' print(name)2. 双引号
name = "张三" print(name)3. 三引号(多行字符串)
text = """这是第一行 这是第二行 这是第三行""" print(text)单引号和双引号的作用完全一样,那为什么要搞两种呢?那是因为字符串里本身可能包含引号。三引号则用来写多行文本,在写长段落、文档注释时特别方便。
二、引号嵌套
先看一段代码:
text = "I'm a student" print(text) # I'm a student这个能正常运行,因为双引号包住了里面的单引号。
那反过来呢?
text = '他说:"你好"' print(text) # 他说:"你好"单引号包住双引号,也没有问题。
但如果字符串里的引号和外面包的引号是同一个呢?比如:
text = 'I'm a student' # 报错!Python 看到 'I' 就以为字符串结束了,结果发现后面跟着 m a student',直接报错。
解决方法一:用另一种引号包住
text = "I'm a student" # 用双引号包住,里面单引号不用转义解决方法二:用反斜杠转义
text = 'I\'m a student' # 用 \' 告诉 Python 这里不是结束,就是一个普通的单引号 print(text) # I'm a student转义符 \ 的作用是“取消特殊含义”,原本引号表示字符串的开始和结束,加上 \ 之后,它只是一个普通字符。
三、常见的转义符
在写文件路径的时候,我遇到过一个问题:
path = "C:\Users\name" print(path) # 输出:C:\Users反斜杠不见了,\n 被当成了换行符。后来才知道,反斜杠在字符串里有特殊含义,需要写成 \ 才能输出真正的反斜杠。类似的情况还不少,所以这里把 Python 里常见的转义符整理了一下:
| 转义符 | 含义 | 示例 |
|---|---|---|
| ' | 输出单引号 | print('I'm fine') → I'm fine |
| " | 输出双引号 | print("他说:"你好"") → 他说:"你好" |
| \n | 换行 | print("第一行\n第二行") |
| \t | 制表符(相当于按一下 Tab) | print("A\tB") → A B |
| \ | 输出一个反斜杠 | print("C:\Users") → C:\Users |
掌握这些,以后写文件路径、处理文本数据的时候会少很多困惑。
四、字符串拼接
在第二篇里我已经用过+拼接字符串了:
name = "张三" print("我叫" + name) # 我叫张三也可以把多个字符串拼在一起:
first_name = "张" last_name = "三" print(first_name + last_name) # 张三注意:字符串只能和字符串拼接
age = 18 print("我今年" + age + "岁") # 报错!这个坑我第二篇已经踩过了,当时用 str(age) 转成字符串解决了。其实在第二篇,我解决的是一个具体问题;到了这里,我才真正理解“为什么不能拼”以及“除了 + 还有什么替代方式”
age = 18 print("我今年" + str(age) + "岁") # 我今年18岁不过,除了 +,Python 还有更好的方式——字符串格式化。
五、字符串格式化
先来看一个场景:
name = "张三" age = 25 city = "北京"现在我想打印一句完整的话:"我叫张三,今年25岁,住在北京。"
如果用拼接:
print("我叫" + name + ",今年" + str(age) + "岁,住在" + city)这样也能做到,但写起来很麻烦,引号和加号混在一起,容易搞乱。
这个时候就需要格式化了。
方式一:f-string(适合Python3.6+)
name = "张三" age = 25 city = "北京" print(f"我叫{name},今年{age}岁,住在{city}") # 我叫张三,今年25岁,住在北京方式二:format()方法
print("我叫{},今年{}岁,住在{}".format(name, age, city)){}是占位符,相当于先留一个空位置,format()里的值会按顺序填进去。
方式三:%格式化
print("我叫%s,今年%d岁,住在%s" % (name, age, city))六、数字精度控制
当格式化浮点数(小数)时,我们经常需要控制显示几位小数。
pi = 3.1415926 print(f"{pi:.2f}") # 3.14(保留两位小数) print(f"{pi:.3f}") # 3.142(保留三位小数,四舍五入) print(f"{pi:.0f}") # 3(保留零位小数)格式说明:{变量名:.nf},其中n是要保留的小数位数。
注意: :.2f这种写法目前只在f-string里最常用。如果用format(),写法是"{:.2f}".format(pi);用%方式,写法是"%.2f" % pi。
这在处理价格、成绩、测量数据时特别有用,例如:
price = 19.9 discount = 0.75 final_price = price * discount print(f"折后价格:{final_price:.2f}元") # 折后价格:14.92元七、对表达式进行格式化
f-string的{}里不只是能放变量,还能放表达式。
表达式就是可以计算出结果的代码片段。比如a + b是一个表达式,结果是两个数相加;age + 1也是一个表达式,结果是一个新数字。在 f-string 的{}里放表达式,Python 会先算出结果,再转成字符串填进去。
例如:
a = 10 b = 20 print(f"{a} + {b} = {a + b}") # 10 + 20 = 30name = "张三" age = 25 print(f"明年我就{age + 1}岁了") # 明年我就26岁了score = 85 print(f"你的成绩:{'及格' if score >= 60 else '不及格'}") # 你的成绩:及格八、综合示例
把今天学的东西串起来:
# 商品信息 name = "Python书籍" price = 79.9 discount = 0.75 quantity = 3 # 计算 final_price = price * discount total = final_price * quantity # 输出 info = f""" ========== 订单信息 ========== 商品名称:{name} 单价:{price:.2f}元 折扣:{discount * 100:.0f}% 折后单价:{final_price:.2f}元 数量:{quantity}件 总价:{total:.2f}元 ============================= """ print(info)运行结果:
========== 订单信息 ========== 商品名称:Python书籍 单价:79.90元 折扣:75% 折后单价:59.92元 数量:3件 总价:179.77元 =============================小结
今天学的东西,整理成一张速查表:
| 操作 | 方法 | 示例 |
|---|---|---|
| 单引号定义 | ' ' | name = '张三' |
| 双引号定义 | " " | name = "张三" |
| 多行字符串 | ''' ''' 或 """ """ | text = """多行""" |
| 引号嵌套 | 外双内单 或 外单内双 | "I'm fine" |
| 转义符 | \ | '、\n、\t |
| 字符串拼接 | + | "你好" + "世界" |
| 字符串格式化(推荐) | f-string | f"姓名:{name}" |
| 保留 n 位小数 | :.nf | f"{pi:.2f}" |
| 格式化表达式 | f"{a + b}" |
下一篇我打算学数据输入(input语句)、布尔类型和比较运算符。
