Pythonの%の結果は何ですか?


241

%計算では何をしますか?私はそれが何をしているのか理解できないようです。

例えば、それは計算のパーセントを計算しますか:4 % 2明らかに0に等しいです。どのように?

回答:


304

%(モジュロ)演算子は、最初の引数を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評価されます。11

つまり、要約すると、除算演算の余り、または0余りがない場合に返されます。つまり6%2、6を2で割った余りを見つけます。


7
すべての例の右側に大きな数字があるのはなぜですか?誰かが2をもたらす2%6の結果を説明できますか?
wookie、2015年

8
最初の数値は分子で、2番目の数値は分母です。あなたの例では6で割った2 0余り2、したがって、結果は2である
デビッド・

4
回答を更新してください。以下により正確な回答があります。でC / C ++%Pythonで%は'MOD'のためのものであるのに対し、 'REM'のためのものです。たとえば- 21 % 4、Pythonでは3です。
azam

あなたは理由を説明してくださいすることができます-11%5 = 4
dahiya_boy

@dahiya_boy私は以下のあまり投票されていない回答にGvRの説明を追加しました。
Paulo Scardine

143

トピックとは少し関係%があり、%=値を文字列に置き換えるような文字列フォーマット操作でも使用されます。

>>> x = 'abc_%(key)s_'
>>> x %= {'key':'value'}
>>> x 
'abc_value_'

ここでも、話題オフ、追跡するためにしばらくかかった小さな文書化機能のようだ、私はそれがこのSOページは非常にランクいるニシキヘビ剰余計算に関連していたと思いました。


文字列フォーマットの参照としても使用される%へのロジックはありますか、それともそのシンボルが過負荷になったのは歴史の偶然ですか?これは独自の質問ですか?
WAF 2014

5
文書化が不十分ですか?私はそうは思いません:文字列フォーマット操作
KurzedMetal

@KurzedMetal- %=そのページには表示されません
P. Myer Nore

@WAF %文字列自体で使用されているパーセント指定子を反映するため、演算子が選択されました。
MIライト、

@ P.MyerNore私はこれがほぼ3年後であることを知っていますが、他の人を助けるかもしれません。秒で強調表示された最初のパラを読みます。5.6.2上記のKurzedMetalによるリンク。"x%= {}"は単に "x = x%{...}"の
省略

58

のような式x % yは、残りの部分に評価されますx ÷ y-技術的には、「リマインダー」ではなく「モジュラス」で%あるため、残りの演算子が他の言語と比較している場合、結果が異なる場合があります。いくつかの微妙な違いがあります(実際の結果に興味がある場合は、以下の「Pythonの整数除算フロア」の理由も参照してください)。

優先順位は、演算子/(除算)および*(乗算)と同じです。

>>> 9 / 2
4
>>> 9 % 2
1
  • 2で割った9は4に等しい。
  • 4かける2は8
  • 9-8は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の投稿


1
また、help(divmod)不変条件を文書化しq, r = divmod(x y) <==> q*y + r == xます。
chepner

49

係数は数学的な演算であり、「クロック演算」と呼ばれることもあります。それを単に余りとして説明することは、コンピュータサイエンスでそれほど多く使用される本当の理由を覆い隠すので、誤解を招き、混乱を招くことがわかります。これは実際に循環サイクルに使用されます。

時計について考えてみましょう。「ミリタリー」タイムの時計を見て、時間の範囲が0:00から23.59まであるとします。毎日午前0時に何かを実行したい場合は、現在時刻mod 24をゼロにする必要があります。

if(時間%24 == 0):

あなたは歴史のすべての時間を24時間の円の周りを何度も循環していると考えることができ、その日の現在の時間はその無限に長い数のmod 24です。それは残りの部分よりもはるかに深い概念であり、それは数学的な方法ですサイクルに対処することは、コンピュータサイエンスにおいて非常に重要です。また、配列のラップアラウンドにも使用されます。これにより、インデックスを増やし、係数を使用して、配列の最後に到達した後に最初にラップバックできます。


1
これは、それはPythonで実装されています方法です:a % b = a - b * floor(a/b)
AimanアルEryani


