Skip to main content
 首页 » 编程设计

python之如何动态填充前导零(在函数中)

2025年05月04日16JustinYoung

我知道 "%03d" 可以很容易地做到这一点,但我正在尝试解决一个稍微不同的问题。在我的脚本部分,我需要找出一个范围(例如 0-999)中至少有一个 3(或任何有问题的数字)的数字。所以,我想到了这个 lambda 函数:

fx = lambda z,y=999: [ "%03d" % (x, ) for x in range(y) if str(z) in str(x) ] 

效果很好,但我想根据范围自动填充“前导零”位,例如003 为 999 或 09 为 88 等等。知道我该怎么做吗?

请您参考如下方法:

如果您想将动态宽度传递给格式化函数,您可以:

>>> width = 5 
>>> value = 2 
>>> '%0*d' % (width, value) 
'00002' 

使用新样式格式更容易,因为您可以在占位符中嵌入占位符:

>>> width = 5 
>>> value = 2 
>>> '{1:0{0}}'.format(width, value) 
'00002' 

如果你还想知道如何在输出之前获取所有值中最长的值,只要你能遍历这些值两次,那很容易:

>>> values = 3, 100, 50000 
>>> width = max(len('%0d' % value) for value in values) 
>>> ', '.join('%0*d' % (width, value) for value in values) 
'00003, 00100, 50000' 

如果你想将它基于一个参数,那就更简单了:

fx = lambda z,y=999: [ "%0*d" % (len('%0d' % y), x) for x in range(y) if str(z) in str(x) ] 

然而,这将一遍又一遍地计算 y 的宽度,因为在表达式中没有简单的方法来存储它,而 lambda 只能取一个表达式。

这提出了一个问题,即您为什么首先使用 lambda。 lambda 相对于 def 的唯一优势是您可以在表达式中使用它,而无需为其命名。如果您要将其分配给一个名称,则会消除这两个优点。所以,只需这样做:

def fx(z, y=999): 
    width = len('%0d' % y) 
    return ["0%*d" % (width, x) for x in range(y) if str(z) in str(x)]