Python 的 str(字符串)是 不可变的 (immutable)。每次用 + 或其它方式"拼接**"都会创建新的字符串对象**,如果拼很多次,会造成很多临时对象,性能差。因此,少量拼接 (比如几段)用 + 或 f-string 很方便;大量或循环里拼接 应用 ''.join(...) 或字符串缓冲(io.StringIO)或构建 list 再 join。
1.常用的字符串拼接方式
1 f-string(python3.6以上)-语法直观、速度快、能插入表达式与格式化。
python
name = "Alice"
age = 30
s = f"Name: {name}, Age: {age}"
# 支持表达式、格式化
#f-string 允许你在 {} 里面写任何能计算结果的东西
#支持控制 显示出来的文字形式。如 小数保留几位?是否补零?是否右对齐 / 左对齐?
pi = 3.14159
f"pi≈{pi:.2f}" # 'pi≈3.14'
补充一下:pi:.2----------format Specification(Python 格式化迷你语言)
部分 含义 pi要格式化的变量 :.2f说明"我想把这个变量格式化成保留 2 位小数的浮点数" 其中:
python: 2 f | | | | | └── 输出格式是 float(浮点数) | └────── 保留 2 位小数 └────────── 表明后面是格式化指令记录一下python 的讲解
在 Python 中,
format_spec是格式化规范的一种表示,它提供了强大而灵活的字符串格式化功能。通过format_spec,我们可以精确控制数值、字符串等对象的输出格式,例如设置精度、对齐方式、填充字符等 。本文将详细介绍format_spec的基础概念、使用方法、常见实践以及最佳实践,帮助读者深入理解并高效使用这一特性。其格式的一般结构如下:
python数字格式的定义以 ':' 号开始。碰到了': '字符就知道要定义一个数字的显示格式了。格式的定义顺序为 [[fill]align][sign][#][0][width][,][.precision][type] ''' 在 Python 的 f-string(以及 str.format()、format())里,冒号 : 的作用只有一个:告诉 Python:冒号后面是"格式化说明(format specification)"。即: {变量名 : 格式说明} 没有 : = 原样输出 有 : = 使用特定格式输出 ''' format_spec ::= [[fill]align][sign][#][0][width][grouping_option][.precision][type] fill ::= <any character> align ::= "<" | ">" | "=" | "^" sign ::= "+" | "-" | " " width ::= digit+ grouping_option ::= "_" | "," precision ::= digit+ type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
fill:填充字符(任意字符,常用空格或0)align:对齐方式:<(左对齐)、>(右对齐)、^(居中)、=(数字的符号在最左,数字在中间)sign:符号处理:+(始终显示正负号)、-(只显示负号,默认)、(空格,正数前留空格)#:对"#"参数来说,对于二进制/八进制/十六进制,会保留前缀0b/0o/0x;对于浮点会强制显示小数点等0:如果放在 width 前,用0作为填充且与=相关(常见写法如08.2f)width:最小字段宽度(整数),不足时用填充字符填充,:千位分隔符(每三位加逗号).precision:精度,含义随type而异(浮点表示小数位数;通用表示有效位数等)type:格式类型(d,b,o,x,X,f,F,e,E,g,G,%,s等)
- fill 【可选】空白处填充的字符
- align 【可选】对齐方式(需配合width使用)
- <,内容左对齐
- >,内容右对齐(默认)
- =,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字
- ^,内容居中
- sign 【可选】有无符号数字
- +,正号加正,负号加负;
- -,正号不变,负号加负;
- 空格 ,正号空格,负号加负;
【可选】对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示
- , 【可选】为数字添加分隔符,如:1,000,000
- width 【可选】格式化位所占宽度
- .precision 【可选】小数位保留精度
- type 【可选】格式化类型
- 传入" 字符串类型 "的参数
- s,格式化字符串类型数据
- 空白,未指定类型,则默认是None,同s
- 传入" 整数类型 "的参数
- b,将10进制整数自动转换成2进制表示然后格式化
- c,将10进制整数自动转换为其对应的unicode字符
- d,十进制整数
- o,将10进制整数自动转换成8进制表示然后格式化;
- x,将10进制整数自动转换成16进制表示然后格式化(小写x)
- X,将10进制整数自动转换成16进制表示然后格式化(大写X)
- 传入" 浮点型或小数类型 "的参数
- e, 转换为科学计数法(小写e)表示,然后格式化;
- E, 转换为科学计数法(大写E)表示,然后格式化;
- f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
- F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
- g, 自动在e和f中切换
- G, 自动在E和F中切换
- %,显示百分比(默认显示小数点后6位)
fill 【可选】空白处填充的字符
align 【可选】对齐方式(需配合width使用)- <,内容左对齐
- >,内容右对齐(默认)
- =,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字
- ^,内容居中
width 【可选】格式化位所占宽度
2.+ 拼接
python
a = "hello"
b = "world"
c = a + " " + b
print(c)
#hello world
+ 拼接时,两边必须都是字符串
3.,-----print 专用,不是真拼接
python
print("age is", age)
#output
age is 18
#本质上,
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
# *objects:可以传入任意多个要打印的对象(0 个、1 个、多个都行)。
# sep:分隔符,默认为一个空格 ' '。它决定了多个对象之间用什么字符串分隔。
# end:结尾字符串,默认为换行 \n。
#对于
print("age is", age)
#实际上是把两个对象传给了 print():
字符串 "age is"
变量 age(假设 age 是整数 18)
Python 会:
自动把每个对象转换成字符串(对非字符串对象调用 str())。
用 sep 参数指定的分隔符(默认是空格 " ")把它们连起来。
最后加上 end(默认换行)输出。
4.% 格式化
python
name = "Tom"
age = 18
s = "My name is %s, age is %d" % (name, age)
print(s)
# %相当于一个占位符,告诉这里要插入东西了。
| 符号 | 含义 |
|---|---|
%s |
字符串(万能) |
%d |
整数 |
%f |
浮点数 |
5.str.format()
PYTHON
name = "Tom"
age = 18
s = "My name is {}, age is {}".format(name, age)
print(s)
#output
My name is Tom, age is 18
#还可以指定位置
print("{1} is {0}".format("happy", "Tom"))
#output
Tom is happy
#控制格式
pi = 3.14159
print("pi = {:.2f}".format(pi))
#以 :开头,作为开头标志符--{变量:格式规则}---冒号 : 的作用:告诉 Python 后面是格式规则
6.上边写的太复杂了,在写一下f-string
python
name = "Tom"
age = 18
print(f"My name is {name}, age is {age}")
#output
My name is Tom, age is 18
#还可以直接写表达式,但是必须是一个要能够算出来值的东西、不能做那些只做动作但是没有产出结果的东西
a = 3
b = 5
print(f"a + b = {a + b}")
#格式化
pi = 3.14159
print(f"pi = {pi:.2f}")
#同样是以 : 作为格式化的开的头标志。
7.join(),一般都是大量字符串拼接专用的
python
lst = ["I", "love", "Python"]
s = " ".join(lst)
print(s)
#output
I love Python
#但是要注意,join的要求很严格,必须全部是字符串才可以
" ".join(["age", 18]) #---这是错误的,拼接对象必须都是字符串。