乐趣区

关于人工智能:翻译实用的Python编程0203Formatting

目录 | 上一节 (2.2 容器) | [下一节 (2.4 序列)]()

2.3 格式化

尽管本节略微有点切题,然而当解决数据时,通常想要生成结构化的输入(如表格)。示例:

      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 integer
b       Binary integer
x       Hexadecimal integer
f       Float as [-]m.dddddd
e       Float as [-]m.dddddde+-xx
g       Float, but selective use of E notation
s       String
c       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

目录 | 上一节 (2.2 容器) | [下一节 (2.4 序列)]()
注:残缺翻译见 https://github.com/codists/practical-python-zh

退出移动版