Python字符串格式化方法2

在之前的一篇文章中,我们介绍了Python中最经典的两种格式化方法,类C语言格式化和format方法格式化,文章链接是<<Python字符串格式化方法1>>,这两种格式化方法也是目前使用的比较多的两种,下面我们来介绍Python 3.6中引入的一种新格式化方法f-string格式化方法。
f-string格式化是从Python3.6引入的新格式化方法,这种新的格式化方法,支持的功能更为强大。官方的说法是,它不再是一个字符串,而是一个动态表达式。最终的字符串是从表达式的结果中得到的。官方推荐在3.6以后版本中使用这种形式的格式化方法,我们来看一下,它的功能强大在哪里。
我们来看一下这种f-string格式化的用法。还是老规矩,先看简单的基本用法,格式是:

f"{name} {age}"
F"{expression | function()}"

基本格式是,字符串前面加上f或F前缀,字符串里使用大括号来表明变量的位置,大括号内可以直接写以下类型:
常量,例如字符串、数字、列表、字典等基本数据结构

  • 变量名
  • 表达式
  • 函数

我们来看一下基本格式的常用示例:

# 输出常量和变量
>>> name = 'afei'
>>> age = 30
>>> f"My name is {name}, age is {30}"
'My name is afei, age is 30'
>>> f"My name is {'afei'}, age is {age}"
'My name is afei, age is 30'

# 输出变量
>>> f"My name is {name}, age is {age}"
'My name is afei, age is 30'

# 输出表达式结果
>>> f"My name is {name}, next year my age is {age+1}"
'My name is afei, next year my age is 31'

>>> f"My title is {name+' coach'}, next year my age is {age+1}"
'My title is afei coach, next year my age is 31'

# 输出函数返回值
>>> def add(x,y):
...     return x+y
... 
>>> f"My title is {name+' coach'}, next year my age is {add(age, 1)}"
'My title is afei coach, next year my age is 31'

