math, random, statistics — asosiy funksiyalar
Muammodan boshlaylik
Uch xil vazifa:
- Doira yuzasini hisoblash va natijani yuqoriga yaxlitlash (necha quti bo'yoq kerak)
- Viktorina uchun savollarni tasodifiy tartibda chiqarish va g'olibni tanlash
- Sinf baholarining o'rtachasi, medianasi va qanchalik tarqoqligi
Bularni qo'lda yozish mumkin — lekin standart kutubxonada tayyor, sinalgan funksiyalar bor.
Hayotiy o'xshatma
Maktab sumkasi. math — kalkulyator va formulalar kitobchasi; random — o'yin kubigi va kartalar to'plami; statistics — sinf jurnali tahlilchisi.
math
import math
math.pi # 3.141592653589793
math.e # 2.718281828459045
math.sqrt(16) # 4.0 — kvadrat ildiz
math.pow(2, 10) # 1024.0 (yoki 2 ** 10 → 1024)
math.factorial(5) # 120
math.gcd(12, 18) # 6 — EKUB
math.lcm(4, 6) # 12 — EKUK
math.hypot(3, 4) # 5.0 — gipotenuza
math.dist((0, 0), (3, 4)) # 5.0 — ikki nuqta orasidagi masofa
Yaxlitlash
math.ceil(4.1) # 5 — yuqoriga
math.floor(4.9) # 4 — pastga
math.trunc(-4.7) # -4 — kasr qismini tashlash
round(4.567, 2) # 4.57 — o'rnatilgan funksiya
# 47 m² devor, bir quti — 10 m²
qutilar = math.ceil(47 / 10) # 5 — 4.7 quti sotilmaydi
[!INFO]
round()"bankir yaxlitlashi" ishlatadi:.5holatida juft songa yaxlitlaydi —round(2.5)→2,round(3.5)→4. Moliyaviy hisoblarda kutilgandek yaxlitlash kerak bo'lsa —decimalmoduli (ROUND_HALF_UP).
Logarifm va trigonometriya
math.log(100, 10) # 2.0
math.log10(1000) # 3.0
math.log2(1024) # 10.0
math.sin(math.radians(30)) # 0.5 (burchak — radianlarda)
math.degrees(math.pi) # 180.0
Kasr sonlarni solishtirish
print(0.1 + 0.2 == 0.3) # False!
print(0.1 + 0.2) # 0.30000000000000004
print(math.isclose(0.1 + 0.2, 0.3)) # True ✅
float lar ikkilik tizimda aniq ifodalanmaydi — == o'rniga math.isclose.
random
import random
random.random() # 0.0 ≤ x < 1.0
random.randint(1, 6) # 1 dan 6 gacha (6 ham kiradi) — kubik
random.uniform(1.5, 3.5) # kasr son oraliqda
random.randrange(0, 100, 5) # 0, 5, 10, ..., 95
Ro'yxatlar bilan
ishtirokchilar = ["Lola", "Aziz", "Bobur", "Dilnoza", "Sardor"]
random.choice(ishtirokchilar) # bitta tasodifiy
random.sample(ishtirokchilar, 3) # 3 ta, takrorlanmasdan
random.choices(["ha", "yo'q"], weights=[70, 30], k=10) # og'irlik bilan, takrorlanishi mumkin
random.shuffle(ishtirokchilar) # joyida aralashtiradi, None qaytaradi
print(ishtirokchilar)
Takrorlanadigan "tasodif" — seed
random.seed(42)
print(random.randint(1, 100)) # har safar bir xil: 82
Testlar va tajribalar uchun — natijani qayta tiklash mumkin bo'lsin.
Amaliy misol — viktorina
import random
savollar = [
("O'zbekiston poytaxti?", "Toshkent"),
("2 + 2 * 2 = ?", "6"),
("Python qaysi yilda chiqqan?", "1991"),
]
random.shuffle(savollar)
ball = 0
for savol, javob in savollar:
if input(savol + " ").strip().lower() == javob.lower():
ball += 1
print(f"Natija: {ball}/{len(savollar)}")
secrets — xavfsiz tasodif
[!WARNING]
random— xavfsizlik uchun emas. Uning natijalarini oldingi qiymatlardan taxmin qilish mumkin. Parollar, tokenlar, tasdiqlash kodlari, parolni tiklash havolalari uchun —secretsmoduli.
import secrets
import string
kod = f"{secrets.randbelow(1_000_000):06d}" # SMS kodi: '048213'
token = secrets.token_urlsafe(32) # havola uchun token
hex_token = secrets.token_hex(16)
belgilar = string.ascii_letters + string.digits
parol = "".join(secrets.choice(belgilar) for _ in range(12))
statistics
import statistics as st
baholar = [5, 4, 4, 3, 5, 5, 2, 4, 5, 3]
st.mean(baholar) # 4.0 — o'rtacha
st.median(baholar) # 4.0 — o'rtadagi qiymat
st.mode(baholar) # 5 — eng ko'p uchraydigan
st.multimode(baholar) # [5] — bir nechta bo'lsa hammasi
st.stdev(baholar) # 1.05... — standart og'ish (tarqoqlik)
st.variance(baholar) # 1.11...
st.quantiles(baholar, n=4) # kvartillar
O'rtacha yoki mediana?
maoshlar = [4_000_000, 4_500_000, 5_000_000, 5_200_000, 90_000_000]
print(st.mean(maoshlar)) # 21 740 000 — bitta katta qiymat "tortib ketdi"
print(st.median(maoshlar)) # 5 000 000 — "oddiy" xodimga yaqinroq
Keskin chetga chiquvchi qiymatlar bo'lsa — mediana haqiqiy manzarani yaxshiroq ko'rsatadi.
[!TIP] Katta hajmdagi raqamli ma'lumotlar va murakkab tahlil uchun
numpyvapandas(tashqi kutubxonalar) ancha tez va kuchli. Kichik ro'yxatlar va oddiy statistika uchun — o'rnatilganstatisticsyetarli.
Tez-tez uchraydigan xatolar
randint chegarasi:
random.randint(1, 6) # 1..6 — ikkala chegara kiradi
range(1, 6) # 1..5 — oxirgisi kirmaydi
shuffle natijasini saqlash:
royxat = random.shuffle(royxat) # ❌ None
random.shuffle(royxat) # ✅ joyida
Parolni random bilan yaratish — secrets.
Float larni == bilan solishtirish — math.isclose.
Xulosa
Standart kutubxonadagi tayyor matematik, tasodif va statistika vositalari.
Eslab qoling:
math:sqrt,ceil/floor,factorial,gcd,log,pi; float —iscloseround()— bankir yaxlitlashi; moliyaviy —decimalrandom:randint(a, b)(ikkalasi kiradi),choice,sample,shuffle,choices(weights=),seed- Xavfsizlik (parol, token, kod) — faqat
secrets statistics:mean,median,mode,stdev; chetga chiquvchilar bo'lsa — mediana
Keyingi dars
43-dars: collections — Counter, defaultdict, deque, namedtuple