我不明白我的回复陈述中发生了什么

321*_*321 0 python python-2.7

我需要帮助了解函数中的最新情况,尤其是return语句.我知道返回语句的作用,但不知道它们是如何做的.我知道他们格式化字符串,但我只是不明白它是如何完成的.如果你们一步一步地采取它会有所帮助.

def intF(n, d, l=40):

    s=str(n*10**l / d) 
    if len(s) < l: 
        return '0.{:0>{width}}'.format(s,width=l) 
    if len(s) > l: 
        return s[0:len(s)-l]+'.'+s[len(s)-l:]  

    return '0.'+s
Run Code Online (Sandbox Code Playgroud)

sen*_*rle 7

这是一个逐行细分:

def intF(n, d, l=40):
Run Code Online (Sandbox Code Playgroud)

很明显.n是一个数字,d是另一个数字(除数),l是小数点后打印的位数.

    s=str(n*10**l / d)
Run Code Online (Sandbox Code Playgroud)

这有点不寻常.而不是依靠浮点运算,这个相乘n10 ** l,由即1后跟l数字.这样最终结果就不会有任何浮点错误 - 假设d它总是一个整数.(当然任何其余数字被截断.此外,更换///Python 3中得到相同的行为.)

此时,sd是整数的字符串表示 - 再次假设是一个整数 - 但它将具有与结果相同的数字float(n) / d.所以现在我们只需要在正确的位置插入小数点.

    if len(s) < l: 
        return '0.{:0>{width}}'.format(s,width=l) 
Run Code Online (Sandbox Code Playgroud)

如果长度s小于l,那么我们需要填充它并添加前缀0..这就是它的作用.该{:0>{width}}字段表示创建一个零填充的width宽度字段,并在右侧(>)侧插入一个值.然后s传入via format,我们得到了结果.

    if len(s) > l: 
        return s[0:len(s)-l]+'.'+s[len(s)-l:]
Run Code Online (Sandbox Code Playgroud)

如果长度a大于l,那么我们需要在正确的位置插入小数点.这就是它的作用.它会删除尾随的l数字s,附加一个.,然后追加剩余的l数字.

    return '0.'+s
Run Code Online (Sandbox Code Playgroud)

最后一种可能性是,s正是l位数.在这种情况下,我们不需要做任何填充; 我们可以只加0一个小数点.

最后要注意的是:如果将除整数之外的任何内容传递给此函数,它将无法按预期工作.考虑一下:

>>> intF(10, 10.1, 10)
'990.0990099.01'
Run Code Online (Sandbox Code Playgroud)

或这个:

>>> intF(10.1, 10, 10)
'101.00000000.0'
Run Code Online (Sandbox Code Playgroud)