这里需要注意的问题是有以下几点:

  • 在大括号中放入常量的时候,比如字符串,需要注意字符串的引号不要和格式化字符串的引号冲突,例如格式化字符串外面用的是双引号,那么内部使用单引号。外面使用单引号,内部使用双引号。内部同时存在单双引号时,外部使用三引号('''或""")
  • 大括号内部不能使用转义字符,否则会报错。
  • 因为大括号在格式化中有特殊含义,因此要在字符串中输出大括号的话,必须使用两个大括号
  • 使用匿名函数的时候,需要将匿名函数用括号括起
    看几个示例:
# 字符串引号的问题
>>> f'''{"I'm very happy your are interested in python"}'''
"I'm very happy your are interested in python"

# 转义字符问题,先在外面定义带转义字符的字符串,再格式化输出没有问题。
>>> str = 'I\'m happy your interested in python'
>>> str
"I'm happy your interested in python"
>>> 
>>> f'''{str}'''
"I'm happy your interested in python"

# 直接在格式化字符串内部添加转义字符,会报错,会提示你不能包含转义字符
>>> f'''{'I\'m happy your interested in python'}'''
  File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash

# 输出大括号
>>> f"I want to ouput braces {{}}"
'I want to ouput braces {}'

# 匿名函数
>>> f'Next year my age is {(lambda x: x+1)(age)}'
'Next year my age is 31'

和上面两种格式化方法一样,f-string格式化也提供高级用法,用于定制字符串的输出格式,高级用法的格式是:
{content:format}
这里的content就是上面说的,能够填入大括号内的内容,而format则是和上一篇文章里的format格式化方法里的类型一样,也就是说,你学会了format格式化,f-string格式化的高级用法你也会了。我们来看几个高级用法的示例,把上format格式化方法的示例改造成f-string格式化方法

# 演示conversion用法,-号填充,居中对齐,输出宽度20,
>>> class Demo:
...     def __str__(self):
...             return 'str format'
...     def __repr__(self):
...             return 'REPR FORMAT'
... 
>>> demo = Demo()

# 对象str格式化 
>>> f'{demo!s:-^20}'
'-----str format-----'

# 对象repr格式化
>>> f'{demo!r:-^20}'
'----REPR FORMAT-----'

# 左对齐
>>> f'{demo!s:-<20}'
'str format----------'

# 右对齐
>>> f'{demo!s:->20}'
'----------str format'

# 0填充
>>> f'{demo!s:0<20}'
'str format0000000000'

# 数字对齐,
>>> f'{-0.123!s:0<15}'
'-0.123000000000'

# 不再支持等号用于数字对齐,会直接报错,可能是觉得没什么意义。
>>> f'{-0.123!s:0=15}'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: '=' alignment not allowed in string format specifier

# 正负数符号示例,这个时候不要和对齐方式混用,会报错。
>>> f'{-0.123:-f}; {0.123:f}'
'-0.123000; 0.123000'

>>> f'{-0.123:-f}; {0.123:+f}'
'-0.123000; +0.123000'

>>> f'{-0.123:-f}; {0.123: f}'
'-0.123000;  0.123000'

# 逗号和下划线分隔符
>>> f'{1234.56789:<40,.5}'
'1,234.6                                 '

>>> f'{1234.56789:<40_.5}'
'1_234.6                                 '

# 有效数字位数
>>> f'{-0.123:.3f} {0.123:.4f}'
'-0.123 0.1230'

# 二进制、八进制和十六进制输出,不带#号
>>> f"{100} 的二进制值是{100:b}"
'100 的二进制值是1100100'

>>> f"{100} 的八进制值是{100:o}"
'100 的八进制值是144'

>>> f"{100} 的十六进制值是{100:x}"
'100 的十六进制值是64'

# 二进制、八进制和十六进制输出,带#号
>>> f"{100} 的二进制值是{100:#b}"
'100 的二进制值是0b1100100'

>>> f"{100} 的二进制值是{100:#o}"
'100 的二进制值是0o144'

>>> f"{100} 的二进制值是{100:#x}"
'100 的二进制值是0x64'

以上就是f-string格式化的高级用法

f-string支持直接输出datetime格式

除了上面讲到的能力,f-string还支持和datetime模块组合使用,datetime模块我们知道,是用来输出不同的时间格式的。它也提供了各种格式化字符,用于输出不同的日期格式,例如常用的:

  • %Y 输出4位数的年份
  • %m 输出2位数的月份
  • %d 输出2位数的日期

当我们使用日期字符串的时候,一般都是先将datetime日期字符串格式拼出来,然后再和其他字符串组合。但是在上面我们讲到f-string是支持在字符串里面嵌入表达式的,而datetime的这些特殊符号,也可以视为表达式的一种,因此也可以直接嵌入到f-string字符串当中。直接动态输出不同格式的日期,我们看几个应用的示例

import datetime
birthday = datetime.datetime(1990, 8, 1)

# 标准输出格式
print(birthday)
1990-08-01 00:00:00

# 格式化后输出
print(f"{birthday:%Y-%m-%d}")
1990-08-01

# 带星期格式
print(f"{birthday:%Y-%m-%d, %A}")
1990-08-01, Wednesday

相比之前,先把日期格式定义好,再做字符串拼接或者嵌套的方式,这种格式化使用起来无疑更加灵活。小伙伴们不妨在自己的机器上尝试一下。以上就是f-string字符串格式化方法的内容。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 简介 f-string,亦称为格式化字符串常量(formatted string literals),是Pytho...
    sunxb10阅读 342评论 0 0
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,362评论 0 5
  • 基于《Python语言程序设计基础(第2版)》 第一部分 初识Python语言 第1章 程序设计基本方法 1.1 ...
    柄志阅读 27,311评论 4 44
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,442评论 0 13
  • 今天是出门的第四天,行程是早起看日出,看阳光洒满郎木寺金顶,自愿前往天葬台观天葬,之后回酒店吃早饭;饭后赴阿万仓湿...
    简叔老魏阅读 1,063评论 0 51