7

ほとんどの言語では、%は係数に使用されます。Pythonも例外ではありません。


11
私が見る限り、Pythonはモジュラスに%を使用するという点で異常です。Fortran、C / C ++、およびJavaは、%を使用して剰余を意味します。(stackoverflow.com/questions/13683563/…を参照してください。違いは、負の値と小数値の処理方法にあります。)区別する言語(Ada、Haskell、Schemeなど)では、「rem」と「mod」という単語を使用します%ではなく(または「剰余」と「モジュロ」)。
Jim Pivarski、2014年

5
更新:言語en.wikipedia.org/wiki/Modulo_operationによるmodulo / remainder操作のこの素晴らしい表を見つけました。Pythonは珍しいですが、ユニークではありません(たとえば、TCLとLuaはPythonの規則を共有しています)
Jim Pivarski 2014年


4

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

各ソースファイルの最初のソースコード行として。


8
子供#はコメント用で//あり、オペレーターであることを忘れないでください。
マイク・コーザー、2016年

3

モジュラス演算子。通常、整数の剰余除算に使用されますが、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]よりも厳密に小さくなります。


3

これは、モジュロ演算ではなく、昔ながらのCスタイルの文字列フォーマット演算子である場合を除いて、モジュロ演算です。詳細はこちらをご覧ください。これの多くは既存のコードで確認できます。


3

また、次の便利な組み込み関数がありますdivmod

divmod(a、b)

引数として2(非複素数)の数値を取り、長除算を使用する場合、商と剰余で構成される数値のペアを返します。


2

を注意

(3 +2 + 1 - 5) + (4 % 2) - (1/4) + 6

括弧があっても、Python 3.4で計算すると、7ではなく6.75になります。


また、 '/'演算子もそれほど理解しにくい(python2.7):試してみてください...

- 1/4

1 - 1/4

これは少しここではトピックから外れていますが、上記の式を評価するときに考慮する必要があります:)


2
これはどのように7になりますか?それはに簡略化され(1)+(0)-(0.25)+(6)ます。
J.スティーブ

1

オンラインで%を使用する特定のユースケースをすぐに見つけるのは困難でした。たとえば、なぜ分数モジュラス除算または負のモジュラス除算を行うと、答えが得られるのでしょうか。これがこのような質問を明確にするのに役立つことを願っています:

一般的な係数部:

モジュラス除算は、数学的な除算演算の残りを返します。それは次のように行われます:

5の被除数と2の除数があるとすると、次の除算は(xと同じ)になります。

dividend = 5
divisor = 2

x = 5/2 
  1. 係数計算の最初のステップは、整数除算を実行することです。

    x_int = 5 // 2(Pythonの整数除算はダブルスラッシュを使用)

    x_int = 2

  2. 次に、x_intの出力に除数が乗算されます。

    x_mult = x_int *除数x_mult = 4

  3. 最後に、x_multから被除数が減算されます

    配当-x_mult = 1

  4. したがって、モジュラス演算は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

0

%(モジュロ)演算子は、最初の引数を2番目の引数で割った余りを生成します。数値引数は、最初に共通の型に変換されます。

3 + 2 + 1-5 + 4%2-1/4 + 6 = 7

これは、演算子の優先順位に基づいています。


0

%モジュロです。3 % 2 = 14 % 2 = 0

/ (この場合は整数)除算なので、次のようになります。

3 + 2 + 1 - 5 + 4 % 2 - 1 / 4 + 6
1 + 4%2 - 1/4 + 6
1 + 0 - 0 + 6
7



0

モジュラス-左側のオペランドを右側のオペランドで除算し、剰余を返します。

それが役立つ場合:

1:0> 2%6
=> 2
2:0> 8%6
=> 2
3:0> 2%6 == 8%6
=> true

... 等々。


0

モジュラス演算子(%)を把握する最も簡単な方法は、長い除算を使用することです。これは残りであり、偶数か奇数かを決定するのに役立ちます。

4%2 = 0

  2
2|4
 -4
  0


11%3 = 2

  3
3|11
 -9
  2

部門の残りの部分をあまり取らない
DeafaltCoder
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.