Name Shares Price---------- ---------- ----------- AA 100 32.20 IBM 50 91.10 CAT 150 83.44 MSFT 200 51.23 GE 95 40.37 MSFT 50 65.10 IBM 100 70.44
字符串格式化
在 Python 3.6+ 中,格式化字符串的一种方法是利用 f-strings:
>>> name = 'IBM'>>> shares = 100>>> price = 91.1>>> f'{name:>10s} {shares:>10d} {price:>10.2f}'' IBM 100 91.10'>>>
{expression:format} 部分会被取代。
f-strings 常日和 print() 函数一起利用:

print(f'{name:>10s} {shares:>10d} {price:>10.2f}')
格式码
格式码(在 {} 内 : 之后)与 C 措辞的 printf() 函数类似。常见格式码包括:
d Decimal integerb Binary integerx Hexadecimal integerf Float as [-]m.dddddde Float as [-]m.dddddde+-xxg Float, but selective use of E notations Stringc Character (from integer)
常见的润色符可调度字段宽度和数的精度。这是部分内容:
:>10d Integer right aligned in 10-character field:<10d Integer left aligned in 10-character field:^10d Integer centered in 10-character field:0.2f Float with 2 digit precision
字典格式化
可以利用字符串的 format_map() 方法将字符串格式化运用于值的字典:
>>> s = { 'name': 'IBM', 'shares': 100, 'price': 91.1}>>> '{name:>10s} {shares:10d} {price:10.2f}'.format_map(s)' IBM 100 91.10'>>>
虽然 format_map() 和 f-strings 利用相同的格式码,但是是从供应的字典中获取值。
format()方法有一个 format() 方法可以将格式化运用于参数或者关键字参数:
>>> '{name:>10s} {shares:10d} {price:10.2f}'.format(name='IBM', shares=100, price=91.1)' IBM 100 91.10'>>> '{:10s} {:10d} {:10.2f}'.format('IBM', 100, 91.1)' IBM 100 91.10'>>>
坦白说,format() 方法轻微有点冗长,我更方向于利用 f-strings。
C 风格的格式化也可以利用格式化操作符 % :
>>> 'The value is %d' % 3'The value is 3'>>> '%5d %-5d %10d' % (3,4,5)' 3 4 5'>>> '%0.2f' % (3.1415926,)'3.14'
这哀求右边是一个单项或者元组,格式码也是模拟 C 措辞 printf() 函数的。
把稳:这是字节字符串上唯一可用的格式化方法。
>>> b'%s has %n messages' % (b'Dave', 37)b'Dave has 37 messages'>>>
练习练习 2.8:如何格式化数字
打印数字常见的一个问题便是指天命字的小数位数。个中的一种办理方法便是利用 f-strings。请考试测验以下示例:
>>> value = 42863.1>>> print(value)42863.1>>> print(f'{value:0.4f}')42863.1000>>> print(f'{value:>16.2f}') 42863.10>>> print(f'{value:<16.2f}')42863.10>>> print(f'{value:>16,.2f}')42,863.10>>>
有关 f-strings 利用的格式码的完全文档在 这里 可以找到。有时,也利用字符串操作符 % 实行格式化。
>>> print('%0.4f' % value)42863.1000>>> print('%16.2f' % value) 42863.10>>>
与操作符 % 利用的各种格式码有关的文档可以在 这里 找到。只管它常日与 print() 函数一起利用,但是字符串格式化与打印无关。如果要保存格式化的字符串,把它赋值给变量即可。
>>> f = '%0.4f' % value>>> f'42863.1000'>>>
练习 2.9:网络数据
在练习 2.7 中,编写了一个用于打算股票投资盈亏的程序 report.py。在本练习中,须要修正这个程序来天生如下表格:
Name Shares Price Change---------- ---------- ---------- ---------- AA 100 9.22 -22.98 IBM 50 106.28 15.18 CAT 150 35.46 -47.98 MSFT 200 20.89 -30.34 GE 95 13.48 -26.89 MSFT 50 20.89 -44.21 IBM 100 106.28 35.84
在此表格中,"Price" 是当前股价,"Change" 是当前股价与原始购买股价的差。
为了天生上述表格,首先须要网络表中展示的所有数据。编写 make_report() 函数,以股票列表和价格字典作为输入,并返回一个包含上表中所有行的元组列表。
把 make_report() 函数添加到 report.py 文件中。如果交互式地实行该函数,则该当按以下步骤进行:
>>> portfolio = read_portfolio('Data/portfolio.csv')>>> prices = read_prices('Data/prices.csv')>>> report = make_report(portfolio, prices)>>> for r in report: print(r)('AA', 100, 9.22, -22.980000000000004)('IBM', 50, 106.28, 15.180000000000007)('CAT', 150, 35.46, -47.98)('MSFT', 200, 20.89, -30.339999999999996)('GE', 95, 13.48, -26.889999999999997)...>>>
练习 2.10:打印格式化的表格
重做练习 2.9 中的 for 循环,但是请变动打印语句以格式化元祖。
>>> for r in report: print('%10s %10d %10.2f %10.2f' % r) AA 100 9.22 -22.98 IBM 50 106.28 15.18 CAT 150 35.46 -47.98 MSFT 200 20.89 -30.34...>>>
也可以利用 f-strings 扩展值。例如:
>>> for name, shares, price, change in report: print(f'{name:>10s} {shares:>10d} {price:>10.2f} {change:>10.2f}') AA 100 9.22 -22.98 IBM 50 106.28 15.18 CAT 150 35.46 -47.98 MSFT 200 20.89 -30.34...>>>
把上面的语句添加到 report.py 程序中,让程序获取make_report() 的输出,并打印如打印如上图所示的格式化的表。
练习 2.11:添加标题假定有一个像下面这样的标题名称元组:
headers = ('Name', 'Shares', 'Price', 'Change')
把上面的标题元组代码添加到程序中,并且创建一个字符串,每个标题向右对齐并且宽度是10,每个字段利用单个空格分隔。
' Name Shares Price Change'
编写在标题和数据之间创建分隔字符串的代码。分隔字符串指每个字段名下的一串下划线("-")字符。例如:
'---------- ---------- ---------- -----------'
当完成后,程序应天生本节顶部所示的表。
Name Shares Price Change---------- ---------- ---------- ---------- AA 100 9.22 -22.98 IBM 50 106.28 15.18 CAT 150 35.46 -47.98 MSFT 200 20.89 -30.34 GE 95 13.48 -26.89 MSFT 50 20.89 -44.21 IBM 100 106.28 35.84
练习 2.12:格式化寻衅
如何修正代码使得价格包括货币符号($),并且像下面这样输出:
Name Shares Price Change---------- ---------- ---------- ---------- AA 100 $9.22 -22.98 IBM 50 $106.28 15.18 CAT 150 $35.46 -47.98 MSFT 200 $20.89 -30.34 GE 95 $13.48 -26.89 MSFT 50 $20.89 -44.21 IBM 100 $106.28 35.84