我需要帮助了解函数中发生的事情,尤其是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
答案 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个字符时的后备默认值,返回另一种格式。