0

我需要帮助理解函数中发生的事情,尤其是返回语句。我知道 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
4

3 回答 3

7

以下是逐行细分:

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

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

    s=str(n*10**l / d)

这有点不寻常。这不是依赖浮点运算,而是乘以n10 ** l即乘以 a1后跟l数字。这样最终结果不会有任何浮点错误——假设d总是一个整数。(当然,任何剩余的数字都会被截断。另外,在 Python 3 中替换///以获得相同的行为。)

此时,s将是一个整数的字符串表示形式——再次假设是一个整数d——但它将与. 所以现在我们只需要在正确的位置插入小数点。float(n) / d

    if len(s) < l: 
        return '0.{:0>{width}}'.format(s,width=l) 

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

    if len(s) > l: 
        return s[0:len(s)-l]+'.'+s[len(s)-l:]

如果 的长度a大于l,那么我们需要在正确的位置插入小数点。这就是这样做的。它从 中删除尾随l数字s,附加 a .,然后附加剩余的l数字。

    return '0.'+s

最后一种可能性是s正好是l数字长。在这种情况下,我们不需要做任何填充;我们可以在前面加上0一个小数点。

最后一点:如果您向此函数传递除整数以外的任何内容,它将无法按预期工作。考虑一下:

>>> intF(10, 10.1, 10)
'990.0990099.01'

或这个:

>>> intF(10.1, 10, 10)
'101.00000000.0'
于 2012-06-13T21:52:39.270 回答
1

该行通过将比率乘以得到小数点右侧的数字,s=str(n*10**l / d)将比率转换为整数。n/d10**ll

之后,它会测试结果中的位数。如果它小于“l”,则该比率小于 0.1。如果它大于“l”,则大于或等于 1.0。如果介于两者之间,则该比率在 0.1 和 1.0 之间。

该表达式'0.{:0>{width}}'.format(s,width=l)是放置前导“0”的一种奇特方式。在前面并填写必要数量的“0”以使其精确到l小数点。

该表达式s[0:len(s)-l]+'.'+s[len(s)-l:]只是在字符串中间的适当位置放置一个小数点。

于 2012-06-13T21:55:17.397 回答
0

您正在根据传递给函数的变量创建一个字符串。然后它检查字符串的长度,如果它小于 1,则返回它的格式,大于 1,它的格式,并且作为回退默认值,当它的长度为 1 个字符时,返回另一种格式。

于 2012-06-13T21:19:33.190 回答