Python 字符串格式化 f-string f“{}“ .format
Python f-string 用法
简单介绍
格式字符串字面值 或称 f-string 是标注了 'f'
或 'F'
前缀的字符串字面值。这种字符串可包含替换字段,即以 {}
标注的表达式。其他字符串字面值只是常量,格式字符串字面值则是可在运行时求值的表达式。
基本语法如下:
f_string ::= (literal_char | "{{" | "}}" | replacement_field)*
replacement_field ::= "{" f_expression ["="] ["!" conversion] [":" format_spec] "}"
f_expression ::= (conditional_expression | "*" or_expr)("," conditional_expression | "," "*" or_expr)* [","]| yield_expression
conversion ::= "s" | "r" | "a"
format_spec ::= (literal_char | NULL | replacement_field)*
literal_char ::= <any code point except "{", "}" or NULL>
起源
f-string
是格式化字符串的一种很好的方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快!
3.6 新版功能.
在 3.7 版更改: Python 3.7 以前, 因为实现的问题,不允许在格式字符串字面值表达式中使用
await
表达式与包含async for
子句的推导式。3.8 新版功能: 等号
'='
。'='
用法通常用于调试过程输出变量名称及其存储的值.表达式里含等号 ‘=’ 时,输出内容包括表达式文本、‘=’ 、求值结果。输出内容可以保留表达式中左花括号 ‘{’ 后,及 ‘=’ 后的空格。没有指定格式时,‘=’ 默认调用表达式的 repr()。指定了格式时,默认调用表达式的 str(),除非声明了转换字段 ‘!r’。
基本用法
整数格式化
基本格式类型
格式描述符 | 含义与作用 | 适用变量类型 |
---|---|---|
s | 普通字符串格式 | 字符串 |
b | 二进制整数格式 | 整数 |
c | 字符格式,按 unicode 编码将整数转换为对应字符 | 整数 |
d | 十进制整数格式 | 整数 |
o | 八进制整数格式 | 整数 |
x | 十六进制整数格式(小写字母) | 整数 |
X | 十六进制整数格式(大写字母) | 整数 |
e | 科学计数格式,以 e 表示 ×10^ | 浮点数、复数、整数(自动转换为浮点数) |
E | 与 e 等价,但以 E 表示 ×10^ | 浮点数、复数、整数(自动转换为浮点数) |
f | 定点数格式,默认精度(precision)是 6 | 浮点数、复数、整数(自动转换为浮点数) |
F | 与 f 等价,但将 nan 和 inf 换成 NAN 和 INF | 浮点数、复数、整数(自动转换为浮点数) |
g | 通用格式,小数用 f,大数用 e | 浮点数、复数、整数(自动转换为浮点数) |
G | 与 G 等价,但小数用 F,大数用 E | 浮点数、复数、整数(自动转换为浮点数) |
% | 百分比格式,数字自动乘上 100 后按 f 格式排版,并加 % 后缀 | 浮点数、整数(自动转换为浮点数 |
数学符号相关格式描述符
格式描述符 | 含义与作用 |
---|---|
+
|
负数前加负号(- ),正数前加正号(+ )
|
-
|
负数前加负号(- ),正数前不加任何符号(默认)
|
(空格) |
负数前加负号(- ),正数前加一个空格
|
#
|
切换数字显示方式, 用于控制是否显示进制前缀, 例如二进制’0b’, 八进制的’0o’和十六进制的’0x’ |
注:
空格或其他符合也可作为宽度占位符(例如下文对齐和填充字符
部分用法).
千分位占位符也可以使用_
.
8 16 进制的占位符如果使用大写格式, 那么打印出的进制前缀也会变为相应大写格式.
from random import randint
print(f"前导0、统一宽度、千分位、八进制、十六进制、带前缀大写十六进制、二进制")nlist = [randint(-9999, 99999) for i in range(10)]
for i, n in enumerate(nlist):line = f"No.{i:04d}:{n:8d}:{n:8,d}:{n:8o}:{n:8x}:{n:#8X}:{n:020b}"print(line)
前导0、统一宽度、千分位、八进制、十六进制、带前缀大写十六进制、二进制
No.0000: 64972: 64,972: 176714: fdcc: 0XFDCC:00001111110111001100
No.0001: 92916: 92,916: 265364: 16af4: 0X16AF4:00010110101011110100
No.0002: 99560: 99,560: 302350: 184e8: 0X184E8:00011000010011101000
No.0003: 23767: 23,767: 56327: 5cd7: 0X5CD7:00000101110011010111
No.0004: 33628: 33,628: 101534: 835c: 0X835C:00001000001101011100
No.0005: 710: 710: 1306: 2c6: 0X2C6:00000000001011000110
No.0006: 47749: 47,749: 135205: ba85: 0XBA85:00001011101010000101
No.0007: 56646: 56,646: 156506: dd46: 0XDD46:00001101110101000110
No.0008: 22526: 22,526: 53776: 57fe: 0X57FE:00000101011111111110
No.0009: 34263: 34,263: 102727: 85d7: 0X85D7:00001000010111010111
浮点数格式化
from random import uniform
print("前导0、统一宽度右对齐、千分位、小数点后固定位数、百分比")flist = [uniform(-999, 9999) for i in range(10)]
for i, f in enumerate(flist):line = f"{f:012.2f}:{f:12.3f}:{f:12,.2f}:{f:12.1%}"print(line)
前导0、统一宽度右对齐、千分位、小数点后固定位数、百分比
000004842.42: 4842.417: 4,842.42: 484241.7%
000003106.63: 3106.634: 3,106.63: 310663.4%
000009213.21: 9213.205: 9,213.21: 921320.5%
000008040.67: 8040.671: 8,040.67: 804067.1%
000006086.32: 6086.322: 6,086.32: 608632.2%
000005251.10: 5251.105: 5,251.10: 525110.5%
000008219.07: 8219.072: 8,219.07: 821907.2%
000007046.32: 7046.325: 7,046.32: 704632.5%
000000192.89: 192.888: 192.89: 19288.8%
000006164.21: 6164.208: 6,164.21: 616420.8%
时间格式化
常用的特殊格式类型:标准库 datetime
给定的用于排版时间信息的格式类型,适用于 date
、datetime
和 time
对象
格式描述符 | 含义 | 显示样例 |
---|---|---|
%a | 星期几(缩写) | ‘Sun’ |
%A | 星期几(全名) | ‘Sunday’ |
%w | 星期几(数字,0 是周日,6 是周六) | ‘0’ |
%u | 星期几(数字,1 是周一,7 是周日) | ‘7’ |
%d | 日(数字,以 0 补足两位) | ‘07’ |
%b | 月(缩写) | ‘Aug’ |
%B | 月(全名) | ‘August’ |
%m | 月(数字,以 0 补足两位) | ‘08’ |
%y | 年(后两位数字,以 0 补足两位) | ‘14’ |
%Y | 年(完整数字,不补零) | ‘2014’ |
%H | 小时(24 小时制,以 0 补足两位) | ‘23’ |
%I | 小时(12 小时制,以 0 补足两位) | ‘11’ |
%p | 上午/下午 | ‘PM’ |
%M | 分钟(以 0 补足两位) | ‘23’ |
%S | 秒钟(以 0 补足两位) | ‘56’ |
%f | 微秒(以 0 补足六位) | ‘553777’ |
%z | UTC 偏移量(格式是 ±HHMM[SS],未指定时区则返回空字符串) | ‘+1030’ |
%Z | 时区名(未指定时区则返回空字符串) | ‘EST’ |
%j | 一年中的第几天(以 0 补足三位) | ‘195’ |
%U | 一年中的第几周(以全年首个周日后的星期为第 0 周,以 0 补足两位) | ‘27’ |
%w | 一年中的第几周(以全年首个周一后的星期为第 0 周,以 0 补足两位) | ‘28’ |
%V | 一年中的第几周(以全年首个包含 1 月 4 日的星期为第 1 周,以 0 补足两位) | ‘28’ |
import datetime
e = datetime.datetime.today()
f'the time is{e:%Y-%m-%d (%a) %H:%M:%S}'
'the time is 2022-12-29 (Thu) 22:23:58'
格式化打印各种数据类型
from faker import Fakerf = Faker()
# 使用faker库生成所需数据
word = f.word() # 生成一个单词
print(f"str: '{word}' in a line")
print(f"int:{f.pyint()}")
print(f"float:{f.pyfloat()}")
print(f"bool:{f.pybool()}")
print(f"list:{f.words()}")
print(f"dict:{f.pydict(3, 1, 2)}")
print(f"set:{f.pyset(3, 1, 2)}")
print(f"tuple{f.pytuple(3, 1, 2)}")
str: 'animal' in a line
int: 3387
float: -31220036492.2902
bool: False
list: ['expect', 'shake', 'there']
dict: {'yard': 7553}
set: {106}
tuple(2603, 8262, 3320)
对齐和填充字符
from faker import Fakerf = Faker()
namelist = [f.first_name() for i in range(10)]
print(f"{'-' * 10}{'左中右对齐'}{'-' * 10}")
for name in namelist:line = f"|{name:<16}|{name:^16}|{name:>16}|"print(line)print(f"\n{'-' * 10}{'填充字符'}{'-' * 10}")
for i, name in enumerate(namelist):line = f"{i}{name:.>16}"print(line)
----------左中右对齐----------
|James | James | James|
|Luis | Luis | Luis|
|Keith | Keith | Keith|
|Kimberly | Kimberly | Kimberly|
|Lauren | Lauren | Lauren|
|Gregory | Gregory | Gregory|
|Daniel | Daniel | Daniel|
|Adam | Adam | Adam|
|Emily | Emily | Emily|
|Jessica | Jessica | Jessica|----------填充字符----------
0...........James
1............Luis
2...........Keith
3........Kimberly
4..........Lauren
5.........Gregory
6..........Daniel
7............Adam
8...........Emily
9.........Jessica
此处f"\n{'-' * 10}{'填充字符'}{'-' * 10}"
可以用f"\n{'填充字符':-^24}"
替代, f-string的优雅之处在此刻尽显
print(f"\n{'填充字符并居中对齐':-^35}")
for i, name in enumerate(namelist):line = f"[{name:-^40}]"print(line)
-------------填充字符并居中对齐-------------
[-----------------James------------------]
[------------------Luis------------------]
[-----------------Keith------------------]
[----------------Kimberly----------------]
[-----------------Lauren-----------------]
[----------------Gregory-----------------]
[-----------------Daniel-----------------]
[------------------Adam------------------]
[-----------------Emily------------------]
[----------------Jessica-----------------]
调试阶段输出变量名及其内容
# 变量=值,输出
a, b = 12, 34
s = f"{a=},{b=},{a*a+b*b=}"
print(s)
a=12, b=34, a*a+b*b=1300
嵌套调用
# 嵌套的格式
from math import pi
for i in range(10):print(f"{pi:.{i}f}") # f-string中可以使用变量进行动态格式化
3
3.1
3.14
3.142
3.1416
3.14159
3.141593
3.1415927
3.14159265
3.141592654
多行f-string
name, age, lang = 'leo', 21, 'python'
message = (f"Hi I'm{name}. "f"My age is{age}. "f"{lang}is the best language."
)
message
"Hi I'm leo. My age is 21. python is the best language."
任意表达式
f-string
是在运行时进行渲染的, 因此可以使用表达式, 函数…
这将使您的代码变得更加优雅
细心的您可能会发现, 上文有部分使用了此特性
name = 'Leo'
age = 21
print(f"My name is{name.lower()}. "f"Tomorrow my age will be{age + 1}"
)
My name is leo. Tomorrow my age will be 22
您甚至可以使用f-string
来格式化您打印的对象
就像这样:
class Person:def __init__(self, name, age, type_):self.name = nameself.age = ageself.type_ = type_def __str__(self):return f"<{self.__class__.__name__}>{self.name},{self.age},{self.type_}"p = Person("leo", 21, "student")
print(p)
<Person> leo, 21, student
注意
在使用 f-string 时大括号内所用的引号不能和大括号外的引号定界符冲突, 根据情况切换’和", 如果仍不满足需求可以使用’''和"“”
>>> f'I am{"Eric"}'
'I am Eric'
>>> f'I am {'Eric'}'File "<stdin>", line 1f'I am {'Eric'}'^
SyntaxError: invalid syntax
>>> f"He said {"I'm Eric"}"File "<stdin>", line 1f"He said {"I'm Eric"}"^
SyntaxError: invalid syntax>>> f'He said {"I'm Eric"}'File "<stdin>", line 1f'He said {"I'm Eric"}'^
SyntaxError: invalid syntax>>> f"""He said{"I'm Eric"}"""
"He said I'm Eric"
>>> f'''He said{"I'm Eric"}'''
"He said I'm Eric"
当您想要在f-string中打印{}
时, 需要使用{{}} , 此时双括号内部的内容将不会被渲染
>>> f"{{12 + 3}}"
'{12 + 3}'
conversion 用法
指定了转换符时,表达式求值的结果会先转换,再格式化。转换符 '!s'
调用 str()
转换求值结果,'!r'
调用 repr()
,'!a'
调用 ascii()
。
默认情况下,f-string 将使用 str(),但如果包含转换标志,则可以确保它们使用 repr()
class People:def __init__(self, first_name, last_name, age):self.first_name = first_nameself.last_name = last_nameself.age = agedef __str__(self):return f"{self.first_name}{self.last_name}is{self.age}."def __repr__(self):return f"{self.first_name}{self.last_name}is{self.age}. made by repr!"# 调用
person01 = People("Wang", "Leo", "21")
print(f"{person01}")
print(f"{person01!r}")
Wang Leo is 21.
Wang Leo is 21. made by repr!
ascii(object)
与 repr() 类似,返回一个字符串,表示对象的可打印形式,但在 repr() 返回的字符串中,非 ASCII 字符会用 \x、\u 和 \U 进行转义。生成的字符串类似于 Python 2 中 repr() 的返回结果。
ascii(object)
与 repr() 类似,返回一个字符串,表示对象的可打印形式,但在 repr() 返回的字符串中,非 ASCII 字符会用 \x、\u 和 \U 进行转义。生成的字符串类似于 Python 2 中 repr() 的返回结果。
!a 用法
a_str = "阿多
Python 字符串格式化 f-string f“{}“ .format相关推荐
- 【Python】Python字符串格式化问题:%、format()与f-strings
目 录 一.字符串格式化方法概览 二.format() 常用格式化 1.通过位置 2.通过关键字参数 3.通过对象属性 4.通过下标 5.格式限定符 1)字符的填充与对齐 2)数字精度与类型f处理 ...
- python 字符串格式化,使用f前缀
格式化一般用%,但后来推荐用format format有进步,可以用索引或者名字,但仍然没有很方便和快捷 # logger.debug('{} {} {} {} {} {}'.format(metho ...
- python字符串_Python字符串格式化%s%d%f详解
关于讨论输出格式化的问题,小编不是一时兴起,之前学习python的时候就经常遇到输出时"%d",一直没有仔细学习,今天又看到了,下面分享一个简单实例,python输出99乘法表: ...
- python 字符串格式化%s_Python字符串格式化%s%d%f详解
关于讨论输出格式化的问题,小编不是一时兴起,之前学习python的时候就经常遇到输出时"%d",一直没有仔细学习,今天又看到了,下面分享一个简单实例,python输出99乘法表: ...
- python字符串格式化详解_Python字符串格式化%s%d%f详解
Python字符串格式化%s%d%f详解 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: Python字符串格式化%s%d%f详解.txt ] (友情提示:右键点上 ...
- 【知识碎片】python 字符串格式化输出:%d,%s,%f
在进行爬虫项目练习是会遇到语句中有%d,%s,%f的情况,这就是python字符串格式化输出.基本用法是将一个"值"插入到有字符串格式符%d,%s,%f的字符串中. 比如下面代码: ...
- (转)Python 字符串格式化 str.format 简介
原文:https://www.cnblogs.com/wilber2013/p/4641616.html http://blog.konghy.cn/2016/11/25/python-str-for ...
- python格式化字符串_Python字符串格式化问题:%、format()与f-strings
本文为译文,原文 by Joanna Jablonski,地址:https://realpython.com/python-f-strings/ Python 3.6 引入了新的字符串格式化方式 f- ...
- python字符串format方法参数解释,一文秒懂!Python字符串格式化之format方法详解
一文秒懂!Python字符串格式化之format方法详解 一文秒懂!Python字符串格式化之format方法详解 format是字符串内嵌的一个方法,用于格式化字符串.以大括号{}来标明被替换的字符 ...
- Python字符串格式化,%和format函数
Python字符串格式化 格式化的操作有两种 一.使用%,常用的格式化 格式 描述 %s 字符串 %d 有符号整数(十进制) %f 浮点数 %O 转换为带符号的八进制形式的整数 %X 转换为带符号的十 ...
最新文章
- keyshot渲染图文教程_KeyShot渲染基础教程,教你五个步骤实现焦散线效果
- python3 线程_threading模块
- mysql内连接简写_技术分享 | MySQL 的 join_buffer_size 在内连接上的应用
- webService学习8:wsdl文档解释
- struts2中各版本jar包需求及配置设置
- vuex保存用户信息_Vuex状态管理
- 对Lucene PhraseQuery的slop的理解
- Keras版的GCN代码学习
- AngularJS 1.x系列:AngularJS控制器(3)
- 使用云打码识别验证码
- JFrame+JButton简单使用(菜鸟入门)——JAVA
- html如何添加竖虚线,在word中添加竖虚线的方法
- 区块链开发者平台-u deserved it
- ​​【接口篇 / Wan】(7.0) ❀ 01. 配置 ADSL 拨号上网 ❀ FortiGate 防火墙
- R | failed to load cairo DLL
- 大数据中一些常用软件
- 视频人体动作捕捉技术
- 红旗Linux桌面操作系统V11社区预览版系统安装
- lij IDEA快速编写代码
- [VulnHub靶机]Lampiao_脏牛提权
热门文章