Yanıtlar:
% (Modulo) operatörü, ilk argümanın ikinciye bölünmesinden kalanını verir. Sayısal bağımsız değişkenler önce ortak bir türe dönüştürülür. Sıfır sağ argümanı ZeroDivisionError istisnasını yükseltir. Değişkenler kayan nokta sayıları olabilir, örn.,% 3.14 0.7, 0.34'e eşittir (3.14, 4 * 0.7 + 0.34'e eşit olduğundan.) Modulo operatörü her zaman ikinci işleneni (veya sıfır) ile aynı işarete sahip bir sonuç verir; sonucun mutlak değeri, ikinci işlenenin mutlak değerinden kesinlikle daha küçüktür [2].
Alındığı http://docs.python.org/reference/expressions.html
Örnek 1:
6'ya bölünürse 2 (3 kez) 6%2
kalır, 0
çünkü değerlendirme yapılmaz.
Örnek 2 : 7'nin 2'ye bölünmesiyle (3 kez) kalan bir 7%2
süre 1
olduğu için değerlendirilir 1
.
Özetlemek gerekirse, bir bölünme operasyonunun kalanını ya 0
da hiç kalıntı yoksa döndürür . Yani 6%2
6'nın kalanını 2'ye bölmek anlamına gelir.
-11%5 = 4
??
Biraz konu dışı, %
dizeyi biçimlendirme işlemlerinde %=
değerleri bir dizeye koymak gibi kullanılır :
>>> x = 'abc_%(key)s_'
>>> x %= {'key':'value'}
>>> x
'abc_value_'
Yine konu dışı, ama beni takip etmek için biraz zaman aldı biraz belgelenmiş bir özellik gibi görünüyor, ve ben bu SO sayfasının yüksek sırada olduğu Pythons modulo hesaplama ile ilgili olduğunu düşündüm.
%=
bu sayfada görünmüyor
%
Operatör, dizenin kendisinde kullanılan yüzde belirteçlerini yansıttığı için seçildi.
Gibi bir ifade x % y
geri kalanı değerlendirir x ÷ y
- iyi, teknik olarak "hatırlatma" yerine "modül" dir, bu nedenle %
kalan işleç olan diğer dillerle karşılaştırırsanız sonuçlar farklı olabilir . Bazı ince farklılıklar vardır (eğer pratik sonuçlarla ilgileniyorsanız "Python'un Tamsayı Bölümü Zeminleri" bölümüne de bakınız).
Öncelik işleçlerle /
(bölme) ve *
(çarpma) ile aynıdır .
>>> 9 / 2
4
>>> 9 % 2
1
Python gotcha : Kullandığınız Python sürümüne bağlı olarak, %
(kullanımdan kaldırılmış) dize enterpolasyon operatörüdür, bu yüzden benzer bir ifadenin '12' % 2 + 3
yasal olduğu otomatik tür dökümü (PHP veya JS gibi) bir dilden gelip gelmediğinize dikkat edin : in Python TypeError: not all arguments converted during string formatting
muhtemelen sizin için oldukça kafa karıştırıcı olacak.
[Python 3 için güncelleme]
Kullanıcı n00p yorumları:
9/2, pitonda 4,5'tir. Python'un size bölünmeden sonra kaç tam nesnenin kaldığını söylemesini istiyorsanız, 9/2 gibi tamsayı bölünmesi yapmanız gerekir.
Kesin olarak, tamsayı bölümü Python 2'de varsayılan olarak kullanılıyordu (unutmayın, bu cevap zaten okulda olan ve 2.x ana akım olan oğlumdan daha eski):
$ 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
Modern Python 9 / 2
sonuçlarında 4.5
gerçekten:
$ 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
[Güncelleme]
Kullanıcı dahiya_boy yorum oturumunda sordu:
S. Nedenini açıklayabilir misiniz
-11 % 5 = 4
dahiya_boy -
Bu garip, değil mi? Bunu JavaScript'te denerseniz:
> -11 % 5
-1
Bunun nedeni, JavaScript'te %
"kalan" operatör iken Python'da "modül" (saat matematik) operatörü olmasıdır.
Sen alabilirsiniz GvR doğrudan açıklama :
Düzenle - dahiya_boy
Java ve iOS'ta -11 % 5 = -1
ise python ve ruby'de -11 % 5 = 4
.
Nedenin yarısı Paulo Scardine tarafından açıklanıyor ve açıklamanın geri kalanı burada
Java ve iOS'ta %
kalan kısmı verir, yani % 11'i bölerseniz 5 verir Quotient = 2 and remainder = 1
ve -11% 5 verir Quotient = -2 and remainder = -1
.
Hızlı iOS'ta örnek kod.
Ama python hakkında konuştuğumuzda saat modülü verir. Ve aşağıdaki formülle çalışması
mod(a,n) = a - {n * Floor(a/n)}
Bu şu anlama gelir,
mod(11,5) = 11 - {5 * Floor(11/5)} => 11 - {5 * 2}
Yani, mod(11,5) = 1
Ve
mod(-11,5) = -11 - 5 * Floor(11/5) => -11 - {5 * (-3)}
Yani, mod(-11,5) = 4
Python 3.0'da örnek kod.
Neden Python'un Tamsayı Bölümü Zeminleri
Bugün (tekrar) Python'daki tamsayı bölümünün neden C gibi sıfıra doğru kesmek yerine sonucun tabanını döndürdüğünü açıklamam istendi.
Pozitif sayılar için sürpriz yok:
>>> 5//2
2
Ancak işlenenlerden biri negatifse, sonuç katlanır, yani sıfırdan uzağa (negatif sonsuza doğru) yuvarlanır:
>>> -5//2
-3
>>> 5//-2
-3
Bu bazı insanları rahatsız ediyor, ancak iyi bir matematiksel sebep var. Tamsayı bölme işlemi (//) ve kardeşi, modulo işlemi (%), birlikte gider ve hoş bir matematiksel ilişkiyi tatmin eder (tüm değişkenler tamsayıdır):
a/b = q with remainder r
öyle ki
b*q + r = a and 0 <= r < b
(a ve b'nin = = 0 olduğu varsayılarak).
İlişkinin negatif a (b pozitif tutmak) için uzatılmasını istiyorsanız, iki seçeneğiniz vardır: q'yu sıfıra keserseniz, r negatif olur, böylece değişmez 0 0 = abs (r) <olarak değişir, aksi takdirde q, negatif sonsuza doğru katlanabilir ve değişmez 0 0 = r <b olarak kalır. [güncelleme: bu para düzeltildi]
Matematiksel sayı teorisinde, matematikçiler her zaman ikinci seçeneği tercih ederler (bkz . Wikipedia ). Python için aynı seçimi yaptım, çünkü a işaretinin ilginç olmadığı modulo işleminin bazı ilginç uygulamaları var. POSIX zaman damgası (1970'in başlangıcından bu yana saniye) almayı ve günün saatine dönüştürmeyi düşünün. Günde 24 * 3600 = 86400 saniye olduğu için, bu hesaplama basitçe t% 86400 olur. Ancak 1970'den önce negatif sayılar kullanarak süreleri ifade edersek, "sıfıra doğru kes" kuralı anlamsız bir sonuç verirdi! Zemin kuralını kullanarak her şey yolunda gider.
Düşündüğüm diğer uygulamalar, bilgisayar grafiklerindeki piksel konumlarının hesaplanmasıdır. Eminim dahası var.
Negatif b için, bu arada, her şey ters çevrilir ve değişmez:
0 >= r > b.
Peki neden C bunu bu şekilde yapmıyor? Muhtemelen C, tasarlandığı sırada donanım bunu yapmadı. Ve donanım muhtemelen bu şekilde yapmadı çünkü en eski donanımda, negatif sayılar, ikisinin bugünlerde kullanılan tamamlayıcı gösterimi yerine (en azından tamsayılar için) "işaret + büyüklük" olarak temsil edildi. İlk bilgisayarım Kontrol Verileri anabilgisayarıydı ve tamsayılar ve şamandıralar için tamamlayıcısını kullandı. 60'lık bir model negatif sıfır demekti!
Tüm Python'un kayan nokta iskeletlerinin nereye gömüldüğünü bilen Tim Peters, bu kuralları kayan nokta modülosuna genişletme arzum hakkında bazı endişeler dile getirdi. Muhtemelen haklıdır; x çok küçük bir negatif sayı olduğunda, kesilme-negatif-sonsuzluk kuralı% x 1,0 için hassas kayıplara neden olabilir. Ama bu tamsayı modulo'unu kırmam için yeterli değil ve // buna sıkıca bağlı.
PS. / Yerine // kullanıyorum, bu Python 3 sözdizimi ve ayrıca Python 2'de tamsayı bölmesini çağırdığınızı vurgulamak için izin verildi. Python 2'deki / operatörü belirsizdir, çünkü iki tamsayı işlenen için int ve float veya iki floattan farklı bir sonuç döndürür. Ama bu tamamen ayrı bir hikaye; bkz. PEP 238.
Gönderen Guido van Rossum zaman: 09:49
help(divmod)
değişmezi belgeler q, r = divmod(x y) <==> q*y + r == x
.
Modül, bazen "saat aritmetiği" olarak tanımlanan matematiksel bir işlemdir. Sadece bir geri kalan olarak tanımlamanın yanıltıcı ve kafa karıştırıcı olduğunu görüyorum, çünkü bilgisayar biliminde bu kadar çok kullanılmasının gerçek nedenini maskeliyor. Gerçekten çevrimleri sarmak için kullanılır.
Bir saat düşünün: "Askeri" zamanda, saatlerin 0:00 - 23,59 arası bir saate baktığınızı varsayalım. Şimdi her gün gece yarısı bir şey olmasını istiyorsanız, şimdiki zaman mod 24'ün sıfır olmasını istersiniz:
eğer (saat% 24 == 0):
Tarihin tüm saatlerini 24 saat boyunca tekrar eden bir dairenin etrafına sararak düşünebilirsiniz ve günün mevcut saati sonsuz sayıda sayı 24'tür. döngülerle başa çıkmak ve bilgisayar biliminde çok önemlidir. Dizinin etrafına sarmak için de kullanılır, dizinin sonuna ulaştıktan sonra dizini sonuna kadar geri sarmak için modülü kullanır.
a % b = a - b * floor(a/b)
Python - Temel Operatörler
http://www.tutorialspoint.com/python/python_basic_operators.htm
Modulus - Sol el işlenenini sağ el işlenenine böler ve geri kalanını döndürür
a = 10 ve b = 20
b% a = 0
Çoğu dilde modül için% kullanılır . Python bir istisna değildir.
% Modulo operatörü, Google https://developers.google.com/edu/python/strings adresinde tanımlandığı şekilde dizeleri yazdırmak için de (tıpkı C gibi) kullanılabilir .
# % operator
text = "%d little pigs come out or I'll %s and %s and %s" % (3, 'huff', 'puff', 'blow down')
Bu konu biraz bitmiş gibi görünüyor ama kesinlikle birine yardımcı olacaktır.
x % y
bölmede kalan hesaplar x
bölünmesiyle y
burada bölüm bir tamsayıdır . Kalanın işareti var y
.
Python 3'te hesaplama elde edilir 6.75
; Bunun nedeni, /
Python 2'de (varsayılan olarak) tamsayı bölümü değil, gerçek bir bölünme yapılmasıdır. Python 2'de 1 / 4
sonuç aşağı yuvarlandığı için 0 verir.
Tamsayı bölümü, Python 3'te //
operatörle de yapılabilir , böylece 7'yi elde etmek için şunları yapabilirsiniz:
3 + 2 + 1 - 5 + 4 % 2 - 1 // 4 + 6
Ayrıca, sadece çizgi ekleyerek Python 2'de Python stil bölümünü alabilirsiniz.
from __future__ import division
her kaynak dosyadaki ilk kaynak kodu satırı olarak.
#
yorumlar içindir ve //
bir operatör.
Modül operatörü, genellikle tamsayılarda kalan bölümler için kullanılır, ancak Python'da kayan nokta sayıları için kullanılabilir.
http://docs.python.org/reference/expressions.html
% (Modulo) operatörü, ilk argümanın ikinciye bölünmesinden kalanını verir. Sayısal bağımsız değişkenler önce ortak bir türe dönüştürülür. Sıfır sağ argümanı ZeroDivisionError istisnasını yükseltir. Değişkenler kayan nokta sayıları olabilir, örn.,% 3.14 0.7, 0.34'e eşittir (3.14, 4 * 0.7 + 0.34'e eşit olduğundan.) Modulo operatörü her zaman ikinci işleneni (veya sıfır) ile aynı işarete sahip bir sonuç verir; sonucun mutlak değeri, ikinci işlenenin mutlak değerinden kesinlikle daha küçüktür [2].
Bu bir modulo işlemi değil, eski moda C tarzı dize biçimlendirme operatörü olması dışında bir modulo işlemi . Ayrıntılar için buraya bakın. Bunların çoğunu mevcut kodda göreceksiniz.
Farkında olmak
(3 +2 + 1 - 5) + (4 % 2) - (1/4) + 6
köşeli parantezlerde bile Python 3.4'te hesaplanırsa 7 yerine 6,75 olur.
Ve '/' operatörü de anlaşılması kolay değil (python2.7): deneyin ...
- 1/4
1 - 1/4
Bu biraz konu dışı, ancak yukarıdaki ifadeyi değerlendirirken dikkate alınmalıdır :)
(1)+(0)-(0.25)+(6)
.
% Çevrimiçi kullanımı için özel kullanım durumlarını kolayca bulmak benim için zordu, örneğin neden kesirli modül bölümü veya negatif modül bölümü yapmak cevabını veriyor. Umarım bu gibi soruların netleştirilmesine yardımcı olur:
Modül Bölümü Genel Olarak:
Modül bölme, matematiksel bölme işleminin geri kalanını döndürür. Aşağıdaki gibi yapar:
Diyelim ki 5 temettü ve 2 bölen var, aşağıdaki bölme işlemi (x'e eşittir) olurdu:
dividend = 5
divisor = 2
x = 5/2
Modül hesaplamasındaki ilk adım tamsayı bölme yapmaktır:
x_int = 5 // 2 (python'da tamsayı bölme çift eğik çizgi kullanır)
x_int = 2
Daha sonra, x_int çıktısı bölen ile çarpılır:
x_mult = x_int * bölen x_mult = 4
Son olarak, temettü x_mult'tan çıkarılır
temettü - x_mult = 1
Bu nedenle modül işlemi 1 döndürür:
% 5 2 = 1
Modülü bir kesriye uygulama
Example: 2 % 5
Bir fraksiyona uygulandığında modülün hesaplanması yukarıdaki ile aynıdır; ancak, bölen temettüden daha büyük olduğunda, tamsayı bölümünün sıfır değerine neden olacağını belirtmek önemlidir:
dividend = 2
divisor = 5
Tamsayı bölümü 0 ile sonuçlanırken; bu nedenle, yukarıdaki 3. adım gerçekleştirildiğinde, temettünün değeri (sıfırdan çıkarılır) üzerinden taşınır:
dividend - 0 = 2 —> 2 % 5 = 2
Modülü bir eksiğe uygulama
Kat bölümü, tamsayı bölümünün değerinin en düşük tamsayı değerine yuvarlandığı oluşur:
import math
x = -1.1
math.floor(-1.1) = -2
y = 1.1
math.floor = 1
Bu nedenle, tamsayı bölme yaptığınızda beklediğinizden farklı bir sonuç elde edebilirsiniz!
Yukarıdaki adımları aşağıdaki temettü ve bölen üzerine uygulamak, modül kavramını göstermektedir:
dividend: -5
divisor: 2
1. Adım: Tamsayı bölümünü uygulayın
x_int = -5 // 2 = -3
Adım 2: Tamsayı bölümünün sonucunu bölen ile çarpın
x_mult = x_int * 2 = -6
Adım 3: Temettüyü çarpılan değişkenten çıkarın, çift negatife dikkat edin.
dividend - x_mult = -5 -(-6) = 1
Bu nedenle:
-5 % 2 = 1
% (Modulo) operatörü, ilk argümanın ikinciye bölünmesinden kalanını verir. Sayısal bağımsız değişkenler önce ortak bir türe dönüştürülür.
3 + 2 + 1-5 + 4% 2-1 / 4 + 6 = 7
Bu, operatör önceliğine dayanır.
Bu bir modulo işlemi http://en.wikipedia.org/wiki/Modulo_operation
http://docs.python.org/reference/expressions.html
Operasyonların sırası ile,
(3 + 2 + 1-5) + (% 4 2) - (1/4) + 6
(1) + [0) - [0) + 6
7
1/4 = 0 çünkü burada tamsayı matematik yapıyoruz.
Birçok C benzeri dilde olduğu gibi, geri kalan veya modulo operasyonudur. Sayısal türler için belgelere bakın - int, float, long, complex .
Modulus - Sol el işlenenini sağ el işlenenine böler ve geri kalanını döndürür.
Eğer yardımcı olursa:
1:0> 2%6
=> 2
2:0> 8%6
=> 2
3:0> 2%6 == 8%6
=> true
... ve bunun gibi.