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

时间:2012-06-13 21:00:49

标签: 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

3 个答案:

答案 0 :(得分:7)

以下是逐行细分:

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

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

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

这有点不寻常。这不是依赖于浮点算术,而是将n乘以10 ** l,即乘以1后跟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传递format,我们得到了结果。

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

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

    return '0.'+s

最后一种可能性是s长度恰好是l位数。在这种情况下,我们不需要做任何填充;我们可以只添加0和小数点。

作为最后一点:如果你将除了整数之外的任何东西传递给这个函数,它将无法按预期工作。考虑一下:

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

或者这个:

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

答案 1 :(得分:1)

s=str(n*10**l / d)行将比率n/d转换为整数,方法是将其乘以10**l,得到小数点右边的l位数。

之后它会测试结果中的位数。如果它小于'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:]只是将一个小数点放在字符串中间的正确位置。

答案 2 :(得分:0)

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