math, random, statistics — asosiy funksiyalar

~15 daq · Python · Modullar va Standart kutubxona

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: .5 holatida juft songa yaxlitlaydi — round(2.5) → 2, round(3.5) → 4. Moliyaviy hisoblarda kutilgandek yaxlitlash kerak bo'lsa — decimal moduli (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 — secrets moduli.

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 numpy va pandas (tashqi kutubxonalar) ancha tez va kuchli. Kichik ro'yxatlar va oddiy statistika uchun — o'rnatilgan statistics yetarli.


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 — isclose
  • round() — bankir yaxlitlashi; moliyaviy — decimal
  • random: 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