繁体   English   中英

我不明白我的退货声明中发生了什么

[英]I don't understand what's going on in my return statements

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

这是逐行细分:

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 width的零填充字段,然后在右侧( > )处向其中插入一个值。 然后s通过format传入,我们得到了结果。

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

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

    return '0.'+s

最终的可能性是s恰好是l位数字。 在这种情况下,我们无需进行任何填充; 我们可以在前面加上0和小数点

最后一点:如果将整数以外的任何内容传递给此函数,则它将无法正常工作。 考虑一下:

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

或这个:

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

线s=str(n*10**l / d)n/d乘以10**l来将比率n/d转换为整数,以得到小数点右边的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:]将小数点放在字符串中间的适当位置。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM