韩梅梅学python之一:python3中f-string 格式化固定宽度的数字

895 阅读7分钟

书接上回

看到工程师李雷能用一行命令,更新flutter工程下所有图标

韩梅梅深刻的体会到,这(zhe)门(ge)语(nan)言(ren)如此优秀,一定不能错过。

于是找到李雷:

韩梅梅:“李雷,上次见到你用python更新图标,感觉好棒啊”
李雷:“Python确实是很好用的”
韩梅梅:“我能学会吗”
李雷:“有我在,怎么可能学不会呢?我们先从最简单的Hello world开始吧”
......

如切如磋,如琢如磨

经过一通折腾,韩梅梅望着屏幕有些不满

第1次 Hello world
第2次 Hello world
...
第8次 Hello world
第9次 Hello world
第10次 Hello world
第11次 Hello world
第12次 Hello world

韩梅梅:“怎么不齐呢,好心塞”
李雷:“别担心,刚才我们用的f-string,它提供了固定宽度的格式化方法,只要在需要固定宽度的变量后面加上冒号和代表宽度数字就可以了。”

修改前

def without_fix(base_index):
    i = 0
    while i < ROW_COUNT:
        print(f'第{base_index+i}次 Hello world')
        i += 1

修改后

def with_fix2(base_index):
    i = 0
    while i < ROW_COUNT:
        print(f'第{base_index+i:2}次 Hello world with_fix2({base_index})')
        i += 1

运行结果:

...
第 8次 Hello world with_fix2(8)
第 9次 Hello world with_fix2(8)
第10次 Hello world with_fix2(8)
第11次 Hello world with_fix2(8)
第12次 Hello world with_fix2(8)
第13次 Hello world with_fix2(8)
...

韩梅梅:“这个 ‘第 8次’里面8前面空了个位置,8又不能居中,好心塞”

百尺竿头 更进一步

韩大设计师的心,真的是,很容易塞啊。

不过,这难不倒李雷,经过一番努力终于满足了韩梅梅。

第08次 Hello world with_fix02(8)
第09次 Hello world with_fix02(8)
第10次 Hello world with_fix02(8)
第11次 Hello world with_fix02(8)
第12次 Hello world with_fix02(8)
第13次 Hello world with_fix02(8)

韩梅梅:“舒服,雷哥好棒,你是怎么做到的”
李雷:“你看看我改的地方就明白了,第{base_index+i:02}次里面的0代表用0填充空位。”

print(f'第{base_index+i:02}次 Hello world with_fix02({base_index})')

乘胜追击 穷追猛打

其实我们还可以做的更好。让python自己判断最大宽度是多大。


def with_auto_fix(base_index):
    MAX_NUM = base_index+ROW_COUNT
    MAX_WIDTH = len(f"{MAX_NUM}")
    i = 0
    while i < ROW_COUNT:
        print(f'第{base_index+i:0{MAX_WIDTH}}次 Hello world with_auto_fix({base_index})')
        i += 1

没错,f-string 里的宽度可以用变量替代 多亏平时学的扎实,凭借对之前看过的f-string官方文档的记忆,

李雷又为韩梅梅展示了f-string 固定宽度的进阶用法

def fix_float():
    percent = .01987654321
    print(f"{percent:010.3%}\t-浮点数-保留3位小数位百分比,固定宽度10")
    print(f"{percent:010.3f}\t-浮点数-固定宽度10,保留3位小数")
    print(f"{percent:010.5f}\t-浮点数-固定宽度10,保留5位小数")
    print(f"{1.1:010.5f}\t-浮点数-固定宽度10,保留5位小数")

看到各种输出都能变得干净整齐,韩梅梅终于心情舒畅了。

00001.988%      -浮点数-保留3位小数位百分比,固定宽度10
000000.020      -浮点数-固定宽度10,保留3位小数
0000.01988      -浮点数-固定宽度10,保留5位小数
0001.10000      -浮点数-固定宽度10,保留5位小数

韩梅梅:“雷哥,我想平时在家也能练习python,可是我家里的电脑没有安装python”
李雷:“要不我周末去帮你装一下?”
...

且不提李雷和韩梅梅下面做了什么,我们回顾一下完整代码:

#!/usr/bin/env python3

ROW_COUNT = 6


def without_fix(base_index):
    # 宽度不固定
    i = 0
    while i < ROW_COUNT:
        print(f'第{base_index+i}次 Hello world')
        i += 1


def with_fix2(base_index):
    # 固定宽度2
    i = 0
    while i < ROW_COUNT:
        print(f'第{base_index+i:2}次 Hello world with_fix2({base_index})')
        i += 1


def with_fix02(base_index):
    # 固定宽度2,前面不足的话补0
    i = 0
    while i < ROW_COUNT:
        print(f'第{base_index+i:02}次 Hello world with_fix02({base_index})')
        i += 1


