Python3.6新的字符串格式化语法

论坛 期权论坛 期权     
AI悦创   2019-7-20 09:56   3326   0
Python提倡用一种,而且最好是只有一种方法来完成一件事。可是在字符串格式化方面Python好像没有做到这一点。除了基本的
  1. %-formatting
复制代码
格式,还有
  1. str.format()
复制代码
格式、以及
  1. string.Template
复制代码
。根据对Python标准库的统计,目前
  1. string.Template
复制代码
的使用屈指可数,
  1. str.format()
复制代码
获得广泛使用,但是我们来与其他几种语言的字符串格式化对比一下:
已知
  1. name = 'Tom'
复制代码
,我们如何打印出字符串
  1. 'My name is Tom.'
复制代码

Ruby:
  1. puts 'My name is #{name}.'
复制代码
JavaScript(ECMAScript 2015):
  1. console.log(`My name is ${name}.`)
复制代码
Python:
  1. print('My name is {name}.'.format(name = name))
复制代码
  1. [/code][code]# 即便是简化的版本
复制代码
  1. print('My name is {}.'.format(name))
复制代码
可以看出Python明显还不够简洁,于是,随着Python3.6版本在上周正式发布,Python又提供了一种字符串格式化语法——'f-strings'。
[h1]f-strings[/h1]要使用f-strings,只需在字符串前加上
  1. f
复制代码
,语法格式如下:
  1. f '  {    }  ... '
复制代码
[h2]基本用法[/h2]
  1. >>> name = "Tom"
复制代码
  1. >>> age = 3
复制代码
  1. >>> f"His name is {name}, he's {age} years old."
复制代码
  1. >>> "His name is Tom, he's 3 years old."
复制代码
  1. [/code]
  2. [h2]支持表达式[/h2][list][*][*][*][*][*][*][*][*][*][*][*][/list][code]# 数学运算
复制代码
  1. >>> f'He will be { age+1 } years old next year.'
复制代码
  1. >>> 'He will be 4 years old next year.'
复制代码
  1. [/code][code]# 对象操作
复制代码
  1. >>> spurs = {"Guard": "Parker", "Forward": "Duncan"}
复制代码
  1. >>> f"The {len(spurs)} players are: {spurs['Guard']} the guard, and {spurs['Forward']} the forward."
复制代码
  1. >>> 'The 2 players are: Parker the guard, and Duncan the forward.'
复制代码
  1. [/code][code]>>> f'Numbers from 1-10 are {[_ for _ in range(1, 11)]}'
复制代码
  1. >>> 'Numbers from 1-10 are [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]'
复制代码
[h2]排版格式[/h2]
  1. >>> def show_players():
复制代码
  1.     print(f"{'Position':^10}{'Name':^10}")
复制代码
  1.     for player in spurs:
复制代码
  1.         print(f"{player:^10}{spurs[player]:^10}")
复制代码
  1. >>> show_players()
复制代码
  1. Position    Name   
复制代码
  1.   Guard     Parker  
复制代码
  1. Forward    Duncan
复制代码
[h2]数字操作[/h2]
  1. # 小数精度
复制代码
  1. >>> PI = 3.141592653
复制代码
  1. >>> f"Pi is {PI:.2f}"
复制代码
  1. >>> 'Pi is 3.14'
复制代码
  1. [/code][code]# 进制转换
复制代码
  1. >>> f'int: 31, hex: {31:x}, oct: {31:o}'
复制代码
  1. 'int: 31, hex: 1f, oct: 37'
复制代码
[h2]与原始字符串联合使用[/h2]
  1. >>> fr'hello\nworld'
复制代码
  1. 'hello\\nworld'
复制代码
[h1]注意事项[/h1][h2]
  1. {}
复制代码
内不能包含反斜杠
  1. \
复制代码
[/h2]
  1. f'His name is {\'Tom\'}'
复制代码
  1. SyntaxError: f-string expression part cannot include a backslash
复制代码
  1. [/code][code]# 而应该使用不同的引号,或使用三引号。
复制代码
  1. >>> f"His name is {'Tom'}"
复制代码
  1. 'His name is Tom'
复制代码
[h2]不能与
  1. 'u'
复制代码
联合使用[/h2]
  1. 'u'
复制代码
是为了与Python2.7兼容的,而Python2.7不会支持f-strings,因此与
  1. 'u'
复制代码
联合使用不会有任何效果。
[h2]如何插入大括号?[/h2]
  1. >>> f"{{ {10 * 8} }}"
复制代码
  1. '{ 80 }'
复制代码
  1. >>> f"{{ 10 * 8 }}"
复制代码
  1. '{ 10 * 8 }'
复制代码
[h2]与
  1. str.format()
复制代码
的一点不同[/h2]使用
  1. str.format()
复制代码
,非数字索引将自动转化为字符串,而f-strings则不会。
  1. >>> "Guard is {spurs[Guard]}".format(spurs=spurs)
复制代码
  1. 'Guard is Parker'
复制代码
  1. [/code][code]>>> f"Guard is {spurs[Guard]}"
复制代码
  1. Traceback (most recent call last):
复制代码
  1.   File "", line 1, in
复制代码
  1.     f"Guard is {spurs[Guard]}"
复制代码
  1. NameError: name 'Guard' is not defined
复制代码
  1. [/code][code]>>> f"Guard is {spurs['Guard']}"
复制代码
  1. 'Guard is Parker'
复制代码
最后一个栗子:
  1. import time
复制代码
  1. t0 = time.time()
复制代码
  1. time.sleep(1)
复制代码
  1. name = 'processing'
复制代码
  1. [/code][code]# 以 f开头表示在字符串内支持大括号内的python 表达式
复制代码
  1. print(f'{name} done in {time.time() - t0:.2f} s')
复制代码
  1. [/code][code]# 输出:
复制代码
  1. # processing done in 1.00 s
复制代码
[code][/code]



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP