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.
print(42)
print(-8)
print(type(42))
print(2 ** 100)
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:
oylik_byudjet = 12_500_000 # söm
aholi = 37_000_000
print(oylik_byudjet)
print(aholi)
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.
harorat = 36.6
dollar_kursi = 12650.5
print(harorat, type(harorat))
print(dollar_kursi)
print(2.5e6)
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:
z = 3 + 4j
print(z, type(z))
print(z.real, z.imag)
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:
narx = 15000
soni = 4
jami = narx * soni
print(jami)
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:
ball = 70
print(ball)
ball = ball + 15
print(ball)
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:
Narxvanarx— ikki xil özgaruvçi. if,for,class,Truekabi 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_casedeyiladi:oylik_maosh,talaba_soni. - Nom maʼnoli bölsin:
xemas,narx;a2emas,kitoblar_soni. - Özgarmas qiymatlar (konstantalar) katta harflarda yoziladi:
QQS_STAVKASI = 0.12. - Nomlarda faqat lotin harflaridan foydalaning —
oʻyokigʻdagi belgini nomga qöymang.
| Nom | Holati | Izoh |
|---|---|---|
kitob_narxi | ✅ yaxşi | snake_case, maʼnoli |
KitobNarxi | ⚠️ işlaydi | bu uslub klasslar uçun |
kn | ⚠️ işlaydi | nimaligini tuşunib bölmaydi |
kitob-narxi | ❌ xato | - ayiriş amali deb tuşuniladi |
2narx | ❌ xato | raqam bilan boşlangan |
class | ❌ xato | kalit 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:
# Ijara tölovini hisoblaş
oylik_ijara = 3_000_000 # söm
oylar = 12
print(oylik_ijara * oylar) # bir yillik tölov
Natija:
36000000
Arifmetik amallar
Pythonda yettita asosiy arifmetik amal bor:
| Amal | Maʼnosi | Misol | Natija |
|---|---|---|---|
+ | qöşiş | 7 + 3 | 10 |
- | ayiriş | 7 - 3 | 4 |
* | köpaytiriş | 7 * 3 | 21 |
/ | böliş | 7 / 2 | 3.5 |
// | butun böliş | 7 // 2 | 3 |
% | qoldiq | 7 % 2 | 1 |
** | darajaga kötariş | 7 ** 2 | 49 |
print(7 + 3, 7 - 3, 7 * 3)
print(7 / 2)
print(8 / 2)
print(7 // 2, 7 % 2)
print(2 ** 10)
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:
umumiy_minut = 135
soat = umumiy_minut // 60
minut = umumiy_minut % 60
print(soat, "soat", minut, "minut")
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:
- Qavs içidagi ifodalar
() - Darajaga kötariş
** - Köpaytiriş va böliş turidagi amallar
*,/,//,% - Qöşiş va ayiriş
+,-
Bir xil darajadagi amallar çapdan öngga bajariladi. Yagona istisno — **: u öngdan çapga bajariladi.
print(2 + 3 * 4)
print((2 + 3) * 4)
print(10 - 4 - 3)
print(2 ** 3 ** 2)
print(-3 ** 2)
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:
matematika = 85
fizika = 92
ingliz_tili = 78
ortacha = (matematika + fizika + ingliz_tili) / 3
print(ortacha)
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 yozuv | Qisqa yozuv |
|---|---|
x = x + 5 | x += 5 |
x = x - 5 | x -= 5 |
x = x * 5 | x *= 5 |
x = x / 5 | x /= 5 |
x = x // 5 | x //= 5 |
x = x % 5 | x %= 5 |
x = x ** 5 | x **= 5 |
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:
293000
Yaxlitlaş: round()
round(son, n) sonni verguldan keyin n ta xonagaça yaxlitlaydi. n berilmasa, butun songaça yaxlitlab, int qaytaradi:
print(round(3.14159, 2))
print(round(12650.567))
print(round(1234567, -3))
print(round(2.5), round(3.5))
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:
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)
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:
from decimal import Decimal
print(Decimal("0.1") + Decimal("0.2"))
print(Decimal(0.1))
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:
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:
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_000körinişida yoziş mumkin — bu faqat öqiş uçun qulaylik. - Özgaruvçi — qiymatga berilgan nom;
=qiymat beriş amali. Nomlarsnake_caseda va maʼnoli bölsin (PEP 8). - Amallar:
+ - * / // % **;/doimfloatqaytaradi;//va%butun böliş va qoldiq beradi. - Tartib: qavslar,
**, köpaytiriş/böliş, qöşiş/ayiriş. Şubha bölsa — qavs qöying. x += 1kabi qisqa yozuvlar kodni ixçamlaştiradi.round()bank yaxlitlaşidan foydalanadi;0.1 + 0.2aniq0.3emas; pul uçunDecimalişlating.
Maşqlar
- 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
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")
10_000soniyani soat, minut va soniyaga ajrating.//va%amallaridan foydalaning.
Yeçim
soniyalar = 10_000
soat = soniyalar // 3600
qolgan = soniyalar % 3600
minut = qolgan // 60
soniya = qolgan % 60
print(soat, "soat", minut, "minut", soniya, "soniya")
- Selsiy böyiça harorat berilgan:
harorat_c = 28. Uni Farengeytga ötkazing. Formula: F = C × 9 / 5 + 32.
Yeçim
harorat_c = 28
harorat_f = harorat_c * 9 / 5 + 32
print(harorat_f)
- 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
Decimalda bajaring va natijani butun sömgaça yaxlitlang.
Yeçim
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")
- 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
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