Mikä on %:n tulos Pythonissa?

Mitä tarkoittaa % laskutoimituksessa? En saa selville, mitä se tekee.

Laskeeko se prosenttiluvun esimerkiksi seuraavasti: 4 % 2 on ilmeisesti yhtä kuin 0. Miten?

Ratkaisu

% (modulo) -operaattori tuottaa jäännösosan, joka saadaan jakamalla ensimmäinen argumentti toisella. Numeeriset argumentit muunnetaan ensin yhteiseen tyyppiin. Nolla oikealla oleva argumentti aiheuttaa ZeroDivisionError-poikkeuksen. Argumentit voivat olla liukulukuja, esimerkiksi 3,14%0,7 on 0,34 (koska 3,14 on 4*0,7 + 0,34.) Modulo-operaattori tuottaa aina tuloksen, jolla on sama merkki kuin sen toisella operandilla (tai nolla); tuloksen absoluuttinen arvo on ehdottomasti pienempi kuin toisen operandin absoluuttinen arvo [2].

Otettu osoitteesta http://docs.python.org/reference/expressions.html

Esimerkki 1: 6%2 on 0, koska jäännöstä ei jää, jos 6 jaetaan 2:lla ( 3 kertaa ).

Esimerkki 2: 7%2 on 1, koska jäännös on 1, kun 7 jaetaan 2:lla ( 3 kertaa ).

Yhteenvetona voidaan siis sanoa, että se palauttaa jako-operaation jäännöksen tai 0, jos jäännöstä ei ole. Joten 6%2 tarkoittaa, että jaetaan 6:n jäännös jaettuna 2:lla.

Kommentit (11)

Lauseke kuten x % y on x ÷ y:n jäännös - no, teknisesti se on "moduuli" eikä "jäännös" joten tulokset voivat olla erilaisia, jos verrataan muihin kieliin, joissa % on jäännösoperaattori. On joitakin hienovaraisia eroja (jos olet kiinnostunut käytännön seurauksista, katso myös "Why Python's Integer Division Floors" alla). Etusija on sama kuin operaattoreilla / (jako) ja * (kertolasku).

>>> 9 / 2
4
>>> 9 % 2
1
  • 9 jaettuna 2:lla on yhtä kuin 4.
  • 4 kertaa 2 on 8
  • 9 miinus 8 on 1 - jäännös. Pythonin ongelma: käyttämästäsi Python-versiosta riippuen % on myös (vanhentunut) merkkijonojen interpolointioperaattori, joten varo, jos tulet kielestä, jossa on automaattinen tyypinvalinta (kuten PHP tai JS), jossa lauseke '12' % 2 + 3 on laillinen: Pythonissa se johtaa TypeError: not all arguments converted during string formating, mikä on luultavasti melko hämmentävää sinulle. [päivitys Python 3:lle] Käyttäjän n00p-kommentit:

    9/2 on 4.5 pythonissa. Sinun on tehtävä kokonaislukujen jako näin: 9//2, jos haluat pythonin kertovan, kuinka monta kokonaista objektia on jäljellä jakamisen(4) jälkeen. Tarkalleen ottaen kokonaislukujako oli oletuksena Python 2:ssa (tämä vastaus on vanhempi kuin poikani, joka on jo koulussa ja 2.x:n aikaan oli valtavirtaa):

$ 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

Nykyaikaisessa Pythonissa 9 / 2 tuottaa todellakin 4.5:

$ 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

[päivitys] Käyttäjä dahiya_boy kysyi kommentti-istunnossa:

Q. Voitko selittää, miksi -11 % 5 = 4 - dahiya_boy Tämä on outoa, eikö? Jos kokeilet tätä JavaScriptissä:

> -11 % 5
-1

Tämä johtuu siitä, että JavaScriptissä % on "jäännös" -operaattori, kun taas Pythonissa se on "moduuli" (kellomatematiikka) -operaattori.
Saat selityksen suoraan GvR:stä:

Muokattu - dahiya_boy Javassa ja iOS:ssä -11 % 5 = -1 kun taas pythonissa ja rubyssä -11 % 5 = 4. No puolet syystä on selitetty Paulo Scardine, ja loput selityksestä on alla täällä Javassa ja iOS:ssä % antaa jäännösosan, eli jos jaat 11 % 5 antaa Quortientti = 2 ja jäännösosa = 1 ja -11 % 5 antaa Quortti = -2 ja jäännösosa = -1. Esimerkkikoodi swift iOS:ssä. [![Kirjoita kuvan kuvaus tähän][1]][1][1][1] Mutta kun puhumme pythonissa sen antaa kellomoduulin. Ja se toimii alla olevalla kaavalla mod(a,n) = a - {n * Floor(a/n)}`` Se tarkoittaa, mod(11,5) = 11 - {5 Floor(11/5)} => 11 - {5 2}. Siis `mod(11,5) = 1`. Ja `mod(-11,5) = -11 - 5 * Floor(11/5) => -11 - {5 * (-3)}. Siis mod(-11,5) = 4. Esimerkkikoodi pythonilla 3.0. [![Kirjoita kuvan kuvaus tähän][2]][2][2][2]

Miksi Python'n kokonaislukujen jakokerrokset

Minua pyydettiin (jälleen) tänään selittämään, miksi kokonaislukujen jakaminen Pythonissa palauttaa tuloksen alakerran sen sijaan, että se typistettäisiin nollaan kuten C:ssä.

Positiivisten lukujen osalta ei ole yllätys:

>>> 5//2
2

Mutta jos toinen operandeista on negatiivinen, tulos lattioitetaan eli pyöristetään poispäin nollasta (kohti negatiivista ääretöntä):

>>> -5//2
-3
>>> 5//-2
-3

Tämä häiritsee joitakin ihmisiä, mutta siihen on hyvä matemaattinen syy. Kokonaislukujen jako-operaatio (//) ja sen sisarus, modulo-operaatio (%), sopivat yhteen ja täyttävät mukavan matemaattisen suhteen (kaikki muuttujat ovat kokonaislukuja):

a/b = q with remainder r

siten, että

b*q + r = a and 0  (olettaen, että a ja b ovat >= 0).
>
> Jos haluat suhteen ulottuvan negatiiviselle a:lle (pitäen b:n positiivisena), sinulla on kaksi vaihtoehtoa: jos katkaiset q:n kohti nollaa, r:stä tulee negatiivinen, jolloin invariantti muuttuu 0 
> Muita mieleeni tulleita sovelluksia ovat pikselien sijainnin laskeminen tietokonegrafiikassa. Olen varma, että niitä on muitakin.
>
> Negatiivisen b:n tapauksessa kaikki muuten vain kääntyy, ja invariantti muuttuu:

0 >= r > b.



> Miksi C ei siis tee sitä näin? Luultavasti laitteisto ei tehnyt tätä silloin, kun C:tä suunniteltiin. Ja laitteisto ei luultavasti tehnyt sitä näin, koska vanhimmissa laitteistoissa negatiiviset luvut esitettiin "merkki + suuruus" eikä nykyään käytetyn kahden komplementin esityksen sijaan (ainakin kokonaisluvuille). Ensimmäinen tietokoneeni oli Control Datan keskusyksikkö, ja se käytti kokonaislukujen ja liukulukujen osalta yhden komplementin esitystä. Kuvio, jossa oli 60 ykköstä, tarkoitti negatiivista nollaa!
>
> Tim Peters, joka tietää, mihin kaikki Pythonin liukulukulukuluurankoja on haudattu, on ilmaissut huolensa halustani laajentaa nämä säännöt liukulukumoduloihin. Hän'on luultavasti oikeassa; typistää-negatiivisen äärettömyyden suuntaan -sääntö voi aiheuttaa tarkkuuden menetyksen x%1.0:lle, kun x on hyvin pieni negatiivinen luku. Mutta se ei riitä minulle rikkomaan kokonaislukumodulointia, ja // on tiukasti sidoksissa siihen.
>
> PS. Huomaa, että käytän //:tä /:n sijasta -- tämä on Python 3:n syntaksi, ja se sallitaan myös Python 2:ssa korostamaan, että tiedät kutsuvasi kokonaislukujen jakamista. Python 2:n /-operaattori on moniselitteinen, koska se palauttaa eri tuloksen kahdelle kokonaislukuoperaattorille kuin int:lle ja floatille tai kahdelle floatille. Mutta se on täysin erillinen juttu; katso PEP 238.
>
> Lähettäjä Guido van Rossum klo 9:49 AM
  [1]: https://i.stack.imgur.com/33rAl.png
  [2]: https://i.stack.imgur.com/A9Q0C.png
  [3]: https://en.wikipedia.org/wiki/Modulo_operation
Kommentit (5)

Modulus-operaattoria käytetään yleensä kokonaislukujen jäännösjakoon, mutta Pythonissa sitä voidaan käyttää myös liukuluvuille.

http://docs.python.org/reference/expressions.html

% (modulo) -operaattori tuottaa jäännösosan, joka saadaan jakamalla ensimmäinen argumentti toisella. Numeeriset argumentit muunnetaan ensin yhteiseen tyyppiin. Nolla oikealla oleva argumentti aiheuttaa ZeroDivisionError-poikkeuksen. Argumentit voivat olla liukulukuja, esimerkiksi 3,14%0,7 on 0,34 (koska 3,14 on 4*0,7 + 0,34.) Modulo-operaattori antaa aina tuloksen, jolla on sama merkki kuin sen toisella operandilla (tai nolla); tuloksen absoluuttinen arvo on ehdottomasti pienempi kuin toisen operandin absoluuttinen arvo [2].

Kommentit (0)