def with_auto_fix(base_index):
    # 自动判断宽度
    max_num = base_index+ROW_COUNT
    max_width = len(f"{max_num}")
    i = 0
    while i < ROW_COUNT:
        print(
            f'第{base_index+i:0{max_width}}次 Hello world with_auto_fix({base_index})'
        )
        i += 1


def fix_fmts():
    # 汇总
    number = 123
    print(f"{number:10}\t-整数,固定宽度10")
    print(f"{number:010}\t-整数,固定宽度10,前面不足补0")
    percent = .01987654321
    print(f"{percent:10.3%}\t-浮点数-保留3位小数位百分比,固定宽度10")
    print(f"{percent:010.3%}\t-浮点数-保留3位小数位百分比,固定宽度10,前面不足补0")
    print(f"{percent:10.3f}\t-浮点数-固定宽度10,保留3位小数")
    print(f"{percent:010.3f}\t-浮点数-固定宽度10,保留3位小数,前面不足补0")
    print(f"{percent:10.5f}\t-浮点数-固定宽度10,保留5位小数")
    print(f"{percent:010.5f}\t-浮点数-固定宽度10,保留5位小数,前面不足补0")
    print(f"{1.1:10.5f}\t-浮点数-固定宽度10,保留5位小数")
 
    width = 10
    print(f"{1.1:0{width}.5f}\t-浮点数-通过变量指定宽度10,保留5位小数,前面不足补0")



if __name__ == "__main__":
    print('====================')
    print('--  without_fix(8) --')
    without_fix(8)
    print('--  without_fix(98) --')
    without_fix(98)
    print('-- with_fix2(8) --')
    with_fix2(8)
    print('-- with_fix2(98) --')
    with_fix2(98)
    print('-- with_fix02(8) --')
    with_fix02(8)
    print('--  with_fix02(98) --')
    with_fix02(98)
    print('-- with_auto_fix(8) --')
    with_auto_fix(8)
    print('--  with_auto_fix(98) --')
    with_auto_fix(98)
    print('--  fix_fmts() --')
    fix_fmts()
    print('===============')

全部故事:

韩梅梅学python之序章:一行命令,更新flutter工程下所有图标

李雷经过一个月的奋战,终于完成了一个flutter应用的开发。
打算上线了才发现,图标还是flutter自带的图标呢,赶紧向设计师韩梅梅求救。
设计师韩梅梅拿出准备已久的Logo丢给李雷,李雷傻眼了。
李雷:“怎么只有一个?”
韩梅梅:“难道安卓和iOS要用不同的图标?”
李雷:“不是啊。同样的图标不同的尺寸。
      安卓图标五六个 ,iOS图标十几个吧。
      我给你列个列表吧,尺寸都告诉你。你帮忙resize一下吧。”
韩梅梅:”宝宝心里苦...“
李雷:“嗯,我想想办法吧...”

韩梅梅学python之一:python3中f-string 格式化固定宽度的数字

书接上回
看到工程师李雷能用一行命令,更新flutter工程下所有图标,
韩梅梅深刻的体会到,这(zhe)门(ge)语(nan)言(ren)如此优秀,一定不能错过。
于是找到李雷:
韩梅梅:“李雷,上次见到你用python更新图标,感觉好棒啊”
李雷:“Python确实是很好用的”
韩梅梅:“我能学会吗”
李雷:“有我在,怎么可能学不会呢?我们先从最简单的Hello world开始吧”
......

韩梅梅学python之二:黄金分割和五角星

学完python3中f-string 格式化固定宽度的数字,
李雷如约上门安装安装python,折腾了很大一通李雷和韩梅梅都感觉很累。
于是李雷提议到公园玩耍,他提前做足了功课,
学习了很多拍照到知识,终于用上了,尤其是构图比例,一律黄金分割。 ...

韩梅梅学Python之三:斐波那契

经过上次的授课经历,李雷发觉,韩梅梅对图形绘制这块很感兴趣。
于是绞尽脑汁,谷歌百度,寻找各种素材。经过反复实验终于完成了备课工作。
于是乎掰着手指头,从周一盼到了周六。
“梅梅,我们先看一个神奇的公式,以及如何用python实现它”

韩梅梅学Python之四:一行命令,图片全灰

2020年4月4日,一大早,老板急冲冲的打电话给韩梅梅。

李老板:“全国网站都灰了,为啥我们自己的网站还这么鲜艳。”

韩梅梅:“好多图改不过来。”

李老板:“本来你应该提前准备的。结果搞成现在这么被动。 我们是创业公司,每个员工都应该是创业者。 作为一个合格的创业者,要有远见,有自驱, 不要什么都不考虑,不要什么都等安排。

如果你觉得自己不想当创业者,那就去找份大厂的工作。 如果你是个创业者,就拿出创业者的劲头加个班搞定吧。”

还没等韩梅梅回答,电话就被挂断了。