Python中str.format()方法怎样用,有哪些要�

Admin 2022-06-16 群英技术资�

这篇文章给大家分享的是Python中str.format()方法怎样用,有哪些要点。小编觉得挺实用的,因此分享给大家做个参考,文中的介绍得很详细,而要易于理解和学习,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧�
1. 术语说明
  • str.format() 方法通过字符串中的花括号 {} 来识别替换字� replacement field,从而完成字符串的格式化�
  • 替换字段 由字段名 field name 和转换字� conversion field 以及格式说明� format specifier 组成,即一般形式为 {字段�!转换字段:格式说明符}�
  • 字段名分为简单字段名 simple field name 和复合字段名 compound field name�
  • 而转换字段和格式说明符都是可选的�

2. 简单字段名

2.1 简单字段名的说�

简单字段名有三种写法:

  • 省略不写 {}
  • 数字 {十进制非负整数}
  • 变量� {合法的Python标识符}

2.2 省略字段�

花括号内省略字段名,传递位置参数�

  • 替换字段形式� {}
  • 注意:花括号个数可以少于位置参数的个数,反之不然�
# 省略字段名传递位置参�
print('我叫{},今年{}岁�'.format('小明', 18))
"""
我叫小明,今�18岁�
"""

# 花括号个数可以少于位置参数的个数
print('我爱吃{}和{}�'.format('香蕉', '苹果', '大鸭�'))
"""
我爱吃香蕉和苹果�
"""

# 花括号个数多于位置参数的个数则会报错
# print('我还吃{}和{}�'.format('西红�'))
"""
IndexError: tuple index out of range
"""

2.3 数字形式的简单字段名

可以通过数字形式的简单字段名传递位置参数�

  • 数字必须是大于等� 0 的整数�
  • 带数字的替换字段可以重复使用�
  • 数字形式的简单字段名相当于把 format 中的所有位置参数整体当作一个元组,通过字段名中的数字进行取值�
  • � {0} 等价� tuple[0],所以花括号内的数字不能越界�
# 通过数字形式的简单字段名传递位置参�
print('身高{0},家住{1}�'.format(1.8, '铜锣�'))
"""
身高1.8,家住铜锣湾
"""

# 数字形式的简单字段名可以重复使用�
print('我爱{0}。\n她今年{1}。\n{0}也爱我�'.format('阿香', 17))
"""
我爱阿香�
她今�17�
阿香也爱我�
"""

# 体会把所有位置参数整体当成元组来取�
print('阿香爱吃{1}、{3}和{0}�'.format(
    '榴莲', '臭豆�', '皮蛋', '鲱鱼罐头', '螺狮�'))
"""
阿香爱吃臭豆腐、鲱鱼罐头和榴莲�
"""

# 尝试一下越界错�
# print('{1}'.format('错误用法'))
"""
IndexError: tuple index out of range
"""

2.4 变量名形式的简单字段名

使用变量名形式的简单字段名传递关键字参数�

关键字参数的位置可以随意调换�

# 使用变量名形式的简单字段名传递关键字参数
print('我大哥是{name},今年{age}岁�'.format(name='阿飞', age=20))
"""
我大哥是阿飞,今�20岁�
"""

# 关键字参数的顺序可以随意调换
print('我大哥是{name},今年{age}岁�'.format(age=20, name='阿飞'))
"""
我大哥是阿飞,今�20岁�
"""

2.5 简单字段名的混合使�

  • 混合使用数字形式和变量名形式的字段名,可以同时传递位置参数和关键字参数�
  • 关键字参数必须位于位置参数之后�
  • 混合使用时可以省略数字�
  • 省略字段� {} 不能和数字形式的字段� {非负整数} 同时使用�
# 混合使用数字形式和变量名形式的字段名
# 可以同时传递位置参数和关键字参�
print('这是一个关于{0}、{1}和{girl}的故事�'.format(
    '小明', '阿飞', girl='阿香'))
