%与format()的区别:
- 使用%进行格式化的时候,格式化符号与参数必须一一对应,不能少也不能多,且必选按照顺序代入。格式化多个参数的时候必须使用元组形式,这就带来了一个隐患,使用%无法只传递一个元组的变量,而是需要提供一个单元素的元组而不是一个参数。
- 而str.format()方法,可以接受不限个参数,可以指定位置,位置可以不按顺序。参数可多可少,但是不可以超过索引值。str.format()方法可以只传递一个元组的变量,也可以使用类似关键字传参的方式,并且可以使用字典的键,列表的索引代入。
>>> tup=(1,2,3)
>>> "There is %s" % tup
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting
>>> "There is %s" % (tup,) # 需要提供一个单元素的元组而不是一个参数
'There is (1, 2, 3)'
>>> "There is {}".format(tup) # format()不存在上述问题
'There is (1, 2, 3)'
字符串格式符 %
格式化字符串%s
# 单个字符串
>>> print('我爱%s'%'Python')
我爱Python
# 多个字符串,需要使用元组
>>> print('我爱%s,更爱%s'%('Python','中国'))
我爱Python,更爱中国
# 注意不可以使用列表,提示没有足够的参数
>>> print('我爱%s,更爱%s'%['Python','中国'])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string
# 可以在类型符号前加数字 如10 表示显示宽度,
# 此处为10 表示python的显示宽度为10,即python前面有4个空格(默认右对齐)
>>> print('我爱%10s,更爱%s'%('Python','中国'))
我爱 Python,更爱中国
# 在宽度前面加 - (减号),表示左对其;默认 + (加号),表示右对齐
>>> print('我爱%-10s,更爱%s'%('Python','中国'))
我爱Python ,更爱中国
# 不加宽度,只加 + - 的情况
>>> print('我爱%+s,更爱%s'%('Python','中国'))
我爱Python,更爱中国
>>> print('我爱%-s,更爱%s'%('Python','中国'))
我爱Python,更爱中国
格式化数字%d
%f
…
- 格式化整数
%d
# 格式化整数(多个整数使用元组,与字符串一样)
>>> print('我今年%d岁'%16)
我今年16岁
>>> print('我今年%d岁,%d公斤'%(16,64))
我今年16岁,64公斤
# 加宽度,与字符串一样
>>> print('我今年%10d岁'%16)
我今年 16岁
# 加 `+` (加号),会在正数之前加 `+` 号(右对齐)
>>> print('我今年%+d岁'%16)
我今年+16岁
>>> print('我今年%+10d岁'%16)
我今年 +16岁
# 负数之前加 `+` 号,无改变
>>> print('我今年%d岁,%+d公斤'%(16,-64))
我今年16岁,-64公斤
# 在宽度前加 `-` 号,只起左对齐的作用
>>> print('我今年%-10d岁'%16)
我今年16 岁
# 加空格,不管加几个空格,只显示一个
>>> print('我今年% d岁'%16)
我今年 16岁
# 在宽度之前加`0`,会使用`0`填充宽度
>>> print('我今年%0d岁'%16)
我今年16岁
>>> print('我今年%010d岁'%16)
我今年0000000016岁
# 左对齐 则无(`-` `0` 都属于格式化操作符辅助指令)(连用不会报错,但会使某些不起作用)
>>> print('我今年%-010d岁'%16)
我今年16 岁
>>> print('我今年%0-10d岁'%16)
我今年16 岁
- 格式化浮点数
%f
# 和整数相似,只是由于是浮点数,存在小数点`.`,故需要处理的是小数点后面的位数
# 使用`.n`的形式,确定小数点后面有几位
>>> print('我的身高%.2f'%1.8)
我的身高1.80
# 不加`.n`的情况,默认小数点后6位
>>> print('我的身高%f'%1.8)
我的身高1.800000
# 浮点数也可一加宽度,使用`m.n`,m是显示的最小总宽度,n是小数点后的位数(如果可用的话)
>>> print('我的身高%7.2f'%1.8)
我的身高 1.80
>>> print('我的身高%-7.2f,好高!'%1.8)
我的身高1.80 ,好高!
# 其中宽度、小数点后位数,也可以传入,使用`*`代入
>>> print("%10.*f" % (4, 2.6))
2.6000
>>> print("%*.*f" % (10,4,2.6))
2.6000
# 但是与星号对应的数字,需要依次放在前面,否则会报错
>>> print("%10.*f" % (2.6,4))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: * wants int
这里只列举了部分情况,其他情况请读者自行测试…
python 字符串格式化符号:
符 号 | 描述 |
---|---|
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串 |
%d | 格式化整数 |
%u | 格式化无符号整型 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数 |
%g | %f和%e的简写 |
%G | %F 和 %E 的简写 |
%p | 用十六进制数格式化变量的地址 |
格式化操作符辅助指令:
符号 | 功能 |
---|---|
* | 定义宽度或者小数点精度 |
- | 用做左对齐 |
+ | 在正数前面显示加号( + ) |
<sp> | 在正数前面显示空格 |
# | 在八进制数前面显示零(‘0’),在十六进制前面显示’0x’或者’0X’(取决于用的是’x’还是’X’) |
0 | 显示的数字前面填充’0’而不是默认的空格 |
% | ‘%%‘输出一个单一的’%’ |
(var) | 映射变量(字典参数) |
m.n. | m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |
格式化字符串的函数 str.format()
-
格式化字符串的函数
str.format()
,增强了字符串格式化的功能。 -
基本语法是通过
{}
和:
来代替以前的 % 。 -
format 方法可以接受不限个参数,位置可以不按顺序。
-
用法和 函数的传参方式相似
格式化字符串
# 不设置指定位置,按默认顺序
>>> print("我说:{} {}".format("hello", "world"))
我说:hello world
# 可以指定位置,按不同顺序代入(增强了字符串格式化的功能)
>>> print("我说:{1} {0}".format("hello", "world"))
我说:world hello
# 参数可多可少
>>> print("我说:{1} {0} {1}".format("hello", "world"))
我说:world hello world
>>> print("我说:{1} ".format("hello", "world"))
我说:world
# 但是不能超出索引
>>> print("我说:{2} ".format("hello", "world"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
# 可以使用类似关键字传参的方式
>>> print("我说:{str1} {str2}".format(str1="hello", str2="world"))
我说:hello world
# 可以使用字典方式设置参数,注意:需要在字典前加`**`
>>> dict={'str1':"hello", 'str2':"world"}
>>> print("我说:{str1} {str2}".format(**dict))
我说:hello world
# 可以通过列表索引的方式,因为format(),可以传入多个参数,故需加0(或其他),先取出具体列表
>>> li=["hello", "world"]
>>> print("我说:{0[1]} {0[0]}".format(li)) # "0" 是必须的
我说:world hello
# 也可以向 str.format() 传入对象
>>> class AssignValue(object):
def __init__(self, value):
self.value = value
>>> my_value = AssignValue(6)
>>> print('value 为: {0.value}'.format(my_value)) # "0" 是可选的
value 为: 6
格式化数字
格式化数字,需要使用:
,:
号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充
>>> print("{:d}".format(3));
3
# 没有加 `:` 的情况
>>> print("{d}".format(3));
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'd'
>>> print("{:.2f}".format(3.1415926));
3.14
# 没有加 `:` 的情况
>>> print("{.2f}".format(3.1415926));
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'float' object has no attribute '2f'
# 格式化字符时,如果需要特殊格式(宽度,对齐...)也必须使用:
>>> print("我说:{:10} {}".format("hello", "world"))
我说:hello world
>>> print("我说:{:>10} {}".format("hello", "world"))
我说: hello world
^
, <
, >
分别是居中、左对齐、右对齐,后面带宽度
:
号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。
+
表示在正数前显示 +,负数前显示 -
(空格)表示在正数前加空格
b
、d
、o
、x
分别是二进制、十进制、八进制、十六进制。
使用大括号{}
来转义大括号
数字 | 格式 | 输出 | 描述 |
---|---|---|---|
3.1415926 | {:.2f} | 3.14 | 保留小数点后两位 |
3.1415926 | {:+.2f} | +3.14 | 带符号保留小数点后两位 |
-1 | {:+.2f} | -1.00 | 带符号保留小数点后两位 |
2.71828 | {:.0f} | 3 | 不带小数 |
5 | {:0>2d} | 05 | 数字补零 (填充左边, 宽度为2) |
5 | {:x<4d} | 5xxx | 数字补x (填充右边, 宽度为4) |
10 | {:x<4d} | 10xx | 数字补x (填充右边, 宽度为4) |
1000000 | {:,} | 1,000,000 | 以逗号分隔的数字格式 |
0.25 | {:.2%} | 25.00% | 百分比格式 |
1000000000 | {:.2e} | 1.00e+09 | 指数记法 |
13 | {:>10d} | 13 | 右对齐 (默认, 宽度为10) |
13 | {:<10d} | 13 | 左对齐 (宽度为10) |
13 | {:^10d} | 13 | 中间对齐 (宽度为10) |
11 | ‘{:b}’.format(11) ‘{:d}’.format(11) ‘{: o}’.format(11) ‘{:x}’.format(11) ’{:#x}’.format(11) ’{:#X}’.format(11) | 1011 11 13 b 0xb 0XB | 进制 |
f-string
使用方法:f'{}'
- 格式化的字符串文字以“f”为前缀,类似于str.format()接受的格式字符串。 它们包含由花括号包围的替换字段。 替换字段是表达式,在运行时进行评估,然后使用format()协议进行格式化:
- 官方文档https://docs.python.org/3.6/whatsnew/3.6.html#whatsnew36-pep498
# 拿官方文档的例子来看下用法
>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> import decimal # decimal意思为十进制,这个模块提供了十进制浮点运算支持。
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" # nested fields
'result: 12.35'
“f -string提供了一种方法,可以在字符串文字中嵌入表达式,使用最小的语法。”应该注意的是,f-string实际上是在运行时计算的表达式,而不是一个常量值。在Python源代码中,f-string是一个文本字符串,前缀为f,其中包含括号内的表达式。表达式被替换为它们的值。
从字符串中提取的表达式在f字符串出现的上下文中计算。这意味着表达式可以完全访问本地和全局变量。可以使用任何有效的Python表达式,包括函数和方法调用。
参考网站:菜鸟教程