2012-03-20 6 views
4

私はPythonで値のモジュラスを実行しようとしていますが、私の知る限り、モジュラスを文字列フォーマット定数として解釈しているのでエラーが発生します。私の最初の推測は、これをキャストすることですが、ハングします。Pythonモジュラス文字列フォーマットエラーを返します

val = pow(a,n,p) 
    val = y1*val 
    val = val % p 

2つのコード行がこの質問に対応していますか。今すぐ実行すると、次のようになります。 TypeError:文字列書式中にすべての引数が変換されない 2行目。

valを整数にラップしてキャストすると、計算に時間がかかります。

私はあまりにもPythonに熟練していない、私の推測私は何かシンプルが欠けているが、何ですか?

+3

what's 'y1'?それが文字列であると仮定すると、 'val = y1 * val'も文字列を生成します。デバッグのために各ステップの後に 'repr(val)'を表示すると役に立つでしょう。 – geoffspear

+1

2行目にエラーが発生していますか? 'y1'が文字列であれば、3行目で完璧な意味を持ちます(最後の行で' val'も文字列になります)。 –

+0

3つの引数を持つpow関数は何ですか?また、これらの議論がどこから来たのかについて、より多くの情報を提供できますか? valはすでに文字列ではなく数字でなければならないので、私は上流に行く何か魚があると推測しています。 –

答えて

3

このエラーが発生した場合、y1自体は文字列です。文字列で数値計算を実行することはできません。「int(y1)」を実行するとキャストされず、文字列内の文字で表される数値が実際の数値に変換されます。これが可能な唯一の方法ですその上で数値演算を実行します。

もしあなたが "y1 * val"をintに変換しようとしているのではないでしょうか - すでに間違っています - y1が文字列なら "y1 * val" val "時代 - 本当に巨大な数字になるでしょう。あなたは乗算の前に数として値I N「Y1」を持っている必要があります - のように:あなたは、このコードから見ることができるように

val = int(y1) * val 
+0

これは問題だった、私は何とかファイルから読み込んだコード行の前にあるint(y1)を取り除いた。 – russ36363

2

%オペレータは数字よりも文字列と異なる意味を持っています。

>>> 1 % 2 
1 
>>> '1' % 2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: not all arguments converted during string formatting 

私の推測では、y1は実際には文字列です。 のタイプの違いは次のとおりです。

>>> val = 10 
>>> y1 = '2' 
>>> val * y1 
'2222222222' 
>>> y1 = 2 
>>> val * y1 
20 
関連する問題