"""
这是一个关于小明、阿飞和阿香的故事�
"""

# 但是关键字参数必须位于位置参数之�
# print('这是一个关于{0}、{1}和{girl}的故事�'.format(
    # '小明', girl='阿香' , '阿飞'))
"""
SyntaxError: positional argument follows keyword argument
"""

# 数字也可以省�
print('这是一个关于{}、{}和{girl}的故事�'.format(
    '小明', '阿飞', girl='阿香'))

# 但是省略字段名不能和数字形式的字段名同时出现
# print('这是一个关于{}、{1}和{girl}的故事�'.format(
#     '小明', '阿飞', girl='阿香'))
"""
ValueError: cannot switch from automatic field numbering to manual field specification
"""

2.6 使用元组和字典传�

str.format() 方法还可以使� *元组 � **字典 的形式传参,两者可以混合使用�
位置参数、关键字参数�*元组 � **字典 也可以同时使用,但是要注意,位置参数要在关键字参数前面,*元组 要在 **字典 前面�

# 使用元组传参
infos = '钢铁�', 66, '小辣�'
print('我是{},身价{}亿�'.format(*infos))
"""
我是钢铁侠,身家66亿�
"""
print('我是{2},身价{1}亿�'.format(*infos))
"""
我是小辣椒,身家66亿�
"""

# 使用字典传参
venom = {'name': '毒液', 'weakness': '�'}
print('我是{name},我怕{weakness}�'.format(**venom))
"""
我是毒液,我怕火�
"""

# 同时使用元组和字典传�
hulk = '绿巨�', '拳头'
captain = {'name': '美国队长', 'weapon': '�'}
print('我是{}, 我怕{weapon}�'.format(*hulk, **captain))
print('我是{name}, 我怕{1}�'.format(*hulk, **captain))

"""
我是绿巨�, 我怕盾�
我是美国队长, 我怕拳头�
"""

# 同时使用位置参数、元组、关键字参数、字典传�
# 注意�
# 位置参数要在关键字参数前�
# *元组要在**字典前面
tup = '鹰眼',
dic = {'weapon': '�'}
text = '我是{1},我怕{weakness}。我是{0},我用{weapon}�'
text = text.format(
    *tup, '黑寡�', weakness='男人', **dic)
print(text)
"""
我是黑寡妇,我怕男人。我是鹰眼,我用箭�
"""

3. 复合字段�

3.1 复合字段名的说明

同时使用了数字和变量名两种形式的字段名就是复合字段名�
复合字段名支持两种操作符�

  • [] 方括�
  • . 点号

3.2 . 点号的使�

传递位置参�

  • 替换字段形式:{数字.属性名}
  • 只有一个替换字段的时候可以省略数�
# 复合字段名中使用点号传递对象属�
class Person:
    def __init__(self, name, addr):
        self.name = name
        self.addr = addr


p = Person('辣妹�', '重庆')

# 点号用法:传递位置参�
print('我是{0.name},家在{0.addr}�'.format(p))
"""
我是辣妹子,家在重庆�
"""

# 当只有一个替换字段的时候可以省略数�
print('{.name}辣!'.format(p))
"""
辣妹子辣�
"""

# 试试传递文件对象的属�
f = open('out.txt', 'w')
print('文件名为:{.name}'.format(f))
f.close()
"""
文件名为:out.txt
"""

传递关键字参数

替换字段形式:{关键字参数名.属性名}

# 点号用法:传递关键字参数
print('我是{girl.name},家在{girl.addr}�'.format(girl=p))
# 和上一句等�
print('我是{p.name},家在{p.addr}�'.format(p=p))
"""
我是辣妹子,家在重庆�
我是辣妹子,家在重庆�
"""

3.3 [] 方括号的使用

传递位置参�

  • 用列表传递位置参�
  • 用元组传递位置参�
  • 用字典传递位置参�
# 方括号用法:用列表传递位置参�
infos = ['阿星', 9527]
food = ['霸王�', '爆米�']
print('我叫{0[0]},警号{0[1]},爱吃{1[0]}�'.format(
    infos, food))
"""
我叫阿星,警�9527,爱吃霸王花�
"""

# 方括号用法:用元组传递位置参�
food = ('僵尸', '脑子')
print('我叫{0[0]},年龄{1},爱吃{0[1]}�'.format(
    food, 66))
"""
我叫僵尸,年�66,爱吃脑子�
"""

# 方括号用法:用字典传递位置参�
dic = dict(name='阿星', pid=9527)
print('我是{[name]}�'.format(
    dic))
# 多个替换字段,不能省略数�
print('我是{0[name]},警号{0[pid]}�'.format(
    dic))
"""
我是阿星�
我是阿星,警�9527�
"""

传递关键字参数

  • 用列表传递关键字参数
  • 用元组传递关键字参数
  • 用字典传递关键字参数
# 方括号用法:传递关键字参数
names = ['皮卡�']
dic = {'name': '妙蛙�'}
skills = ('十万伏特', '飞叶快刀')
text = '我是{names[0]},我会{skills[0]}。我是{dic[name]},我会{skills[1]}�'
text = text.format(names=names, skills=skills, dic=dic)
print(text)
"""
我是皮卡丘,我会十万伏特。我是妙蛙花,我会飞叶快刀�
"""

4. 转换字段

转换字段 conversion field 的取值有三种,前面要� !�

  • s:传递参数之前先对参数调� str()
  • r:传递参数之前先对参数调� repr()
  • a:传递参数之前先对参数调� ascii()

ascii() 函数类似 repr() 函数,返回一个可以表示对象的字符串�
但是对于� ASCII 字符,使� \x,\u 或� \U 转义�

# 转换字段
print('I am {!s}!'.format('Bruce Lee 李小�'))
print('I am {!r}!'.format('Bruce Lee 李小�'))
print('I am {!a}!'.format('Bruce Lee 李小�'))
"""
I am Bruce Lee 李小�!
I am 'Bruce Lee 李小�'!
I am 'Bruce Lee \u674e\u5c0f\u9f99'!
"""

5. 格式说明�

在替换字段中,格式说明符前面有一个冒� : �
{字段�!转换字段:格式说明符}
其中格式说明符本身可以是一个字段名,比如:

print('{0:{1}}'.format(3.14159, '.4f'))
"""
3.1416
"""

5.1 标准格式说明符的格式

如果不通过重写 __format__ 方法来进行自定义的话,标准格式说明符的形式如下。其中方括号是可选的�
[[fill]align][sign][#][0][width][grouping_option][.precision][type]

中文形式可以写作�
[[填充]对齐方式][正负号][#][0][宽度][分组选项][.精度][类型码]

5.2 填充与对齐方�

填充�

  • 只能是一个字�
  • 不指定默认用空格填充
  • 如果指定填充字符,则必须要同时指定对齐方�

对齐方式的取值:

  • <:左对齐
  • >:右对齐
  • ^:居�
  • =:在正负号(如果有的话)和数字之间填充,该对齐选项仅对数字类型有效。它可以输出类似 +0000120 这样的字符串�

注意�

如果不给定最小宽� width,对齐方式毫无意义�

5.3 正负�

  • 正负号选项仅对数字类型生效
  • 取值有三种�
    • + 正数前面添加正号,负数前面添加负�
    • - 仅在负数前面添加负号(默认行为)
    • 空格:正数前面需要添加一个空格,以便与负数对�
# 正负�
print('{:�=+8.2f}'.format(3.14159))
print('{:�=+8.2f}'.format(-3.14159))
print('{:�=+8.2f}'.format(0))
print('{:�=+8.2f}'.format(-0))
"""
+哈哈�3.14
-哈哈�3.14
+哈哈�0.00
+哈哈�0.00
"""

5.4 # �

# 号:

  • 给u二进制数加上 0b 前缀
  • 给八进制数加� 0o 前缀
  • 给十六进制数加上 0x 前缀

5.5 最小宽�

最小宽� width�

  • 如果不指定,最小字段宽度由内容决定,与内容相等
  • 如果最小宽度前面有一个前� 0,意味着� 0 填充
  • 这等价于指定� 0= 的填充和对齐方式

5.6 分组选项

分组选项 grouping_option 的取值有两种�

逗号 ,:使用逗号对数字以千为单位进行分隔。n 类型的数字可以使用本地化的分隔符�

n类型在本机无法使用分组选项 ,
原因可能是中文没有数字分隔符

# n 类型使用本地化的分组选项 ,
# 此项报错,我怀疑是因为中文没有数字的分隔符
# print('数字:{0:,n}'.format(6666))
"""
ValueError: Cannot specify ',' with 'n'.
"""

# 使用 d 类型确实是可以的
print('数字:{0:,d}'.format(6666))
"""
数字�6,666
"""

下划� _:使用下划线对浮点数� d 类型的整数以千为单位进行分隔。对� b、o、x � X 类型,每四位插入一个下划线,其他类型都会报错�

# 分组选项 _ 作用� b 类型
print('数字:{0:_b}'.format(0b100111011))
"""
数字�1_0011_1011
"""

# 分组选项 _ 作用� o 类型
print('数字:{0:_o}'.format(0o426754316))
"""
数字�4_2675_4316
"""

# 分组选项 _ 作用� x 类型
print('数字:{0:_x}'.format(0x2a846e98d))
"""
数字�2_a846_e98d
"""

# 分组选项 _ 作用� X 类型
print('数字:{0:_X}'.format(0X2a846e98d))
"""
数字�2_A846_E98D
"""

# 分组选项 _ 作用于其他类型(比如 n 类型�
# print('字符串:{0:_n}'.format(1234567))
"""
ValueError: Cannot specify ',' with 'n'.
"""

5.7 精度

精度�

  • 精度指定了小数点后面要展示多少位小数
  • 对于非数字类型,精度指定了最大字段宽�
  • 整数类型不能指定精度
# 对于非数字类型,精度指定最大字段宽�
print('{0:.3}'.format('哇哈哈哈哈哈'))
"""
哇哈�
"""
# 整数类型不能指定精度
print('{:.3d}'.format(666))
"""
ValueError: Precision not allowed in integer format specifier
"""

5.8 类型�

类型码可以分为三大类�

  • 字符串类�
  • 整数类型
  • 浮点数类�

5.8.1 字符串类�

s 字符串类型。这是字符串的默认类型,可以省略�
None 不指定类型。同 s 类型�

# s 类型
print('{0:s}'.format('略略�'))
# s 类型可以省略
print('{0:}'.format('略略�'))
"""
略略�
略略�
"""

5.8.2 整数类型

b 二进制�

# b 类型:二进制
print('{0:b}'.format(3))
"""
11
"""

c 字符。把整数转换为相应的 Unicode 字符,然后再打印�

# c 类型:把整数转换� unicode 字符
print('{:c}'.format(97))
"""
a
"""

d 十进制整数�

# d 类型:十进制整数
print('{:d}'.format(666))
"""
666
"""

o 八进制数�

# o 类型:八进制�
print('{:o}'.format(10))
"""
12
"""

x 十六进制数,a � f 小写�

# x 类型:十六进制数,a到f小写
print('{:x}'.format(15))
"""
f
"""

X 十六进制数,A � F 大写�

# X 类型:十六进制数,A到F大写
print('{:X}'.format(15))
"""
F
"""

n 数字 number 类型,与 d 相同,只不过它会使用本地化的数字分隔符�
经试验,在本机为 n 类型指定任何分组选项�, � _)都会报错�
ValueError: Cannot specify ',' with 'n'.

# n 类型:与d相同,会插入本地化的分隔�
print('{:n}'.format(66666))
# 经试验,本机无法� n 指定任何分组选项�,_�
# print('{:,n}'.format(66666))
"""
ValueError: Cannot specify ',' with 'n'.
"""
# print('{:_n}'.format(66666))
"""
ValueError: Cannot specify ',' with 'n'.
"""

None 不指定类型,� d 相同�

5.8.3 浮点数类�

e 科学记数法,� e 来表示指数。默认精度为 6 �

# e 类型:科学记数法
# 默认精度� 6 �
print('{:e}'.format(1234567.1234567))
"""
1.234567e+06
"""

E � e 相同,但是使用大写的 E 表示指数�

# E 类型:与 e 相同,用大写 E 表示指数
# 默认精度� 6 �
print('{:E}'.format(1234567.1234567))
# 修改精度� 10 �
print('{:.10E}'.format(1234567.1234567))
"""
1.234567E+06
1.2345671235E+06
"""

f 定点记法,默认精度为 6�

# f 类型
# 默认精度� 6 �
print('{:f}'.format(1234567.1234567))
"""
1234567.123457
"""

F 定点记法,同 f,但是会� nan 转换� NAN,把 inf 转换� INF

# F 类型
nan = float('nan')
inf = float('inf')
print('{:F}\n{:F}'.format(nan, inf))
"""
NAN
INF
"""

g 通用 general 格式。自动转换到 e 或� f 格式,具体的转换规则在此省略。正无穷、负无穷、正零、负零和非数字分别显示为 inf�-inf�0�-0,nan。指定精度为 0 时等价于精度� 1。默认精度为 6 位�

# g 类型
print('{:g}'.format(1234567.1234567))
print('{:g}'.format(1234.1234))
"""
1.23457e+06
1234.12
"""

G 通用 general 格式。自动转换到 E 或� F 格式,转换规则同上,相应表示方式换成大写�

# g 类型
print('{:g}'.format(1234567.1234567))
print('{:g}'.format(1234.1234))
"""
1.23457e+06
1234.12
"""

n 数字 number 类型。跟 g 一样,只不过用本地化的分隔符来分隔数字�

# n 类型
print('{:n}'.format(1234567.1234567))
print('{:n}'.format(1234.1234))
"""
1.23457E+06
1234.12
"""

 
# 经试验,本机指定分组选项会报�
# print('{:,n}'.format(1234.1234))
"""
ValueError: Cannot specify ',' with 'n'.
"""
# print('{:_n}'.format(1234.1234))
"""
ValueError: Cannot specify ',' with 'n'.
"""

% 百分号类型。会将数字乘� 100,然后以 f 定点 fixed-point 格式显示,最后加上一个百分号 %�

# % 类型
print('{:%}'.format(1))
"""
100.000000%
"""

None 不指定类型。输出效果类似调� str() 函数�

6. 补充说明

输出花括号需要用花括号本身来转义

# 打印花括号需要使用花括号转义
print('{{{}}}'.format('张无�'))
"""
{张无忌}
"""

对象可以自定义格式说明符来替换标准格式说明符,比� datetime 类�

from datetime import datetime
print("Today is: {0:%a %b %d %H:%M:%S %Y}".format(datetime.now()))
"""
今天是:Thu Nov 15 13:05:09 2018
"""

以上就是关于“Python中str.format()方法怎样用,有哪些要点”的介绍了,感谢各位的阅读,如果大家想要了解更多相关的内容,欢迎关注群英网络,小编每天都会为大家更新不同的知识�

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:[email protected]进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容�

猜你喜欢

成为群英会员,开启智能安全云计算之旅

立即注册
专业资深工程师驻�
7X24小时快速响�
一站式无忧技术支�
免费备案服务
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 � 0668-2555555
在线客服
微信公众号
返回顶部
返回顶部 返回顶部