Python字符串格式化:%、.format()以及f-string

%与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

^, <, > 分别是居中、左对齐、右对齐,后面带宽度

: 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。

+ 表示在正数前显示 +,负数前显示 -

(空格)表示在正数前加空格

bdox 分别是二进制、十进制、八进制、十六进制。

使用大括号{} 来转义大括号

数字格式输出描述
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表达式,包括函数和方法调用。



参考网站:菜鸟教程


  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值