Python基础 | 格式化输出

Python format 格式化函数

Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。

基本语法是通过 {} 和 : 来代替以前的 % 。

format 函数可以接受不限个参数,位置可以不按顺序。

>>>"{} {}".format("hello", "world")    # 不设置指定位置,按默认顺序
'hello world'
 
>>> "{0} {1}".format("hello", "world")  # 设置指定位置
'hello world'
 
>>> "{1} {0} {1}".format("hello", "world")  # 设置指定位置
'world hello world'

 也可以设置参数:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
print("网站名:{name}, 地址 {url}".format(name="菜鸟教程", url="www.runoob.com"))
 
# 通过字典设置参数
site = {"name": "菜鸟教程", "url": "www.runoob.com"}
print("网站名:{name}, 地址 {url}".format(**site))
 
# 通过列表索引设置参数
my_list = ['菜鸟教程', 'www.runoob.com']
print("网站名:{0[0]}, 地址 {0[1]}".format(my_list))  # "0" 是必须的

 输出结果为:

网站名:菜鸟教程, 地址 www.runoob.com
网站名:菜鸟教程, 地址 www.runoob.com
网站名:菜鸟教程, 地址 www.runoob.com

 也可以向 str.format() 传入对象:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class AssignValue(object):
    def __init__(self, value):
        self.value = value
my_value = AssignValue(6)
print('value 为: {0.value}'.format(my_value))  # "0" 是可选的

 输出结果为:

value 为: 6

数字格式化

下表展示了 str.format() 格式化数字的多种方法:

>>> print("{:.2f}".format(3.1415926));
3.14
数字格式输出描述
3.1415926  {:.2f}  3.14  保留小数点后两位 
3.1415926  {:+.2f}  +3.14  带符号保留小数点后两位 
-1  {:+.2f}  -1.00  带符号保留小数点后两位 
2.71828  {:.0f}  不带小数 
{:0>2d}  05  数字补零 (填充左边, 宽度为2) 
{:x<4d}  5xxx  数字补x (填充右边, 宽度为4) 
10  {:x<4d}  10xx  数字补x (填充右边, 宽度为4) 
1000000  {:,}  1,000,000  以逗号分隔的数字格式 
0.25  {:.2%}  25.00%  百分比格式 
1000000000  {:.2e}  1.00e+09  指数记法 
13  {:>10d}  13 右对齐 (默认, 宽度为10) 
13  {:<10d}  13  左对齐 (宽度为10)
13  {:^10d}  13  中间对齐 (宽度为10) 
11 
'{:b}'.format(11)
'{:d}'.format(11)
'{:o}'.format(11)
'{:x}'.format(11)
'{:#x}'.format(11)
'{:#X}'.format(11)
1011
11
13
b
0xb
0XB
进制

^, <, > 分别是居中、左对齐、右对齐,后面带宽度, : 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。

+ 表示在正数前显示 +,负数前显示 -;  (空格)表示在正数前加空格

b、d、o、x 分别是二进制、十进制、八进制、十六进制。

此外我们可以使用大括号 {} 来转义大括号,如下实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
print ("{} 对应的位置是 {{0}}".format("runoob"))
runoob 对应的位置是 {0}

 % 操作符,格式如下:

%[(name)][flags][width].[precision]typecode
  •  (name) 为命名
  •  flags 可以有 +,-,' '或 0。+ 表示右对齐。- 表示左对齐。' ' 为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0 表示使用 0 填充。
  •  width 表示显示宽度
  •  precision 表示小数点后精度

以下是类型码:

%s    字符串 (采用str()的显示)
%r    字符串 (采用repr()的显示)
%c    单个字符
%b    二进制整数
%d    十进制整数
%i    十进制整数
%o    八进制整数
%x    十六进制整数
%e    指数 (基底写为e)
%E    指数 (基底写为E)
%f    浮点数
%F    浮点数,与上相同%g    指数(e)或浮点数 (根据显示长度)
%G    指数(E)或浮点数 (根据显示长度)
%%    字符"%"

 举例

