OzbekPython / Bob 02

Sonlar va özgaruvçilar

Butun va kasr sonlar, özgaruvçilarni nomlaş qoidalari, arifmetik amallar, yaxlitlaş va pul hisobida Decimal bilan işlaş.

Boşlanğiç daraja24 daqiqa21 kod misoli2 / 24

Nima uçun sonlardan boşlaymiz?

Deyarli har bir dastur sonlar bilan işlaydi: dökon savatçasidagi jami summa, talabaning örtaça bahosi, ob-havo harorati, bank kartasidagi qoldiq. Şuning uçun Python sonlarni qanday saqlaşi va ular ustida qanday amallar bajarişini yaxşi biliş juda muhim.

Bu bobda sonlar bilan birga özgaruvçilar bilan ham tanişamiz — ularsiz heç qanday jiddiy dastur yozib bölmaydi.

Butun sonlar: int

Butun sonlar — kasr qismi bölmagan sonlar: 7, 0, -15, 2026. Pythonda ularning turi int (inglizça integer) deb ataladi.

Python
print(42)
print(-8)
print(type(42))
print(2 ** 100)

Natija:

Natija
42
-8
<class 'int'>
1267650600228229401496703205376

type() funksiyasi qiymatning turini aytib beradi. Bu funksiyani keyingi boblarda köp işlatamiz.

Oxirgi qatorga qarang: Pythonda butun sonlarning çegarasi yöq. Boşqa ayrim tillarda juda katta sonlar "toşib ketadi", Python esa xotira yetgunça istalgan uzunlikdagi sonni saqlay oladi.

Katta sonlarni öqiş oson qiliş

1000000000 sonida neçta nol borligini bir qaraşda aytiş qiyin. Python sonlar içida pastki çiziq _ işlatişga ruxsat beradi. U faqat köz uçun — qiymatga heç qanday taʼsir qilmaydi:

Python
oylik_byudjet = 12_500_000   # söm
aholi = 37_000_000
print(oylik_byudjet)
print(aholi)

Natija:

Natija
12500000
37000000

Kasr sonlar: float

Nuqtali sonlar float turiga kiradi: 3.14, -0.5, 36.6. Eʼtibor bering: Pythonda kasr qismi vergul bilan emas, nuqta bilan ajratiladi.

Python
harorat = 36.6
dollar_kursi = 12650.5
print(harorat, type(harorat))
print(dollar_kursi)
print(2.5e6)

Natija:

Natija
36.6 <class 'float'>
12650.5
2500000.0

2.5e6 — bu ilmiy yozuv: 2.5 × 10⁶, yaʼni 2 500 000. Juda katta yoki juda kiçik sonlar uçun qulay.

Kompleks sonlar (qisqaça)

Python matematikadagi kompleks sonlarni ham biladi. Mavhum birlik i örniga j harfi işlatiladi:

Python
z = 3 + 4j
print(z, type(z))
print(z.real, z.imag)

Natija:

Natija
(3+4j) <class 'complex'>
3.0 4.0

Kundalik dasturlarda kompleks sonlar kam uçraydi — ular asosan muhandislik va fizika hisob-kitoblarida kerak. Şuning uçun ularni faqat bilib qöyiş yetarli.

Özgaruvçilar

Özgaruvçi — qiymatga berilgan nom. Uni yorliq deb tasavvur qiling: siz qiymatga yorliq yopiştirasiz va keyin unga şu nom orqali murojaat qilasiz. Qiymat beriş uçun = belgisi işlatiladi:

Python
narx = 15000
soni = 4
jami = narx * soni
print(jami)

Natija:

Natija
60000

Bu yerda = matematikadagi "teng" emas. U "öng tomondagi qiymatni hisobla va çap tomondagi nomga boğla" degan buyruq. Şuning uçun quyidagi kod mutlaqo töğri:

Python
ball = 70
print(ball)
ball = ball + 15
print(ball)

Natija:

Natija
70
85

Ikkinçi qatorda Python avval ball + 15 ni hisoblaydi (70 + 15 = 85), keyin natijani yana ball nomiga boğlaydi.

Bir qatorda bir neçta özgaruvçiga qiymat beriş ham mumkin: x, y, z = 1, 2, 3 yozuvi uçta özgaruvçiga navbati bilan qiymat beradi, a = b = 0 esa ikkalasiga bir xil qiymat beradi.

Özgaruvçilarni nomlaş qoidalari

Python nomlarga qatʼiy talablar qöyadi:

  • Nom harf yoki _ bilan boşlanişi kerak, raqam bilan boşlanmaydi: talaba1 — töğri, 1talaba — xato.
  • Nomda faqat harflar, raqamlar va _ bölişi mumkin. Böş joy, -, ! kabi belgilar taqiqlangan.
  • Katta va kiçik harflar farqlanadi: Narx va narx — ikki xil özgaruvçi.
  • if, for, class, True kabi kalit sözlarni nom sifatida işlatib bölmaydi.

Bundan taşqari, Python hamjamiyati kelişib olgan uslub qöllanmasi — PEP 8 bor. Unga köra:

  • Özgaruvçi nomlari kiçik harflarda, sözlar pastki çiziq bilan ajratiladi. Bu uslub snake_case deyiladi: oylik_maosh, talaba_soni.
  • Nom maʼnoli bölsin: x emas, narx; a2 emas, kitoblar_soni.
  • Özgarmas qiymatlar (konstantalar) katta harflarda yoziladi: QQS_STAVKASI = 0.12.
  • Nomlarda faqat lotin harflaridan foydalaning — oʻ yoki gʻ dagi belgini nomga qöymang.
NomHolatiIzoh
kitob_narxi✅ yaxşisnake_case, maʼnoli
KitobNarxi⚠️ işlaydibu uslub klasslar uçun
kn⚠️ işlaydinimaligini tuşunib bölmaydi
kitob-narxi❌ xato- ayiriş amali deb tuşuniladi
2narx❌ xatoraqam bilan boşlangan
class❌ xatokalit söz

Izohlar

# belgisidan keyingi matn izoh hisoblanadi va bajarilmaydi. Izoh alohida qatorda yoki kod bilan bir qatorda bölişi mumkin. PEP 8 böyiça qator oxiridagi izohdan oldin kamida ikkita böş joy qoldiriladi:

Python
# Ijara tölovini hisoblaş
oylik_ijara = 3_000_000  # söm
oylar = 12
print(oylik_ijara * oylar)  # bir yillik tölov

Natija:

Natija
36000000

Arifmetik amallar

Pythonda yettita asosiy arifmetik amal bor:

AmalMaʼnosiMisolNatija
+qöşiş7 + 310
-ayiriş7 - 34
*köpaytiriş7 * 321
/böliş7 / 23.5
//butun böliş7 // 23
%qoldiq7 % 21
**darajaga kötariş7 ** 249
Python
print(7 + 3, 7 - 3, 7 * 3)
print(7 / 2)
print(8 / 2)
print(7 // 2, 7 % 2)
print(2 ** 10)

Natija:

Natija
10 4 21
3.5
4.0
3 1
1024

Muhim jihat: / amali har doim float qaytaradi, hatto sonlar qoldiqsiz bölinsa ham (8 / 2 → 4.0).

// va % amallari birgalikda juda foydali. Masalan, minutlarni soat va minutga ajratamiz:

Python
umumiy_minut = 135
soat = umumiy_minut // 60
minut = umumiy_minut % 60
print(soat, "soat", minut, "minut")

Natija:

Natija
2 soat 15 minut

% yordamida sonning juft yoki toq ekanini ham biliş mumkin: agar son % 2 nolga teng bölsa, son juft. Darajaga kötariş esa ildiz oliş uçun ham işlaydi: 81 ** 0.5 kvadrat ildizni, yaʼni 9.0 ni beradi.

Amallar ketma-ketligi

Python amallarni matematikadagi kabi tartibda bajaradi:

  1. Qavs içidagi ifodalar ()
  2. Darajaga kötariş **
  3. Köpaytiriş va böliş turidagi amallar *, /, //, %
  4. Qöşiş va ayiriş +, -

Bir xil darajadagi amallar çapdan öngga bajariladi. Yagona istisno — **: u öngdan çapga bajariladi.

Python
print(2 + 3 * 4)
print((2 + 3) * 4)
print(10 - 4 - 3)
print(2 ** 3 ** 2)
print(-3 ** 2)

Natija:

Natija
14
20
3
512
-9

Oxirgi ikki natijaga diqqat qiling. 2 ** 3 ** 2 — bu 2 ** 9, yaʼni 512 (64 emas). -3 ** 2 esa -(3 ** 2) deb hisoblanadi, çunki daraja minus belgisidan kuçliroq.

Amaliy misol — uç fandan olingan baholarning örtaçasi:

Python
matematika = 85
fizika = 92
ingliz_tili = 78
ortacha = (matematika + fizika + ingliz_tili) / 3
print(ortacha)

Natija:

Natija
85.0

Agar qavslarni unutsak, matematika + fizika + ingliz_tili / 3 faqat oxirgi bahoni 3 ga bölib qöyardi — natija butunlay notöğri çiqardi.

Qisqartirilgan amallar: +=, -= va boşqalar

Özgaruvçini özgartirib, yana öziga yoziş şunçalik köp uçraydiki, buning uçun maxsus qisqa yozuv bor:

Uzun yozuvQisqa yozuv
x = x + 5x += 5
x = x - 5x -= 5
x = x * 5x *= 5
x = x / 5x /= 5
x = x // 5x //= 5
x = x % 5x %= 5
x = x ** 5x **= 5
Python
hisob = 100_000      # kartadagi qoldiq
hisob += 250_000     # oylik stipendiya tuşdi
hisob -= 45_000      # bozorlik
hisob -= 12_000      # telefon uçun tölov
print(hisob)

Natija:

Natija
293000

Yaxlitlaş: round()

round(son, n) sonni verguldan keyin n ta xonagaça yaxlitlaydi. n berilmasa, butun songaça yaxlitlab, int qaytaradi:

Python
print(round(3.14159, 2))
print(round(12650.567))
print(round(1234567, -3))
print(round(2.5), round(3.5))

Natija:

Natija
3.14
12651
1235000
2 4

Oxirgi qatorga eʼtibor bering: round(2.5) → 2, round(3.5) → 4. Python aniq örtadagi sonlarni eng yaqin juft songa yaxlitlaydi. Bu "bank yaxlitlaşi" deyiladi va köp sonlarni qöşganda xatolar töplanib qolmasligi uçun işlatiladi. Manfiy n esa önliklar, yuzliklar, mingliklarga yaxlitlaydi.

Kasr sonlarning aniqligi muammosi

Endi har bir dasturçi bir kun duç keladigan qiziq holat:

Python
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)

Natija:

Natija
0.30000000000000004
False

Bu Pythonning xatosi emas. Kompyuter sonlarni ikkilik sanoq tizimida saqlaydi. 0.1 kabi önlik kasrni ikkilik tizimda aniq yozib bölmaydi — xuddi 1/3 ni önlik kasrda aniq yozib bölmagani kabi (0.3333...). Şuning uçun float qiymatlar juda kiçik xatolik bilan saqlanadi. Bu JavaScript, Java, C va boşqa tillarda ham xuddi şunday.

Köp hollarda bu xatolik ahamiyatsiz: haroratni yoki masofani hisoblaganda trillionning bir uluşi heç narsani özgartirmaydi. Natijani çiqarişda round() yetarli. Lekin pul bilan işlaganda har bir tiyin muhim.

Pul hisobi uçun decimal.Decimal

Standart kutubxonadagi decimal moduli önlik kasrlarni aniq saqlaydi. Decimal qiymatini satrdan yaratiş kerak — aks holda float dagi xatolik unga ham ötib qoladi:

Python
from decimal import Decimal

print(Decimal("0.1") + Decimal("0.2"))
print(Decimal(0.1))

Natija:

Natija
0.3
0.1000000000000000055511151231257827021181583404541015625

Ikkinçi qatorda 0.1 aslida kompyuter xotirasida qanday saqlanişini köryapsiz.

Amaliy misol: bir mahsulot narxi 19.99 dollar, mijoz 3 dona oladi va 12% QQS qöşiladi. Natijani sentgaça yaxlitlaymiz:

Python
from decimal import Decimal, ROUND_HALF_UP

narx = Decimal("19.99")
soni = 3
qqs = Decimal("0.12")

summa = narx * soni
jami = summa * (1 + qqs)
print(summa)
print(jami)
print(jami.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP))

Natija:

Natija
59.97
67.1664
67.17

quantize(Decimal("0.01")) natijani ikki xonali kasrgaça keltiradi, ROUND_HALF_UP esa maktabda örgangan odatiy yaxlitlaş qoidasini qöllaydi (0.5 va undan yuqorisi yuqoriga).

Xulosa

  • int — butun sonlar (çegarasi yöq), float — nuqtali kasr sonlar, complex — kompleks sonlar.
  • Katta sonlarni 1_000_000 körinişida yoziş mumkin — bu faqat öqiş uçun qulaylik.
  • Özgaruvçi — qiymatga berilgan nom; = qiymat beriş amali. Nomlar snake_case da va maʼnoli bölsin (PEP 8).
  • Amallar: + - * / // % **; / doim float qaytaradi; // va % butun böliş va qoldiq beradi.
  • Tartib: qavslar, **, köpaytiriş/böliş, qöşiş/ayiriş. Şubha bölsa — qavs qöying.
  • x += 1 kabi qisqa yozuvlar kodni ixçamlaştiradi.
  • round() bank yaxlitlaşidan foydalanadi; 0.1 + 0.2 aniq 0.3 emas; pul uçun Decimal işlating.

Maşqlar

  1. Törtburçak şaklidagi xonaning böyi 5.4 metr, eni 3.8 metr. Uning yuzini va perimetrini hisoblang. Yuzni ikki xonali kasrgaça yaxlitlang.
Yeçim
Python
boyi = 5.4
eni = 3.8
yuza = boyi * eni
perimetr = 2 * (boyi + eni)
print("Yuza:", round(yuza, 2), "kv. metr")
print("Perimetr:", round(perimetr, 2), "metr")
  1. 10_000 soniyani soat, minut va soniyaga ajrating. // va % amallaridan foydalaning.
Yeçim
Python
soniyalar = 10_000
soat = soniyalar // 3600
qolgan = soniyalar % 3600
minut = qolgan // 60
soniya = qolgan % 60
print(soat, "soat", minut, "minut", soniya, "soniya")
  1. Selsiy böyiça harorat berilgan: harorat_c = 28. Uni Farengeytga ötkazing. Formula: F = C × 9 / 5 + 32.
Yeçim
Python
harorat_c = 28
harorat_f = harorat_c * 9 / 5 + 32
print(harorat_f)
  1. Bankka 5 000 000 söm yillik 20% foiz bilan qöyildi. 3 yildan keyin hisobda qança pul bölişini murakkab foiz formulasi bilan hisoblang: summa × (1 + foiz) ** yillar. Hisobni Decimal da bajaring va natijani butun sömgaça yaxlitlang.
Yeçim
Python
from decimal import Decimal, ROUND_HALF_UP

boshlangich = Decimal("5000000")
foiz = Decimal("0.20")
yillar = 3
natija = boshlangich * (1 + foiz) ** yillar
print(natija.quantize(Decimal("1"), rounding=ROUND_HALF_UP), "söm")
  1. Quyidagi ifodalarning natijasini avval qoğozda hisoblang, keyin Python bilan tekşiring: 3 + 4 * 2 ** 2, (3 + 4) * 2 ** 2, 17 // 5 * 5 + 17 % 5.
Yeçim
Python
print(3 + 4 * 2 ** 2)        # 2**2=4, 4*4=16, 3+16=19
print((3 + 4) * 2 ** 2)      # 7*4=28
print(17 // 5 * 5 + 17 % 5)  # 3*5=15, 15+2=17