web-dev-qa-db-ja.com

Pythonでパーセント記号の意味は何ですか

チュートリアルには、素数を見つけるための例があります。

>>> 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実際に言う?

48
Lonnie Price

モジュラス演算子。左の値を右の値で割った余りを与えます。好む:

3 % 1はゼロに等しくなります(3は1で均等に分割するため)

3 % 2は1になります(3を2で割ると余りが1になるため)。

55
inkedmn

%は、引数に応じて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

19
Stephen

パーセント記号の意味は何ですか?

これは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.'

Jupyter/IPythonの%:魔法のコマンド

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)
10
MSeifert

モジュラス演算子。 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
1
user1031446

python 2.6 '%'演算子はモジュラスを実行しました。3.0.1で変更されたとは思わない

モジュロ演算子は、2つの数値の除算の残りを示します。

1
Jon W

除算のモジュロかどうかをチェックします。たとえば、2からnまでのすべての数値を反復処理し、nがその間の数値のいずれかで割り切れるかどうかを確認する場合。簡単に言えば、与えられた数nが素数であるかどうかをチェックしています。 (ヒント:最大n/2までチェックできます)。

1
laginimaineb

Blockquote x%n == 0は、x/nとリマインダーの値が結果として取得され、ゼロと比較されることを意味します。

例:4/5 == 0

4/5リマインダーは1

1 == 0(偽)

0
Hemant