Bir hesaplamadaki %
ne işe yarar? Ne işe yaradığını anlayamıyorum.
Hesaplamanın bir yüzdesini hesaplıyor mu, örneğin: 4 % 2
görünüşe göre 0'a eşittir. Nasıl?
gt;% (modulo) işleci, ilk bağımsız değişkenin ikinciye bölümünden kalanı verir. Sayısal bağımsız değişkenler önce ortak bir türe dönüştürülür. Sıfır sağ bağımsız değişken ZeroDivisionError istisnasını yükseltir. Bağımsız değişkenler kayan noktalı sayılar olabilir, örneğin, 3,14%0,7 eşittir 0,34 (3,14 eşittir 4*0,7 + 0,34.) Modulo işleci her zaman ikinci işleneniyle aynı işarete sahip (veya sıfır) bir sonuç verir; sonucun mutlak değeri, ikinci işlenenin mutlak değerinden kesinlikle daha küçüktür [2].
http://docs.python.org/reference/expressions.html adresinden alınmıştır.
Örnek 1:
6%2`0
olarak değerlendirilir çünkü 6 2`ye bölünürse (3 kez) kalan olmaz.
Örnek 2: 7, 2ye bölündüğünde (3 kez)
1kalan olduğu için
7%2`1
olarak değerlendirilir.
Özetlemek gerekirse, bir bölme işleminin kalanını veya kalan yoksa 0
değerini döndürür. Yani 6%2
, 6'nın 2'ye bölümünden kalanı bulmak anlamına gelir.
x % ygibi bir ifade
x ÷ ynin kalanı olarak değerlendirilir - teknik olarak "hatırlatıcı" yerine "modül" olduğundan,
%nin kalan operatörü olduğu diğer dillerle karşılaştırıyorsanız sonuçlar farklı olabilir. [Bazı ince farklılıklar vardır](https://rob.conery.io/2018/08/21/mod-and-remainder-are-not-the-same/) (pratik sonuçlarla ilgileniyorsanız ayrıca "Neden Python'ın Tamsayı Bölme Katları" bölümüne bakınız). Öncelik
/(bölme) ve
*` (çarpma) operatörleri ile aynıdır.
>>> 9 / 2
4
>>> 9 % 2
1
%
aynı zamanda (kullanımdan kaldırılmış) string interpolasyon operatörüdür, bu nedenle '12' % 2 + 3
gibi bir ifadenin yasal olduğu otomatik tip dökümüne sahip bir dilden (PHP veya JS gibi) geliyorsanız dikkat edin: Python'da TypeError: not all arguments converted during string formatting
ile sonuçlanacaktır ve bu muhtemelen sizin için oldukça kafa karıştırıcı olacaktır.
[Python 3 için güncelleme]
Kullanıcı n00p yorumları:9/2 python'da 4.5'tir. Bu şekilde tamsayı bölme işlemi yapmalısınız: Python'un size bölme(4) işleminden sonra kaç tane tam nesne kaldığını söylemesini istiyorsanız 9//2. Kesin olmak gerekirse, tamsayı bölme Python 2'de varsayılan olarak kullanılıyordu (dikkat edin, bu cevap zaten okulda olan oğlumdan daha eski ve o zamanlar 2.x ana akımdı):
$ 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 Pythonda
9/2gerçekten de
4,5` sonucunu verir:
$ 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. Lütfen neden
-11 % 5 = 4
olduğunu açıklar mısınız - dahiya_boy Bu garip, değil mi? Bunu JavaScript'te denerseniz:
> -11 % 5
-1
Düzenle - dahiya_boy Java ve iOS'ta
-11 %5 = -1
iken python ve ruby'de-11 %5 = 4
. Bunun nedeninin yarısı Paulo Scardine tarafından açıklanmıştır ve açıklamanın geri kalanı aşağıda yer almaktadır Java ve iOS'ta,%
kalanı verir, yani 11 % 5 bölersenizBölüm = 2 ve kalan = 1
ve -11 % 5 bölersenizBölüm = -2 ve kalan = -1
verir. Swift iOS'ta örnek kod. [![resim açıklamasını buraya girin][1]][1] Ancak python'da konuştuğumuzda saat modülünü verir. Ve aşağıdaki formül ile çalışırmod(a,n) = a - {n * Floor(a/n)}
Bu şu demek,mod(11,5) = 11 - {5 * Floor(11/5)} => 11 - {5 * 2}
Yani,mod(11,5) = 1
Vemod(-11,5) = -11 - 5 * Floor(11/5) => -11 - {5 * (-3)}
Yani,mod(-11,5) = 4
Python 3.0.'da örnek kod [![resim açıklamasını buraya girin][2]][2]Neden Python'un Tamsayı Bölme Katları
Bugün benden (yine) Python'daki tamsayı bölme işleminin neden C'deki 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 nedeni var. Tamsayı bölme işlemi (//) ve onun kardeşi olan modulo işlemi (%) birlikte çalışır ve güzel bir matematiksel ilişkiyi karşılar (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 için uzamasını istiyorsanız (b pozitif kalsın), iki seçeneğiniz vardır: q'yu sıfıra doğru keserseniz, r negatif olur, böylece değişmez 0 <= abs(r) < olarak değişir; aksi takdirde, q'yu negatif sonsuza doğru katlayabilirsiniz ve değişmez 0 <= r < b olarak kalır.
Matematiksel sayı teorisinde, matematikçiler her zaman ikinci seçeneği tercih ederler (bkz. örneğin [Wikipedia][3]). Python için ben de aynı seçimi yaptım çünkü a işaretinin ilginç olmadığı modulo işleminin bazı ilginç uygulamaları vardır. Bir POSIX zaman damgasını (1970'in başından bu yana geçen saniye) alıp günün saatine dönüştürmeyi düşünün. Bir günde 24*3600 = 86400 saniye olduğundan, bu hesaplama basitçe t % 86400'dür. Ancak 1970'ten önceki zamanları negatif sayılar kullanarak ifade edecek olsaydık, "sıfıra doğru kes" kuralı anlamsız bir sonuç verirdi! Taban kuralını kullanarak her şey yolunda gider.
Aklıma gelen diğer uygulamalar bilgisayar grafiklerindeki piksel konumlarının hesaplanmasıdır. Eminim daha fazlası da vardır.
Bu arada, negatif b için her şey tersine döner ve değişmez olur:
0 >= r > b.
Peki C neden bu şekilde yapmıyor? Muhtemelen C tasarlandığında donanım bunu yapmıyordu. Ve muhtemelen donanım bunu bu şekilde yapmıyordu çünkü en eski donanımlarda negatif sayılar bugünlerde kullanılan ikiye tümleyen gösterimi yerine "işaret + büyüklük" olarak gösteriliyordu (en azından tamsayılar için). İlk bilgisayarım bir Control Data anabilgisayarıydı ve tamsayıların yanı sıra kayan sayılar için de bir'e tümleyen kullanıyordu. 60 birli bir desen negatif sıfır anlamına geliyordu!
Python'un tüm kayan nokta iskeletlerinin nerede gömülü olduğunu bilen Tim Peters, bu kuralları kayan nokta modülüne genişletme isteğim hakkında bazı endişelerini dile getirdi. Muhtemelen haklı; truncate-towards-negative-infinity kuralı, x çok küçük bir negatif sayı olduğunda x%1.0 için hassasiyet kaybına neden olabilir. Ancak bu benim için tamsayı modulo'yu bozmak için yeterli değil ve // buna sıkı sıkıya bağlı.
Not. yerine // kullandığıma dikkat edin -- bu Python 3 sözdizimidir ve Python 2'de de tamsayı bölme işlemini çağırdığınızı bildiğinizi vurgulamak için izin verilir. Python 2'deki / operatörü belirsizdir, çünkü iki tamsayı işlenen için bir int ve bir float veya iki float için farklı bir sonuç döndürür. Ancak bu tamamen ayrı bir hikaye; PEP 238'e bakın.
Guido van Rossum tarafından 9:49 AM'de gönderildi
Modül operatörü, tipik olarak tamsayılarda kalan bölme işlemi için kullanılır, ancak Python'da kayan noktalı sayılar için de kullanılabilir.
http://docs.python.org/reference/expressions.html
% (modulo) işleci, ilk bağımsız değişkenin ikinciye bölümünden kalanı verir. Sayısal bağımsız değişkenler önce ortak bir türe dönüştürülür. Sıfır sağ bağımsız değişken ZeroDivisionError istisnasını yükseltir. Bağımsız değişkenler kayan noktalı sayılar olabilir, örneğin, 3,14%0,7 eşittir 0,34 (3,14 eşittir 4*0,7 + 0,34.) Modulo işleci her zaman ikinci işleneniyle aynı işarete sahip (veya sıfır) bir sonuç verir; sonucun mutlak değeri, ikinci işlenenin mutlak değerinden kesinlikle daha küçüktür [2].