一、什么是格式化输出

代码执行过程事实上是纯粹的计算机行为,全过程对人而言实际都是不可见的,但是为了保持对代码程序执行过程的监控和跟踪,在很多情况下我们需要通过print()函数结合各种变量、索引、下标等输出便于监控代码执行过程的提示性信息,因此在介绍后续内容之前,我们先来重点学习一下格式化输出——事实上在前一节我们已经有了一个初步了解:
让我们回顾一下这个例子:

  1. shenji_dept_01 = ["张一","李二","王三","赵四"]
  2. print(list(enumerate(shenji_dept_01)))
  3. # 列表遍历举例2
  4. for index, name in enumerate(shenji_dept_01):
  5. print('当前第%s个元素是:' % str(index))
  6. print(name)

在这个例子中,为了正确显示“当前是第X个元素”这一信息,我们在print()函数中,使用%s来表示下标,并在当前语句后段给了其实际变量的名称,这就是格式化输出。
事实上格式化输出因为引用变量的数据类型、其他语言惯用风格不同等原因,会有3种主流写法:

  1. f-string格式化
  2. format格式化
  3. %占位符

    二、格式化输出的三种主流方式

    让我们来尝试输出这样的内容: ```python “”” 要求:根据下面的信息一次性输出name和age 如:我的名字是小虎,我今年17岁了。 “”” name = ‘小虎’ # 文本类型 age = 17 # 数字类型
  1. <a name="QX4BC"></a>
  2. ## 1、f-String格式——高效简洁易懂灵活优雅最推荐
  3. > **注意:f-String格式自python3.6版本之后才有**
  4. <a name="huLWo"></a>
  5. ### (1)基础使用
  6. ```python
  7. """
  8. 要求:根据下面的信息一次性输出name和age
  9. 如:我的名字是小虎,我今年17岁了。
  10. """
  11. name = '小虎' # 文本类型
  12. age = 17 # 数字类型
  13. print(f'我的名字是{name},我今年{age}岁了')
  14. print(f'我的名字是{name},我今年{age*2}岁了')

(2)处理浮点数

再比如对浮点数的处理——后续我们可能会经常用到:

  1. b = 345.141592654
  2. print(f'{b:.2f}')
  3. print(f'{b:.0f}')
  4. print(f'{b:.5f}')

(3)少敲一遍变量名

  1. # 少敲一遍变量名
  2. my_dept = "duit_dept_02"
  3. print(f"{ my_dept = }")

(4)字符串对齐与补全

  1. # 字符串对齐与补全
  2. order = '9527'
  3. # 长度补足6位,不够的用0
  4. print(f'补全后的文字显示如【{order:0>6}】所示') # 右边对齐+左边用0补足
  5. print(f'补全后的文字显示如【{order:<8}】所示') # 左边对齐+右边用空格补足
  6. print(f'补全后的文字显示如【{order:0^10}】所示') # 中间对齐+两边用0补足
  7. print(f'补全后的文字显示如【{order:-^10}】所示') # 中间对齐+两边用-补足

2、format()方法

format()方法的主要思想是:在需要格式化输出的地方用{}占位,在引号结束后以.format(变量1,变量2,...,变量x)来分别列示此前涉及到的变量引用。

  1. """
  2. 要求:根据下面的信息一次性输出name和age
  3. 如:我的名字是小虎,我今年17岁了。
  4. """
  5. name = '小虎' # 文本类型
  6. age = 17 # 数字类型
  7. print('我的名字是{},我今年{}岁了'.format(name, age))
  8. print('我的名字是{},我今年{}岁了'.format(name, age*2))

在没有参数序号时:参数是按顺序使用的
在存在参数序号时:可以通过format()参数的序号指定参数的使用,参数从0开始编号(此处与索引编号规律一致),测试如下:

  1. name = '小虎' # 文本类型
  2. age = 17 # 数字类型
  3. print('我的名字是{},我今年{}岁了'.format(name, age))
  4. print('我的名字是{1},我今年{0}岁了'.format(age, name))
  5. # 上文2条print语句输出的结果是一致的

f-String的对齐与补全方式对format()同样适用:

  1. name = '小虎' # 文本类型
  2. age = 17 # 数字类型
  3. # 正常打印
  4. print('我的名字是{},我今年{}岁了'.format(name, age))
  5. # 假设人类的岁数是3位数:
  6. print('我的名字是{},我今年{:0>3}岁了'.format(name, age))

3、%占位符

根据python官方文档的描述:

String objects have one unique built-in operation: the % operator (modulo). This is also known as the string formatting or interpolation operator. Given format % values (where format is a string), % conversion specifications in format are replaced with zero or more elements of values. The effect is similar to using the sprintf() in the C language.

%占位符写法带有浓厚的C语言风格,其主要用法为:

  1. name = '小虎' # 文本类型
  2. age = 17 # 数字类型
  3. print('我的姓名是【%s】,我的年龄是【%d】。' % (name, age))

%后面的字母代表不同数据类型的变量引用,常见用法如下:

Conversion type 说明
s 字符串(使用str()方法转换任何Python对象)
d 十进制整数
f 十进制浮点数(小数), 自动保留六位小数。

完整的用法摘录:

Conversion Meaning
‘d’ Signed integer decimal.
‘i’ Signed integer decimal.
‘o’ Signed octal value.
‘u’ Obsolete type – it is identical to ‘d’.
‘x’ Signed hexadecimal (lowercase).
‘X’ Signed hexadecimal (uppercase).
‘e’ Floating point exponential format (lowercase).
‘E’ Floating point exponential format (uppercase).
‘f’ Floating point decimal format.
‘F’ Floating point decimal format.
‘g’ Floating point format. Uses lowercase exponential format if exponent is less than -4 or not less than precision, decimal format otherwise.
‘G’ Floating point format. Uses uppercase exponential format if exponent is less than -4 or not less than precision, decimal format otherwise.
‘c’ Single character (accepts integer or single character string).
‘r’ String (converts any Python object using repr()).
‘s’ String (converts any Python object using str()).
‘a’ String (converts any Python object using ascii()).
‘%’ No argument is converted, results in a ‘%’ character in the result.

进一步了解见: https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting

4、完全不推荐的方式4

  1. name = '小虎' # 文本类型
  2. age = 17 # 数字类型
  3. print("我的名字是" + name + ",我今年" + str(age) + "岁了")

这种写法笨重繁琐,就像明明可以坐地铁偏偏因为不会也不愿意办公交卡只能步行下班回家——完全不推荐。

三、格式化字符方式的选择

f-String,毋庸置疑,比**format()**更直观,比**%**更简洁优雅。