0

関数で何が起こっているのか、特に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
4

3 に答える 3

7

行ごとの内訳は次のとおりです。

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

かなり明白。nは数値、dは別の数値(除数)、lは小数点以下に出力する桁数です。

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

これは少し変わったことをします。浮動小数点演算に依存するのではなく、これは、、つまり数字が後に続くことで乗算nされます。そうすれば、最終結果に浮動小数点エラーが発生することはありません。常に整数であると仮定します。(ただし、もちろん残りの数字は切り捨てられます。また、同じ動作を得るには、Python 3でに置き換えてください。)10 ** l1ld///

この時点で、は整数の文字列表現になります(これも整数であるとs仮定します)が、の結果と同じになります。だから今、私たちは正しい場所に小数点を挿入する必要があります。dfloat(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'
于 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」を付けるための凝った方法です。l前に、小数点までに必要な数の「0」を入力します。

この式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 に答える