Barcha qo'llanmalar

Python'da bo'lish: operator'lar, floor division va misollar

Python'dagi bo'lish operator'larini o'rganing: true division (/), floor division (//), modulo va divmod() — misollar, edge case'lar va keng tarqalgan xatolar bilan.

Muallif: Kimberly Fessel

Kompyuterlar bizga matematik hisob-kitoblarni juda yuqori tezlikda bajarish uchun ajoyib vositalarni taqdim etadi, lekin xayolimizdagi matematik masalalarni kodga aylantirish biz — odamlarning (yoki hech bo'lmaganda AI chatbot'larimizning) zimmasida. Siz o'rganib qolgan arithmetic operator'lar Python kabi dasturlash tillarida o'ziga xos belgilar bilan ifodalanadi. Ammo bo'lish masalasida Python bizga aslida ikki xil operator beradi: biri oddiy bo'lish uchun (/), ikkinchisi esa floor division uchun (//).

Ushbu maqolada biz Python'dagi bo'lishning ikki asosiy turini tahlil qilamiz va amaliy kod misollarini keltiramiz. Shuningdek, eng keng tarqalgan qo'llanish holatlari va yuzaga kelishi mumkin bo'lgan tuzoqlarni ham ko'rib chiqamiz. Qani, boshladik.

Python'da oddiy bo'lish (true division) (/)

Bo'lish haqida o'ylaganingizda, ehtimol, birinchi navbatda Python'ning bitta slash belgisi, /, bilan ifodalanadigan oddiy bo'lish operatori xayolingizga keladi. Bu operator qalam va qog'oz bilan hisoblaganda oladigan bo'lish natijalarini beradi:

print(4.0 / 2.0)
print(2.5 / 0.5)
print(1 / 2)

# Expected result:
# 2.0
# 5.0
# 0.5

Standart bo'lish (/) ba'zan “float division” deb ham ataladi, chunki u integer va float'lar ustida amal bajarganda floating-point son qaytaradi. Oxirgi misoldagidek ikkita integer'ni bo'ladigan kod yozganingizda ham Python baribir 0.5 degan floating-point qiymat qaytaradi. Kiruvchi qiymatlarning turlari aralash bo'lganda, masalan, integer'ni float'ga yoki aksincha bo'lganda ham true division float qaytarishda davom etadi.

Python'da floor division (//)

Python kodida sonlarni bo'lishning ikkinchi usuli floor division deb ataladi. U ikkita slash belgisi, //, bilan ifodalanadi. Floor division natijani pastga qarab eng yaqin butun songacha yaxlitlaydi. Quyida bir nechta misol keltirilgan:

print(4 // 2)
print(7 // 3)
print(7 // 4)
print(1 // 2)

# Expected result:
# 2
# 2
# 1
# 0

Bu misollarning barchasida integer'lar ishtirok etadi, shuning uchun floor division operatori (//) bizga integer qaytaradi. Biroq kiruvchi qiymatlardan biri floating-point son bo'lsa, floor division float qaytaradi. Quyida shu fikrni ko'rsatuvchi turli type'lar ishtirokidagi bir nechta misol keltirilgan:

print(4.0 // 2.0)
print(7.0 // 4)
print(7 // 4.5)
print(1 // 2.0)

# Expected result:
# 2.0
# 1.0
# 1.0
# 0.0

E'tibor bering, floor division operatori eng yaqin integer'ga yaxlitlamaydi; u har doim pastga yaxlitlaydi. Standart bo'lishda 7 / 4 = 1.75, lekin floor division'dan 1 olasiz, chunki u pastdagi keyingi integer'ga o'tadi.

Butun bo'linma va qoldiq: modulo (%) va divmod()

Python'da slash operatori, /, bilan oddiy bo'lishni bajarganingizda butun bo'linma va qoldiq haqida ko'p o'ylashingizga to'g'ri kelmaydi, chunki standart bo'lish natijani ma'lum o'nlik xonagacha aniqlikda taxminlab beradi. Floor division'da esa 7 ni 4 ga bo'lishni boshqacha tasavvur qilish mumkin: 4 soni 7 ning ichiga bir marta sig'adi va 3 ortib qoladi. Floor division bizga bo'linmani (1) beradi va qolganini (3) tashlab yuboradi.

Agar ortib qolgan miqdorni tashlab yubormasdan bilmoqchi bo'lsangiz, Python'ning modulo operatori, %, dan foydalanishingiz mumkin. Modulo operatori bo'lishning qoldig'ini beradi va u integer'lar bilan ham, float'lar bilan ham ishlaydi:

print(7 % 4)
print(7.5 % 4)
print(7 % 4.5)

# Expected result:
# 3
# 3.5
# 2.5

Va nihoyat, Python'ning divmod() funksiyasini ham sinab ko'rishingiz mumkin. divmod() funksiyasi Python'ning standart kod bazasining bir qismi, shuning uchun undan foydalanish uchun hech qanday qo'shimcha package import qilishingiz shart emas. U ikkita argument qabul qiladi: bo'lishdagi bo'linuvchi va bo'luvchi. Shundan so'ng funksiya ikkita qiymatdan iborat tuple qaytaradi: qiymatlaringizni bo'lishdan hosil bo'lgan bo'linma va qoldiq. Masalan:

print(divmod(7, 4))
print(divmod(1, 2))
print(divmod(7, 4.5))

# Expected result:
# (1, 3)
# (0, 1)
# (1.0, 2.5)

Python'dagi bo'lish operator'lari

Manfiy sonlar bilan floor division

Agar floor division'ni manfiy sonlarga qo'llasangiz nima bo'ladi? Yodda tutingki, floor division har doim minus cheksizlik tomon pastga yaxlitlaydi va manfiy sonlar holatida aslida yanada kichikroq manfiy son hosil bo'ladi.

Standart bo'lishda -3 / 2 = -1.5, lekin floor division'da eng yaqin integer'gacha pastga tushishda davom etasiz: -3 // 2 = -2. Bu g'ayritabiiy tuyulishi mumkin, lekin aslida -2 < -1.5. Floor division pastga yaxlitlaganda kichikroq manfiy son olasiz.

Misollar va real hayotdagi qo'llanish holatlari

Hozirgacha ko'rgan misollaringiz Python'da bo'lish qanday ishlashini aniq ko'rsatib beradi, lekin uni o'zlashtirib olgach, bo'lishdan murakkabroq vaziyatlarda ham foydalanishni xohlab qolasiz. Quyida Python kodidagi oddiy bo'lish va floor division operator'larining real hayotdagi qo'llanish holatlariga oid bir nechta misol keltirilgan.

  1. Konvertatsiya. Umumiy soniyalar soni berilganda, vaqt davomiyligini daqiqalarda qaytaring.

    hours = minutes / 60
    
  2. Sur'atlar. Transport vositasi ma'lum vaqt ichida bosib o'tgan masofaga qarab, uning qanchalik tez harakatlanganini aniqlang.

    speed = distance / time
    
  3. Pagination. Element qaysi sahifaga tegishli ekanini aniqlang (floor division).

    page = index // page_size
    
  4. Data bin'lari. Qiymatlarni oraliqlarga guruhlang (masalan, 0-9, 10-19 va h.k.)

    bin = value // bin_size
    

Keng tarqalgan xatolar: backslash va arithmetic precedence

Python'da bo'lishni bajarishga, ehtimol, tezda ko'nikib olasiz, lekin e'tibor berish kerak bo'lgan bir nechta keng tarqalgan muammo bor. Xatolardan qochish va bo'lish bilan yanada tezroq ishlay boshlash uchun ushbu maslahatlarni ko'rib chiqing.

Backslash ishlatmang

Avvalo, standart bo'lish (/) uchun ham, floor division (//) uchun ham oddiy slash belgisidan foydalanayotganingizga ishonch hosil qiling. Bu amallarning hech biri uchun backslash (\) ishlatmang. Aks holda quyidagiga o'xshash syntax error olasiz.

>>> 4\3 File "<python-input-1>", line 1 4\3 ^
SyntaxError: unexpected character after line continuation character

Arithmetic Operator Precedence

Python'da bo'lishni bajarayotganda operator'larning ustuvorligiga ham e'tibor qaratishingiz kerak. Python oddiy matematikadagi kabi arithmetic operator precedence qoidalariga amal qiladi. Agar PEMDAS qisqartmasini eslasangiz, hammasi joyida. PEMDAS — Parentheses (qavslar), Exponents (darajalar), Multiplication & Division (ko'paytirish va bo'lish) hamda Addition & Subtraction (qo'shish va ayirish) so'zlarining qisqartmasi. Matematik ifodada Python avval qavs ichidagi ifodalarni ichkaridan tashqariga qarab hisoblaydi. Keyin u ikkita yulduzcha (**) bilan ifodalanadigan barcha darajaga ko'tarish amallarini bajaradi. Shundan so'ng barcha ko'paytirish va bo'lish amallari chapdan o'ngga qarab bajariladi va nihoyat qo'shish va ayirish amallari, yana chapdan o'ngga qarab bajariladi.

Masalan, quyidagi tenglik:

6 + (5 - 1) / 2 ** 2 = 7

Python bu tenglikni quyidagi tartibda hisoblaydi:

  1. Qavslar: 5 - 1 = 4

  2. Darajalar: 2 ** 2 = 4

  3. Ko'paytirish va bo'lish: 4 / 4 = 1

  4. Qo'shish va ayirish 6 + 1 = 7

Agar boshqacha natija kerak bo'lsa, masalan, bo'lishdan oldin 6 ni bo'linuvchiga qo'shmoqchi bo'lsangiz, quyidagicha qo'shimcha qavslarni aniq qo'yishingiz kerak bo'ladi:

(6 + (5 - 1)) / 2 ** 2 = 2.5

Edge case'lar: nol, Boolean'lar va katta integer'lar

Keng tarqalgan xatolardan tashqari, shuni ham yodda tutingki, Python'da bo'lish ba'zi edge case'larda xato chiqarishi yoki kutilmagan natijalar berishi mumkin. Kodingizda bug'lar bo'lmasligiga ishonch hosil qilish uchun quyidagi vaziyatlarning har biriga e'tibor bering.

ZeroDivisionError

Python'da bo'lishni bajarayotganda ZeroDivisionError'ga duch kelishingiz mumkin. Bu sonni nolga bo'lishga uringaningizni bildiradi, bunga esa na standart matematikada, na kompyuter dasturlashda ruxsat berilmaydi. Odatda Python nolga bo'lish qayerda sodir bo'lganiga ishora berishga harakat qiladi, shunda siz xatoingizni tuzatishingiz mumkin. Masalan:

>>> (1 + 2) / (1 - 1)
Traceback (most recent call last):
  File "<python-input-2>", line 1, in <module>
    (1 + 2) / (1 - 1)
    ~~~~~~~~^~~~~~~~~
ZeroDivisionError: division by zero

1 - 1 = 0 bo'lgani uchun bu hisob-kitob bo'luvchi bo'la olmaydi, Python esa sizda ZeroDivisionError borligini bildiradi va muammo qayerdaligini ko'rsatadi.

Bo'lishda Boolean'lar

Python'da integer va float'larni bo'lish misollarini allaqachon ko'rdingiz, lekin True va False Boolean qiymatlarini ham bo'lishingiz mumkin. Arifmetik hisob-kitoblarda True va False qiymatlarini hisoblashda Python True'ni 1, False'ni esa 0 sifatida qabul qiladi. Quyida Python'da Boolean bo'lishga oid ba'zi misollar keltirilgan:

True / True = 1.0

False / True = 0.0

Faqat False'ga bo'lmaslikni unutmang, chunki u nol deb hisoblanadi, Python'da esa bunga ruxsat berilmaydi. Agar tasodifan False'ga bo'lib qo'ysangiz, yuqorida muhokama qilinganidek ZeroDivisionError'ni ko'rasiz.

Juda katta integer qiymatlar uchun bo'lish

Python'dagi oddiy bo'lish (/) odatda float qaytaradi, uning aniqligi esa taxminan 15-17 raqam bilan cheklangan. Juda katta (musbat yoki manfiy) integer'larni bo'lganingizda, standart bo'lish bilan taxminiy natija olasiz:

10 ** 60 / 3 = 3.3333333333333335e+59

Ko'plab boshqa tillardan farqli o'laroq, Python arbitrary-precision integer'lardan foydalanadi, shuning uchun int data type faqat kompyuteringiz xotirasi bilan cheklangan. Agar buning o'rniga integer floor division'dan foydalansangiz, aniq natija olasiz:

10 ** 60 // 3 = 333333333333333333333333333333333333333333333333333333333333

Kerak bo'lsa, so'ngra Python'ning modulus amali yordamida qoldiqni olishingiz mumkin:

10 ** 60 % 3 = 1

Foydalanuvchi kiritgan ma'lumotlarni bo'lish

Kodingiz foydalanuvchi kiritgan ma'lumotlarni bo'ladigan bo'lsa, foydalanuvchi mantiqan to'g'ri qiymatlar kiritganiga ishonch hosil qilish uchun himoya choralarini qo'shishingiz kerak bo'ladi. Quyidagilarni tekshiring:

  • Qiymatlar integer, float yoki shunday deb qabul qilinishi mumkin bo'lgan qiymatlar ekanini.

  • Bo'luvchi nolga teng emasligini.

To'g'ri input data type'larini tekshirish uchun Python'ning isinstance() funksiyasidan foydalanishingiz mumkin, shuningdek foydalanuvchiga fikr-mulohaza bildirib, bo'luvchisi nolga teng chiqsa, uni ogohlantirishingiz kerak.

Foydalanuvchi, ehtimol, standart bo'lishni kutadi, shuning uchun dasturingiz floor division'dan foydalansa, buni albatta aytib qo'ying. Shuningdek, foydalanuvchi qiymatlari juda katta bo'lsa, dasturingiz nima qilishi kerakligini ham o'ylab ko'ring. Aniqrog'i, oddiy bo'lish yetarlicha aniqlik beradimi, floor division va modulus'ga o'tish kerakmi yoki juda katta qiymatlarni input sifatida qabul qilmaslik kerakmi — shuni hal qilishingiz kerak.

Xulosa

Turli xil matematik vazifalar uchun sonlarni tezda bo'lishda Python kodidan foydalanishingiz mumkin. Hatto ikkita bo'lish operatoridan birini tanlash imkoniga ham ega bo'lasiz: odatda floating point natija beradigan standart bo'lish operatori (/) yoki pastga yaxlitlab, butun son natija beradigan floor division operatori (//).

Agar Python'da bo'lishni amalga oshirish bo'yicha ko'proq mashq qilmoqchi bo'lsangiz, quyidagi prompt'dan boshlab AI tutor'ni sinab ko'ring:

Yo'l xaritalariQo'llanmalarFAQYouTube

yo'lxaritaroadmap.shasosida

Hamjamiyat tomonidan yaratilgan yo'l xaritalari, eng yaxshi amaliyotlar, loyihalar, maqolalar, manbalar va yo'nalishlar — o'z yo'lingizni tanlash va kasbingizda o'sish uchun.

© yo'lxarita·Shartlar·Maxfiylik·

roadmap.sh

Barcha kontent roadmap.sh loyihasidan olingan (© Kamran Ahmed) va shaxsiy o'rganish uchun o'zbek tiliga tarjima qilinmoqda.

Qidiruv

Yo'l xaritalari, loyihalar va savollarni qidiring