>>> print("%6.3f" % 2.3)
 2.300
  •  第一个 % 后面的内容为显示的格式说明,6 为显示宽度,3 为小数点位数,f 为浮点数类型 
  •  第二个 % 后面为显示的内容来源,输出结果右对齐,2.300 长度为 5,故前面有一空格 
>>> print("%+10x" % 10)
    +a

x 为表示 16 进制,显示宽度为 10,前面有 8 个空格。

>>>print("%-5x" % -10)
-a  

%-5x 负号为左对齐,显示宽度为 5,故 -a 后面有 3 个空格

>>>pi=3.1415
>>>print ("pi的值是%s"%pi)
pi的值是3.1415

>>>print ("pi的值是%.8f"%pi)
pi的值是3.14150000

上面的 width, precision 为两个整数。我们可以利用 *,来动态代入这两个量。比如:

>>> print("%10.*f" % (4, 1.2))
  1.2000

以下是补充

简单的说,这是一种将其他变量置入字符串特定位置以生成新字符串的操作,比如说:

>>> n = "Runoob"
>>> "My name is %s" % n
'My name is Runoob'

这段代码首先定义了一个名为 n 的变量,内容为 Runoob。然后下方的字符串中有一个 %s,他的含义是“这里将被替换成一个新的字符串”,用作替换的内容放在字符串后面的%后面,就是那个 n。所以最终这个字符串会变成 My name is Runoob。

如果在 str.format() 调用时使用关键字参数,可以通过参数名来引用值:

>>> print('This {food} is {adjective}.'.format(
...       food='spam', adjective='absolutely horrible'))
This spam is absolutely horrible.

位置参数和关键字参数可以随意组合:

>>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', other='Georg')) The story of Bill, Manfred, and Georg.

!a (应用 ascii()), !s (应用 str() )和 !r (应用 repr() )可以在格式化之前转换值:

>>> import math
>>> print('The value of PI is approximately {}.'.format(math.pi))
The value of PI is approximately 3.14159265359.
>>> print('The value of PI is approximately {!r}.'.format(math.pi))
The value of PI is approximately 3.141592653589793.

字段名后允许可选的  : 和格式指令。这允许对值的格式化加以更深入的控制。下例将 Pi 转为三位精度。

>>> import math
>>> print('The value of PI is approximately {0:.3f}.'.format(math.pi))
The value of PI is approximately 3.142.

在字段后的  : 后面加一个整数会限定该字段的最小宽度,这在美化表格时很有用:

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
>>> for name, phone in table.items():
...     print('{0:10} ==> {1:10d}'.format(name, phone))
...
Jack       ==>       4098
Dcab       ==>       7678
Sjoerd     ==>       4127

如果你有个实在是很长的格式化字符串,不想分割它。如果你可以用命名来引用被格式化的变量而不是位置就好了。有个简单的方法,可以传入一个字典,用中括号(  [] )访问它的键:

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
          'Dcab: {0[Dcab]:d}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678

也可以用  ** 标志将这个字典以关键字参数的方式传入:

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678

元组的 format 用法:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

k=("name","mh")
v="名字:{0},name:{1}".format(*k)
print(v)

利用 ''.format() 和 eval() 来实现简单的进制转换:

ii=input('input num:')    #取值
iid=eval(ii)              #变数字

bnum_str='{:b}'.format(iid)    #二进制化(字符串)
bnum=eval(bnum_str)            #字符串转数字(留用)

str_putOut='num in b is:{:b}'.format(iid)    #输出准备


print(bnum,str_putOut)     #显示数字和准备的输出内容

 还可以加入检测输入内容是否为数字或算式的功能、增加用户选择进制转换种类的功能。

原文地址:https://www.cnblogs.com/-saber/p/14278308.html