2012-06-13 109 views
0

我需要幫助理解函數中發生了什麼,尤其是返回語句。我知道回報聲明做什麼,但不知道他們是如何做的。我知道他們格式化了字符串,但我不明白它是如何完成的。如果你們一步一步來做,這將會有所幫助。我不明白我的返回語句發生了什麼

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

沒有任何循環。 –

+0

@ daniel我的意思是if語句返回的內容 – 321

回答

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大,那麼我們需要插入小數點在正確的位置。這就是這樣做的。它從s中刪除尾隨的l數字,追加.,然後附加其餘的l數字。

return '0.'+s 

最後一種可能性是s正是l位數。在這種情況下,我們不需要做任何填充;我們可以預先配置一個0和一個小數點。

最後要注意:如果你通過什麼,但整數此功能,預計將無法正常工作。試想一下:

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

或者這樣:

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

這是偉大的thx。即時通訊實際上是新的,所以你可以告訴我什麼「墊」的含義。我知道前置意味着在它前面增加一些東西,所以墊是否意味着要騰出空間? – 321

+0

如果'n'不是一個整數也不起作用。可以通過使用's = str(int(n)* 10 ** int(l)/ int(d))' –

+0

「pad」來簡單修復,只是意味着用特定字符填充字段。所以考慮這三個字符串:'52','52','0052'。第一個是沒有填充的。第二個填充空格。第三個填充零。 – senderle

0

您正在根據傳遞給該函數的變量創建一個字符串。然後它檢查字符串的長度,如果小於1,則返回其格式,大於1,格式,作爲長度爲1個字符時的後備默認值,將返回另一種格式。

+0

實際上,這不是'1' - 它是'l'。 – senderle

+0

我正要問一個數字的字符串表示怎麼會<1:D – pwuertz

+0

能解釋更多詳細信息的返回語句嗎?我只明白他們在做什麼,但不知道他們是如何做的。 – 321

1

s=str(n*10**l/d)10**l相乘得到l數字小數點右邊的整數比n/d轉換。

之後,它測試結果中的位數。如果它小於'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:]只是在適當的位置在字符串的中間放置一個小數點。

相關問題