Python'da % ifadesinin sonucu nedir?

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?

Çözüm

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çin7%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.

Yorumlar (11)

x % ygibi bir ifadex ÷ 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
  • 9 bölü 2 eşittir 4.
  • 4 çarpı 2, 8 eder.
  • 9 eksi 8 1'dir - kalan. Python püf noktası: kullandığınız Python sürümüne bağlı olarak, % 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 Pythonda9/2gerçekten de4,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

Bunun nedeni JavaScript'te `%' "remainder" operatörü iken Python'da "modulus" (saat matematiği) operatörüdür.
Açıklamayı doğrudan GvR'den](http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html) edinebilirsiniz:

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ölerseniz Bölüm = 2 ve kalan = 1 ve -11 % 5 bölerseniz Bö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ışır mod(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 Ve mod(-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  (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 
> 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
  [1]: https://i.stack.imgur.com/33rAl.png
  [2]: https://i.stack.imgur.com/A9Q0C.png
  [3]: https://en.wikipedia.org/wiki/Modulo_operation
Yorumlar (5)

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].

Yorumlar (0)