チュートリアルには、素数を見つけるための例があります。
>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print(n, 'equals', x, '*', n//x)
... break
... else:
... # loop fell through without finding a factor
... print(n, 'is a prime number')
...
ダブル==
は平等性のテストですが、if n % x
パート。私が口頭で各部分を通り抜けて、例のために文が何をするかを言うことができるように。しかし、パーセント記号がどのように当てはまるかはわかりません。
if n % x
実際に言う?
モジュラス演算子。左の値を右の値で割った余りを与えます。好む:
3 % 1
はゼロに等しくなります(3は1で均等に分割するため)
3 % 2
は1になります(3を2で割ると余りが1になるため)。
%は、引数に応じて2つのことを行います。この場合、モジュロ演算子として機能します。引数が数値の場合、最初の引数を2番目の引数で除算し、remainderを返します。 _34 % 10 == 4
_ 34を10で割ったものは3で、残りは4です。
最初の引数が文字列の場合、2番目の引数を使用してフォーマットします。これは少し複雑なので、 documentation を参照しますが、これは単なる例です。
_>>> "foo %d bar" % 5
'foo 5 bar'
_
ただし、文字列の書式設定の動作は Python 3.1 の時点で補足され、string.format()
メカニズムが優先されます:
ここで説明するフォーマット操作には、多くの一般的なエラー(タプルや辞書を正しく表示できないなど)につながるさまざまな癖があります。新しい
str.format()
インターフェースを使用すると、これらのエラーを回避でき、一般的にテキストをフォーマットするためのより強力で、柔軟で拡張可能なアプローチを提供します。
ありがたいことに、ほとんどすべての新機能はpython 2.6以降からも利用可能です。
これは少し話題から外れていますが、人々は「Pythonのパーセント記号」を検索することでこれを見つけるので(私がしたように)、%記号はiPythonの「マジック」関数の接頭辞にも使用されることに注意してください:- https://ipython.org/ipython-doc/3/interactive/tutorial.html#magic-functions
パーセント記号の意味は何ですか?
これはPythonの演算子です。これはコンテキストに応じていくつかのことを意味します。以下の多くは既に他の回答で言及(または示唆)されていますが、より広範な要約。
%
for Numbers:モジュロ演算/剰余/レストパーセント記号は Pythonの演算子 です。次のように記述されています。
x % y remainder of x / y
したがって、xをyで「フロア除算」すると、- 剰余/残りremainsが得られます。一般に(少なくともPythonでは)番号x
と除数y
が与えられます:
x == y * (x // y) + (x % y)
たとえば、5を2で割った場合:
>>> 5 // 2
2
>>> 5 % 2
1
>>> 2 * (5 // 2) + (5 % 2)
5
一般に、モジュロ演算を使用して、数値が別の数値で均等に除算されるかどうかをテストします。これは、その数値をモジュロする数値の倍数が0を返すためです。
>>> 15 % 5 # 15 is 3 * 5
0
>>> 81 % 9 # 81 is 9 * 9
0
それはあなたの例で使用されている方法です、それが別の数の倍数である場合、それは素数になることはできません(それ自体と1つを除く)、それはこれがすることです:
if n % x == 0:
break
n % x == 0
があまり説明的でないと感じた場合は、より説明的な名前の別の関数にそれを入れることができます。
def is_multiple(number, divisor):
return number % divisor == 0
...
if is_multiple(n, x):
break
is_multiple
の代わりに、evenly_divides
または同様の名前を付けることもできます。ここでテストされています。
同様に、数値が「奇数」か「偶数」かを判断するためによく使用されます。
def is_odd(number):
return number % 2 == 1
def is_even(number):
return number % 2 == 0
また、場合によっては、ラップアラウンド(循環)動作が必要なときに配列/リストのインデックス作成にも使用されます。次に、「インデックス」を「配列の長さ」でモジュロするだけです。
>>> l = [0, 1, 2]
>>> length = len(l)
>>> for index in range(10):
... print(l[index % length])
0
1
2
0
1
2
0
1
2
0
標準ライブラリ operator.mod
(およびエイリアス operator.__mod__
)には、この演算子の関数もあります。
>>> import operator
>>> operator.mod(5, 2) # equivalent to 5 % 2
1
ただし、結果を変数に戻す拡張割り当て%=
もあります。
>>> a = 5
>>> a %= 2 # identical to: a = a % 2
>>> a
1
%
文字列の場合: printf
- style String Formatting文字列の場合、意味は完全に異なり、文字列の書式設定を行うための1つの方法(私の意見では最も限定的でugい)です。
>>> "%s is %s." % ("this", "good")
'this is good'
ここで、文字列の%
は、フォーマット仕様が続くプレースホルダーを表します。この場合、%s
を使用しました。つまり、文字列が必要です。次に、文字列の後に%
が続きます。これは、左側の文字列が右側でフォーマットされることを示します。この場合、最初の%s
は最初の引数this
に置き換えられ、2番目の%s
は2番目の引数(good
)に置き換えられます。
文字列をフォーマットするには、はるかに優れた(おそらく意見ベースの)方法があることに注意してください。
>>> "{} is {}.".format("this", "good")
'this is good.'
%
:魔法のコマンドdocs を引用するには:
Jupyterユーザーへ:MagicsはIPythonカーネルに固有であり、IPythonカーネルによって提供されます。カーネルでマジックを使用できるかどうかは、カーネル開発者がカーネルごとに決定します。 Magicsが適切に機能するためには、基礎となる言語では無効な構文要素を使用する必要があります。たとえば、IPythonカーネルは
%
はPythonで有効な単項演算子ではないため、マジックに%
構文要素を使用します。一方、構文要素は他の言語でも意味を持ちます。
これはJupyterノートブックなどで定期的に使用されています。
In [1]: a = 10
b = 20
%timeit a + b # one % -> line-magic
54.6 ns ± 2.7 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [2]: %%timeit # two %% -> cell magic
a ** b
362 ns ± 8.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%
演算子(NumPy/Pandasエコシステム内)%
演算子は、これらの配列に適用される場合でもモジュロ演算子ですが、配列内の各要素の残りを含む配列を返します。
>>> import numpy as np
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a % 2
array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1])
%
演算子のカスタマイズもちろん、%
演算子が適用された場合、独自のクラスの動作をカスタマイズできます。通常、shouldはモジュロ演算の実装にのみ使用する必要があります!しかし、それはガイドラインであり、厳しいルールではありません。
それがどのように機能するかを示す簡単な例を提供するだけです:
class MyNumber(object):
def __init__(self, value):
self.value = value
def __mod__(self, other):
print("__mod__ called on '{!r}'".format(self))
return self.value % other
def __repr__(self):
return "{self.__class__.__name__}({self.value!r})".format(self=self)
この例はあまり有用ではなく、単に印刷してから格納されている値に演算子を委任しますが、__mod__
がインスタンスに適用されると %
が呼び出されることを示しています:
>>> a = MyNumber(10)
>>> a % 2
__mod__ called on 'MyNumber(10)'
0
%=
を明示的に実装する必要なく、__imod__
でも機能することに注意してください。
>>> a = MyNumber(10)
>>> a %= 2
__mod__ called on 'MyNumber(10)'
>>> a
0
ただし、__imod__
を明示的に実装して、拡張された割り当てを上書きすることもできます。
class MyNumber(object):
def __init__(self, value):
self.value = value
def __mod__(self, other):
print("__mod__ called on '{!r}'".format(self))
return self.value % other
def __imod__(self, other):
print("__imod__ called on '{!r}'".format(self))
self.value %= other
return self
def __repr__(self):
return "{self.__class__.__name__}({self.value!r})".format(self=self)
%=
はインプレースで動作するように明示的に上書きされます:
>>> a = MyNumber(10)
>>> a %= 2
__imod__ called on 'MyNumber(10)'
>>> a
MyNumber(0)
モジュラス演算子。 2つの数値を除算したときの残り。
例えば:
>>> 5 % 2 = 1 # remainder of 5 divided by 2 is 1
>>> 7 % 3 = 1 # remainer of 7 divided by 3 is 1
>>> 3 % 1 = 0 # because 1 divides evenly into 3
python 2.6 '%'演算子はモジュラスを実行しました。3.0.1で変更されたとは思わない
モジュロ演算子は、2つの数値の除算の残りを示します。
除算のモジュロかどうかをチェックします。たとえば、2からnまでのすべての数値を反復処理し、nがその間の数値のいずれかで割り切れるかどうかを確認する場合。簡単に言えば、与えられた数nが素数であるかどうかをチェックしています。 (ヒント:最大n/2までチェックできます)。
Blockquote x%n == 0は、x/nとリマインダーの値が結果として取得され、ゼロと比較されることを意味します。
例:4/5 == 0
4/5リマインダーは1
1 == 0(偽)