Koks yra % rezultatas Python kalboje?

Ką reiškia % skaičiavimuose? Atrodo, kad negaliu suprasti, ką jis daro.

Ar jis apskaičiuoja skaičiavimo procentą, pavyzdžiui: 4 % 2, matyt, yra lygus 0. Kaip?

Sprendimas

Operatorius % (modulo) duoda likutį, gautą pirmąjį argumentą padalijus iš antrojo. Skaitmeniniai argumentai pirmiausia konvertuojami į bendrą tipą. Nulinis dešinysis argumentas sukelia ZeroDivisionError išimtį. Argumentai gali būti skaičiai su slankiuoju kableliu, pvz., 3,14 %0,7 yra 0,34 (nes 3,14 yra 4*0,7 + 0,34). Operatorius modulo visada duoda rezultatą su tuo pačiu ženklu kaip ir antrasis operandas (arba nulį); absoliutinė rezultato vertė yra griežtai mažesnė už antrojo operando absoliutinę vertę [2].

Paimta iš http://docs.python.org/reference/expressions.html

1 pavyzdys: 6%2 įvertinama kaip 0, nes dalijant 6 iš 2 ( 3 kartus ) liekanos nėra.

2 pavyzdys: 7%2 įvertinama kaip 1, nes dalijant 7 iš 2 ( 3 kartus ) lieka 1.

Taigi, apibendrinant galima pasakyti, kad grąžinama dalijimo operacijos liekana arba 0, jei liekanos nėra. Taigi 6%2 reiškia, kad reikia rasti likutį, likusį dalijant 6 iš 2.

Komentarai (11)

Tokia išraiška, kaip x % y, įvertinama kaip x ÷ y likutis - techniškai tai yra "modulis", o ne "priminimas", todėl rezultatai gali skirtis, jei lyginate su kitomis kalbomis, kuriose % yra liekanos operatorius. Yra keletas subtilių skirtumų (jei jus domina praktinės pasekmės, taip pat žr. "Kodėl Python's Integer Division Floors" žemiau). Pirmenybė tokia pati kaip ir operatorių / (dalybos) ir * (daugybos).

>>> 9 / 2
4
>>> 9 % 2
1
  • 9 padalytas iš 2 yra lygus 4.
  • 4 padauginta iš 2 yra 8
  • 9 minus 8 yra 1 - likutis. Python gotcha: priklausomai nuo naudojamos Python versijos, % taip pat yra (nuvertėjęs) eilutės interpoliavimo operatorius, todėl saugokitės, jei esate atėję iš kalbos su automatiniu tipų atvaizdavimu (pvz., PHP ar JS), kurioje tokia išraiška kaip '12' % 2 + 3 yra teisėta: Python sistemoje tai sukels TypeError: not all arguments converted during string formatting (klaida: ne visi argumentai konvertuoti formuojant eilutę), o tai tikriausiai jus gerokai supainios. [atnaujinta Python 3] Vartotojo n00p komentarai:

    9/2 yra 4.5 Python. Reikia atlikti sveikųjų skaičių dalijimą taip: 9//2, jei norite, kad python pasakytų, kiek sveikų objektų liko po padalijimo(4). Tiksliau, sveikųjų skaičių dalijimas būdavo numatytasis Python 2 (turėkite omenyje, kad šis atsakymas yra senesnis už mano berniuką, kuris jau mokosi mokykloje, o tuo metu 2.x buvo paplitęs):

$ 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

Šiuolaikiniame "Python" 9 / 2 iš tiesų duoda 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

[atnaujinimas] Vartotojas dahiya_boy paklausė komentarų sesijoje: Ar galite paaiškinti, kodėl `11 % 5 = 4`` - dahiya_boy Tai keista, ar ne? Jei pabandysite tai padaryti JavaScript:

> -11 % 5
-1

Taip yra todėl, kad "JavaScript" kalba % yra "liekanos" operatorius, o "Python" kalba tai yra "modulio" (laikrodžio matematikos) operatorius.
Paaiškinimą galite gauti tiesiogiai iš GvR:

Redaguoti - dahiya_boy Java ir iOS 11 % 5 = -1, o python ir ruby 11 % 5 = 4. Pusę priežasties paaiškino Paulo Scardine, o likusią paaiškinimo dalį rasite čia "Java" ir "iOS" programose % nurodo likutį, t. y. padalijus 11 % 5 gaunamas Koeficientas = 2, o likutis = 1, o padalijus -11 % 5 gaunamas Koeficientas = -2, o likutis = -1. Kodo pavyzdys "swift iOS" sistemoje. [![čia įveskite paveikslėlio aprašymą][1]][1] Bet kai kalbame apie python, jis duoda laikrodžio modulį. Ir jis veikia pagal toliau pateiktą formulę mod(a,n) = a - {n * Floor(a/n)} Tai reiškia, mod(11,5) = 11 - {5 * Floor(11/5)} => 11 - {5 * 2} Taigi, mod(11,5) = 1 Ir mod(-11,5) = -11 - 5 * Floor(11/5) => -11 - {5 * (-3)}`` Taigi,mod(-11,5) = 4` Kodo pavyzdys, parašytas "Python 3.0." kalba [![čia įveskite paveikslėlio aprašymą][2]][2]

