翻译:《实用的Python编程》02_03_Formatting

codists 2021-02-22 16:01:31
编程 Python 翻译 实用 02_03_formatting


目录 | 上一节 (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

版权声明
本文为[codists]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000039253033

  1. 翻译:《实用的Python编程》02_02_Containers
  2. Python基于粒子群优化的投资组合优化研究
  3. ubuntu部署django项目
  4. 兩年Java,去位元組跳動寫Python和Go
  5. 翻譯:《實用的Python程式設計》02_02_Containers
  6. 这样学习Python,爷爷都学会了!超简单Python入门
  7. [Python] 基于 jieba 的中文分词总结
  8. 【python】递归听了N次也没印象,读完这篇你就懂了
  9. [Python] 基于 jieba 的中文分词总结
  10. 人理解迭代,神则体会递归,从电影艺术到Python代码实现神的逆向思维模式
  11. [Python] 基於 jieba 的中文分詞總結
  12. Python属于后端开发还是前端开发?Python入门!
  13. 【python】递归听了N次也没印象,读完这篇你就懂了
  14. 一天快速入门python
  15. 学习Python对年龄有没有要求?30岁可以吗?
  16. 清华教授!12小时整理的最全Python教程(文末无偿分享)
  17. 使用Python开发DeFi项目
  18. python 函数详解
  19. Python工程师是做什么的?前景如何?
  20. Filecmp -- comparison of files and directories
  21. Python - zip() 函数
  22. 30 周年生日,Python 先驱是怎么评价这门语言的?
  23. Drawing and beautifying skills of [Python] Matplotlib chart
  24. Python + dash rapid web application development static components
  25. Translation: practical Python Programming 02_ 01_ Datatypes
  26. python将excel自适应导入数据库
  27. 从小白到大师,这里有一份Pandas入门指南
  28. [Python] 茎叶图和复合饼图的画法
  29. [Python interface automation] - regular use case parameterization
  30. Translation: practical Python Programming 02_ 02_ Containers
  31. Two years of Java, to write Python and go
  32. Translation: practical Python Programming 02_ 02_ Containers
  33. Two years of Java, to write Python and go
  34. Python-geoplot 空间核密度估计图绘制
  35. Python-seaborn 经济学人经典图表仿制
  36. python空间绘图- regionmask掩膜操作示例
  37. Python 空间绘图 - Cartopy 经纬度添加
  38. Python-pykrige包-克里金(Kriging)插值计算及可视化绘制
  39. Python 批量重采样、掩膜、坡度提取
  40. python - 多种交通方式可达圈分析
  41. Python 空间绘图 - 房价气泡图绘制
  42. Translation: practical Python Programming 02_ 02_ Containers
  43. Research on Portfolio Optimization Based on particle swarm optimization
  44. Ubuntu deploying Django project
  45. Two years of Java, write Python and go without byte beating
  46. Translation: practical Python Programming 02_ 02_ Containers
  47. So learn python, grandfather learned! Introduction to super simple Python
  48. python3 多线程 与 mongo亿级消费日志数据 新鲜demo 【优化第一版】
  49. Summary of Chinese word segmentation based on Jieba
  50. I've heard it n times, but I'm not impressed. After reading this, you'll understand
  51. Summary of Chinese word segmentation based on Jieba
  52. From movie art to Python code to realize God's reverse thinking mode
  53. Summary of Chinese word segmentation based on Jieba
  54. ARIMA模型预测CO2浓度时间序列-python实现
  55. Python belongs to back-end development or front-end development? Introduction to Python!
  56. python isinstance()
  57. I've heard it n times, but I'm not impressed. After reading this, you'll understand
  58. This article will familiarize you with the transformation process of Python - & gt; cafe - & gt; om model
  59. 如何用Python一键修改上万个文件名
  60. One day quick start to Python