回答:
%(モジュロ)演算子は、最初の引数を2番目の引数で割った余りを生成します。数値引数は、最初に共通の型に変換されます。ゼロの右引数は、ZeroDivisionError例外を発生させます。引数は浮動小数点数にすることができます。たとえば、3.14%0.7は0.34に等しいため(3.14は4 * 0.7 + 0.34に等しいため)。結果の絶対値は、第2オペランドの絶対値[2]よりも厳密に小さくなります。
http://docs.python.org/reference/expressions.htmlから取得
例1:
6を2で割ると(3回)、余りがないため、と6%2
評価され0
ます。
例2:7を2(3回)で除算したときの余りがあるため、と7%2
評価されます。1
1
つまり、要約すると、除算演算の余り、または0
余りがない場合に返されます。つまり6%2
、6を2で割った余りを見つけます。
-11%5 = 4
?
トピックとは少し関係%
があり、%=
値を文字列に置き換えるような文字列フォーマット操作でも使用されます。
>>> x = 'abc_%(key)s_'
>>> x %= {'key':'value'}
>>> x
'abc_value_'
ここでも、話題オフ、追跡するためにしばらくかかった小さな文書化機能のようだ、と私はそれがこのSOページは非常にランクいるニシキヘビ剰余計算に関連していたと思いました。
%=
そのページには表示されません
%
文字列自体で使用されているパーセント指定子を反映するため、演算子が選択されました。
のような式x % y
は、残りの部分に評価されますx ÷ y
-技術的には、「リマインダー」ではなく「モジュラス」で%
あるため、残りの演算子が他の言語と比較している場合、結果が異なる場合があります。いくつかの微妙な違いがあります(実際の結果に興味がある場合は、以下の「Pythonの整数除算フロア」の理由も参照してください)。
優先順位は、演算子/
(除算)および*
(乗算)と同じです。
>>> 9 / 2
4
>>> 9 % 2
1
Pythonの落とし穴:使用しているPythonのバージョンによって%
は、(非推奨の)文字列補間演算子でもあるため、次のような式'12' % 2 + 3
が有効な自動型キャスト(PHPまたはJSなど)を使用する言語から来ている場合は注意してください。 Pythonを使用すると、TypeError: not all arguments converted during string formatting
おそらく混乱を招きます。
[Python 3の更新]
ユーザーn00pコメント:
Pythonでは9/2は4.5です。整数の除算は次のように行う必要があります:除算後にオブジェクト全体がいくつ残っているかをpythonに通知する場合は9 // 2。
正確に言うと、Python 2では整数除算がデフォルトで使用されていました(この答えは、すでに学校に通っていて、2.xが主流だった私の男の子より古いです)。
$ python2.7
Python 2.7.10 (default, Oct 6 2017, 22:29:07)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 9 / 2
4
>>> 9 // 2
4
>>> 9 % 2
1
現代のPythonでは実際に9 / 2
結果4.5
は次のとおりです。
$ python3.6
Python 3.6.1 (default, Apr 27 2017, 00:15:59)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 9 / 2
4.5
>>> 9 // 2
4
>>> 9 % 2
1
[更新]
ユーザーdahiya_boyがコメントセッションで質問:
Q.理由を教えてください
-11 % 5 = 4
-dahiya_boy
変だよね?JavaScriptでこれを試す場合:
> -11 % 5
-1
これは、JavaScript %
では「剰余」演算子であるのに対し、Pythonでは「モジュラス」(クロック演算)演算子であるためです。
GvRから直接説明を取得できます。
編集-dahiya_boy
JavaとiOS -11 % 5 = -1
ではPython、Rubyでは-11 % 5 = 4
。
理由の半分はPaulo Scardineによって説明され、残りの説明はここにあります
JavaとiOSでは%
、残りを与えます。つまり、11%5 ギブQuotient = 2 and remainder = 1
と-11%5ギブを割った場合ですQuotient = -2 and remainder = -1
。
迅速なiOSのサンプルコード。
しかし、Pythonで話すと、クロックモジュラスが得られます。そしてその下の式での作業
mod(a,n) = a - {n * Floor(a/n)}
つまり、
mod(11,5) = 11 - {5 * Floor(11/5)} => 11 - {5 * 2}
そう、 mod(11,5) = 1
そして
mod(-11,5) = -11 - 5 * Floor(11/5) => -11 - {5 * (-3)}
そう、 mod(-11,5) = 4
Python 3.0のサンプルコード。
Pythonの整数除算フロアが選ばれる理由
今日も(なぜ)Pythonの整数除算がCのようにゼロに向かって切り捨てるのではなく、結果の下限を返すのかを説明するよう求められました。
正の数の場合、驚きはありません。
>>> 5//2
2
ただし、オペランドの1つが負の場合、結果はフロアされます。つまり、ゼロから離れて(負の無限大に向かって)丸められます。
>>> -5//2
-3
>>> 5//-2
-3
これは一部の人々の邪魔をしますが、数学的な理由があります。整数除算演算(//)とその兄弟であるモジュロ演算(%)が一緒になり、素晴らしい数学的な関係を満たします(すべての変数は整数です)。
a/b = q with remainder r
そのような
b*q + r = a and 0 <= r < b
(aおよびbが> = 0であると想定)。
関係を負のaに拡張する(bを正に保つ)場合は、2つの選択肢があります。qをゼロに切り捨てると、rは負になり、不変量は0 <= abs(r)<に変わります。それ以外の場合は、 qを負の無限大に向かってフロアでき、不変量は0 <= r <bのままです。[更新:このパラを修正]
数学の数論では、数学者は常に後者の選択を好みます(例:Wikipediaを参照)。Pythonの場合、私は同じ選択をしました。なぜなら、aの符号が興味深いものではないmodulo演算の興味深いアプリケーションがいくつかあるからです。POSIXタイムスタンプ(1970年の開始からの秒数)を取得して、時刻に変換することを検討してください。1日は24 * 3600 = 86400秒なので、この計算は単にt%86400です。しかし、1970年より前の時刻を負の数で表すと、「ゼロに向かって切り捨てる」ルールは意味のない結果になります。フロアルールを使用すると、すべてうまくいきます。
私が考えた他のアプリケーションは、コンピュータグラフィックスのピクセル位置の計算です。まだまだあると思います。
ところで、負のbの場合、すべてが反転し、不変条件は次のようになります。
0 >= r > b.
では、なぜCはこのようにしないのですか?おそらく、Cが設計された時点では、ハードウェアはこれを実行していませんでした。そして、最も古いハードウェアでは、負の数は最近使用された2の補数表現ではなく(少なくとも整数に対して)「符号+絶対値」として表されたため、ハードウェアはおそらくこの方法で実行しませんでした。私の最初のコンピューターはコントロールデータのメインフレームで、浮動小数点数だけでなく整数にも1の補数を使用していました。60のパターンは負のゼロを意味します!
Pythonのすべての浮動小数点スケルトンが埋め込まれている場所を知っているティムピーターズは、これらのルールを浮動小数点モジュロに拡張したいという私の懸念を表明しています。彼はおそらく正しいです。xが非常に小さい負の数である場合、truncate-towards-negative-infinityルールにより、x%1.0の精度が失われる可能性があります。しかし、それは私が整数のモジュロを分解するのに十分ではなく、//それに密接に結合されています。
PS。/の代わりに//を使用していることに注意してください-これはPython 3の構文であり、整数除算を呼び出していることを知っていることを強調するためにPython 2でも許可されています。Python 2の/演算子は、2つの整数オペランドに対してintとfloatまたは2つのfloatとは異なる結果を返すため、あいまいです。しかし、それはまったく別の話です。PEP 238を参照してください。
Guido van Rossumによる午前9:49の投稿
help(divmod)
不変条件を文書化しq, r = divmod(x y) <==> q*y + r == x
ます。
係数は数学的な演算であり、「クロック演算」と呼ばれることもあります。それを単に余りとして説明することは、コンピュータサイエンスでそれほど多く使用される本当の理由を覆い隠すので、誤解を招き、混乱を招くことがわかります。これは実際に循環サイクルに使用されます。
時計について考えてみましょう。「ミリタリー」タイムの時計を見て、時間の範囲が0:00から23.59まであるとします。毎日午前0時に何かを実行したい場合は、現在時刻mod 24をゼロにする必要があります。
if(時間%24 == 0):
あなたは歴史のすべての時間を24時間の円の周りを何度も循環していると考えることができ、その日の現在の時間はその無限に長い数のmod 24です。それは残りの部分よりもはるかに深い概念であり、それは数学的な方法ですサイクルに対処することは、コンピュータサイエンスにおいて非常に重要です。また、配列のラップアラウンドにも使用されます。これにより、インデックスを増やし、係数を使用して、配列の最後に到達した後に最初にラップバックできます。
a % b = a - b * floor(a/b)
Python-基本的な演算子
http://www.tutorialspoint.com/python/python_basic_operators.htm
モジュラス-左側のオペランドを右側のオペランドで除算し、剰余を返します
a = 10およびb = 20
b%a = 0
ほとんどの言語では、%は係数に使用されます。Pythonも例外ではありません。
%Modulo演算子は、Google https://developers.google.com/edu/python/stringsで定義されているように(Cと同様に)文字列の印刷にも使用できます。
# % operator
text = "%d little pigs come out or I'll %s and %s and %s" % (3, 'huff', 'puff', 'blow down')
これは話題から外れているようですが、確かに誰かを助けるでしょう。
x % y
除算の剰余計算x
で割ったy
場合の商が整数であるが。残りはの兆候がありy
ます。
Python 3では、計算は次のようになり6.75
ます。これは/
、Python 2の(デフォルト)のような整数除算ではなく、真の除算1 / 4
を行うためです。Python2では、結果が切り捨てられるため、0が返されます。
整数の除算は、//
演算子を使用してPython 3でも実行できます。したがって、結果として7を取得するには、次のコマンドを実行します。
3 + 2 + 1 - 5 + 4 % 2 - 1 // 4 + 6
また、次の行を追加するだけで、Python 2でPythonスタイルの分割を取得できます。
from __future__ import division
各ソースファイルの最初のソースコード行として。
#
はコメント用で//
あり、オペレーターであることを忘れないでください。
モジュラス演算子。通常、整数の剰余除算に使用されますが、Pythonでは浮動小数点数に使用できます。
http://docs.python.org/reference/expressions.html
%(モジュロ)演算子は、最初の引数を2番目の引数で割った余りを生成します。数値引数は、最初に共通の型に変換されます。ゼロの右引数は、ZeroDivisionError例外を発生させます。引数は浮動小数点数にすることができます。たとえば、3.14%0.7は0.34に等しいため(3.14は4 * 0.7 + 0.34に等しいため)。結果の絶対値は、第2オペランドの絶対値[2]よりも厳密に小さくなります。
オンラインで%を使用する特定のユースケースをすぐに見つけるのは困難でした。たとえば、なぜ分数モジュラス除算または負のモジュラス除算を行うと、答えが得られるのでしょうか。これがこのような質問を明確にするのに役立つことを願っています:
一般的な係数部:
モジュラス除算は、数学的な除算演算の残りを返します。それは次のように行われます:
5の被除数と2の除数があるとすると、次の除算は(xと同じ)になります。
dividend = 5
divisor = 2
x = 5/2
係数計算の最初のステップは、整数除算を実行することです。
x_int = 5 // 2(Pythonの整数除算はダブルスラッシュを使用)
x_int = 2
次に、x_intの出力に除数が乗算されます。
x_mult = x_int *除数x_mult = 4
最後に、x_multから被除数が減算されます
配当-x_mult = 1
したがって、モジュラス演算は1を返します。
5%2 = 1
分数に係数を適用するアプリケーション
Example: 2 % 5
分数に適用した場合の係数の計算は上記と同じです。ただし、除数が被除数より大きい場合、整数除算はゼロの値になることに注意することが重要です。
dividend = 2
divisor = 5
整数除算の結果は0になりますが、; したがって、上記のステップ3が実行されると、被除数の値が繰り越されます(ゼロから減算されます)。
dividend - 0 = 2 —> 2 % 5 = 2
係数を負に適用するアプリケーション
整数除算の値が最小の整数値に切り捨てられるフロア除算が発生します。
import math
x = -1.1
math.floor(-1.1) = -2
y = 1.1
math.floor = 1
したがって、整数除算を行うと、期待とは異なる結果が得られる可能性があります。
上記の手順を次の被除数と除数に適用すると、係数の概念がわかります。
dividend: -5
divisor: 2
ステップ1:整数除算を適用する
x_int = -5 // 2 = -3
ステップ2:整数除算の結果に除数を掛ける
x_mult = x_int * 2 = -6
ステップ3:乗算された変数から被除数を引きます。二重の負に注意してください。
dividend - x_mult = -5 -(-6) = 1
したがって:
-5 % 2 = 1
%(モジュロ)演算子は、最初の引数を2番目の引数で割った余りを生成します。数値引数は、最初に共通の型に変換されます。
3 + 2 + 1-5 + 4%2-1/4 + 6 = 7
これは、演算子の優先順位に基づいています。
これはモジュロ演算です http://en.wikipedia.org/wiki/Modulo_operation
http://docs.python.org/reference/expressions.html
したがって、操作の順序で、それは
(3 + 2 + 1-5)+(4%2)-(1/4)+ 6
(1)+(0)-(0)+ 6
7
ここでは整数演算を行っているため、1/4 = 0です。
多くのC言語のように、剰余演算または剰余演算です。数値型(int、float、long、complex)のドキュメントを参照してください。
モジュラス-左側のオペランドを右側のオペランドで除算し、剰余を返します。
それが役立つ場合:
1:0> 2%6
=> 2
2:0> 8%6
=> 2
3:0> 2%6 == 8%6
=> true
... 等々。
モジュラス演算子(%)を把握する最も簡単な方法は、長い除算を使用することです。これは残りであり、偶数か奇数かを決定するのに役立ちます。
4%2 = 0
2
2|4
-4
0
11%3 = 2
3
3|11
-9
2