Kodėl "Python's" sveikųjų skaičių dalijimo grindys

Šiandien manęs (vėl) paprašė paaiškinti, kodėl "Python" programoje dalijant sveikuosius skaičius grąžinamas rezultato dugnas, užuot jį sutrumpinus iki nulio, kaip C.

Teigiamiems skaičiams tai nieko nuostabaus:

>>> 5//2
2

Tačiau jei vienas iš operandų yra neigiamas, rezultatas apvalinamas, t. y. apvalinamas nuo nulio (link neigiamos begalybės):

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

Kai kuriuos žmones tai trikdo, tačiau tam yra gera matematinė priežastis. Viso skaičiaus dalybos operacija (//) ir jos giminaitė modulo operacija (%) yra susijusios ir atitinka gražų matematinį ryšį (visi kintamieji yra sveikieji skaičiai):

a/b = q with remainder r

toks, kad

b*q + r = a and 0 = 0).
>
> Jei norite, kad sąryšis galiotų ir neigiamam a (išlaikant teigiamą b), turite du pasirinkimus: jei sutrumpinsite q link nulio, r taps neigiamas, todėl invariantas pasikeis į 0  Matematinėje skaičių teorijoje matematikai visada teikia pirmenybę pastarajam pasirinkimui (žr., pvz., [Vikipedija][3]). Python atveju pasirinkau tą patį, nes yra įdomių modulo operacijos taikymų, kai a ženklas neįdomus. Panagrinėkime POSIX laiko žymą (sekundės nuo 1970 m. pradžios) ir paverskime ją paros laiku. Kadangi diena turi 24*3600 = 86400 sekundžių, šis skaičiavimas yra tiesiog t % 86400. Tačiau jei laiką iki 1970 m. išreikštume neigiamais skaičiais, pagal "sutrumpinimo link nulio" taisyklę gautume beprasmį rezultatą! Naudojant grindų taisyklę viskas pavyksta puikiai.
>
> Kitas mano galvoje iškilęs pritaikymas - pikselių padėties skaičiavimas kompiuterinėje grafikoje. Esu tikras, kad jų yra ir daugiau.
>
> Beje, neigiamo b atveju viskas tiesiog apsiverčia, ir invariantas tampa:

0 >= r > b.



> Taigi, kodėl "C" to nedaro taip? Tikriausiai tuo metu, kai buvo kuriama C, aparatinė įranga to nepadarė. O techninė įranga tikriausiai to nedarė todėl, kad seniausioje techninėje įrangoje neigiami skaičiai buvo vaizduojami kaip "ženklas + dydis", o ne kaip šiais laikais (bent jau sveikiesiems skaičiams) naudojamas dviejų papildinių vaizdavimas. Mano pirmasis kompiuteris buvo Control Data mainframe ir jame sveikiesiems bei kintamiesiems skaičiams buvo naudojamas vieneto papildinys. 60 vienetų modelis reiškė neigiamą nulį!
>
> Timas Petersas, kuris žino, kur užkasti visi Pythono slankiojo kablelio skeletai, išreiškė tam tikrą susirūpinimą dėl mano noro išplėsti šias taisykles slankiojo kablelio moduliui. Jis tikriausiai teisus; taisyklė "truncate-towards-negative-infinity" gali lemti tikslumo praradimą x%1.0, kai x yra labai mažas neigiamas skaičius. Tačiau man to nepakanka, kad būtų pažeistas sveikųjų skaičių modulo, o // yra glaudžiai su juo susijęs.
>
> PS. Atkreipkite dėmesį, kad vietoj / naudoju // - tai Python 3 sintaksė, taip pat leidžiama Python 2, kad pabrėžtumėte, jog žinote, kad iškviečiate sveikųjų skaičių dalijimą. Operatorius / "Python 2" yra dviprasmiškas, nes jis grąžina kitokį rezultatą dviem sveikųjų skaičių operandams nei int ir float arba dviem float. Bet tai visiškai atskira istorija; žr. PEP 238.
>
> Posted by Guido van Rossum at 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
Komentarai (5)

Modulio operatorius, paprastai naudojamas sveikųjų skaičių liekanos dalijimui, tačiau Pythone gali būti naudojamas ir skaičiams su slankiuoju kableliu.

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

Operatorius % (modulo) duoda likutį, gautą pirmąjį argumentą padalijus iš antrojo. Skaitmeniniai argumentai pirmiausia konvertuojami į bendrą tipą. Nulinis dešinysis argumentas sukelia ZeroDivisionError išimtį. Argumentai gali būti skaičiai su slankiuoju kableliu, pvz., 3,14 %0,7 yra 0,34 (nes 3,14 yra 4*0,7 + 0,34). Operatorius modulo visada duoda rezultatą su tuo pačiu ženklu kaip ir antrasis operandas (arba nulį); absoliutinė rezultato vertė yra griežtai mažesnė už antrojo operando absoliutinę vertę [2].

Komentarai (0)