IlmHamroh
Python kursi/Asoslar13/14-dars22 daqiqa
Mundarija (23)

3.13-dars: input() va print() chuqur

3-QISM — ASOSLAR · 13-dars


1. Kirish va motivatsiya

print() va input() — birinchi kundan ishlatadigan ikki funksiya. Va aynan shuning uchun ular yuzaki o'rganiladi.

Aslida ularda ko'p imkoniyat bor:

python
print("a", "b", "c", sep=" | ", end=" ←\n")     # a | b | c ←
print(*[1, 2, 3], sep="\n")                      # har biri yangi qatorda
print("xato!", file=sys.stderr)                  # xatolar oqimiga
print("yuklanmoqda...", end="", flush=True)      # bufersiz

Va f-satrlar — Pythonning eng kuchli formatlash vositasi:

python
print(f"{1234567.891:>15,.2f}")     #    1,234,567.89
print(f"{0.156:.1%}")               # 15.6%
print(f"{42:08b}")                  # 00101010
print(f"{ism=}")                    # ism='Ali'  ← nosozlik izlash
print(f"{sana:%d.%m.%Y}")           # 07.09.2026

Bu darsda ikkalasini to'liq o'rganamiz. Bu — kundalik ishda eng ko'p qaytib keladigan bilim.


2. Nazariya — chuqur tushuntirish

2.1. print() — to'liq imzo

python
print(*obyektlar, sep=" ", end="\n", file=sys.stdout, flush=False)
Parametr Sukut Nima qiladi
*obyektlar — Istalgancha argument
sep " " Argumentlar orasidagi ajratgich
end "\n" Oxiridagi belgi
file sys.stdout Qayerga yozish
flush False Buferni darhol bo'shatish

sep — ajratgich:

python
print("a", "b", "c")                    # a b c
print("a", "b", "c", sep="")            # abc
print("a", "b", "c", sep=" | ")         # a | b | c
print("2026", "09", "07", sep="-")      # 2026-09-07
print(*range(5), sep=", ")              # 0, 1, 2, 3, 4

end — oxiri:

python
print("Yuklanmoqda", end="")
print("...", end="")
print(" tayyor!")                       # Yuklanmoqda... tayyor!

for i in range(5):
    print(i, end=" ")                   # 0 1 2 3 4
print()                                 # yangi qator

file — qayerga:

python
import sys

print("Oddiy xabar")                            # stdout
print("Xato xabari", file=sys.stderr)           # stderr

Nega muhim? 2.4-darsda o'rgandik:

bash
python3 main.py > natija.txt        # faqat stdout faylga
python3 main.py 2> xatolar.txt      # faqat stderr faylga

Loglar va xatolarni ajratish uchun stderr ishlating.

Faylga yozish:

python
with open("hisobot.txt", "w", encoding="utf-8") as f:
    print("Sarlavha", file=f)
    print("Ma'lumot", file=f)

flush — bufersiz:

1.8-darsda o'rgandik: stdout buferlanadi.

python
import time

for i in range(5):
    print(f"\rQadam {i+1}/5", end="", flush=True)
    time.sleep(1)
print("\nTayyor!")

\r — qator boshiga qaytish. flush=True bo'lmasa progress ko'rinmaydi.

2.2. print va ko'p argument

python
ism, yosh = "Ali", 25

print("Ism:", ism, "Yosh:", yosh)       # Ism: Ali Yosh: 25

print har bir argumentga str() qo'llaydi — shuning uchun sonni aylantirish shart emas:

python
print("Yosh: " + yosh)                  # ❌ TypeError
print("Yosh:", yosh)                    # ✅ Yosh: 25
print(f"Yosh: {yosh}")                  # ✅ eng yaxshi

Yoyish operatori *:

python
sonlar = [1, 2, 3]

print(sonlar)                           # [1, 2, 3]
print(*sonlar)                          # 1 2 3
print(*sonlar, sep="\n")                # har biri yangi qatorda

Ro'yxatni chiroyli chiqarish:

python
mevalar = ["olma", "anor", "uzum"]

print(mevalar)                          # ['olma', 'anor', 'uzum']
print(", ".join(mevalar))               # olma, anor, uzum
print(*mevalar, sep=", ")               # olma, anor, uzum
print("\n".join(f"• {m}" for m in mevalar))
text
• olma
• anor
• uzum

2.3. f-satrlar — asosiy sintaksis

python
ism = "Ali"
yosh = 25

print(f"Salom, {ism}!")                 # Salom, Ali!
print(f"Keyingi yil: {yosh + 1}")       # ifoda ham mumkin
print(f"Katta: {ism.upper()}")          # metod chaqiruvi
print(f"Uzunlik: {len(ism)}")           # funksiya
print(f"{'katta' if yosh > 18 else 'kichik'}")  # shartli ifoda

Qavslarni chiqarish:

python
print(f"{{bu qavs ichida}}")            # {bu qavs ichida}
print(f"{{{ism}}}")                     # {Ali}

Tirnoqlar (Python 3.12 gacha):

python
lugat = {"ism": "Ali"}

# Python 3.12 gacha — turli tirnoq kerak
print(f"{lugat['ism']}")                # ✅
# print(f"{lugat["ism"]}")              # ❌ 3.12 gacha SyntaxError

# Python 3.12+ — ikkalasi ham ishlaydi

Ko'p qatorli f-satr:

python
matn = f"""
Ism:  {ism}
Yosh: {yosh}
"""
print(matn)

Yonma-yon:

python
xabar = (
    f"Salom, {ism}! "
    f"Siz {yosh} yoshdasiz."
)

Har bir qismga f qo'yish kerak.

2.4. Format spetsifikatorlari

Sintaksis: {qiymat:format}

text
{qiymat:[[to'ldirish]tekislash][ishora][#][0][kenglik][guruh][.aniqlik][tur]}

Kenglik va tekislash:

python
print(f"{'chap':<10}|")                 # chap      |
print(f"{'markaz':^10}|")               # " markaz  |"
print(f"{'ong':>10}|")                  #        ong|
print(f"{42:5}|")                       #    42|  — sonlar o'ngga
print(f"{'ab':5}|")                     # ab   |  — satrlar chapga
Belgi Tekislash
< Chapga
> O'ngga
^ Markazga
= Ishoradan keyin to'ldirish (faqat sonlar)

To'ldirish belgisi:

python
print(f"{42:*>8}")                      # ******42
print(f"{42:0>8}")                      # 00000042
print(f"{42:08}")                       # 00000042 — qisqa shakl
print(f"{'menyu':-^20}")                # -------menyu--------
print(f"{'':=^30}")                     # ==============================

Sonlar:

python
son = 1234567.891

print(f"{son:.2f}")                     # 1234567.89
print(f"{son:,.2f}")                    # 1,234,567.89
print(f"{son:_.2f}")                    # 1_234_567.89
print(f"{son:e}")                       # 1.234568e+06
print(f"{son:.3e}")                     # 1.235e+06
print(f"{son:g}")                       # 1.23457e+06
print(f"{son:15,.2f}")                  #    1,234,567.89

Butun sonlar:

python
print(f"{42:d}")                        # 42
print(f"{42:b}")                        # 101010     ikkilik
print(f"{42:o}")                        # 52         sakkizlik
print(f"{42:x}")                        # 2a         o'n oltilik
print(f"{42:X}")                        # 2A
print(f"{42:#x}")                        # 0x2a      prefiks bilan
print(f"{42:08b}")                      # 00101010
print(f"{42:,}")                        # 42
print(f"{1234567:,}")                   # 1,234,567

Foiz:

python
print(f"{0.156:.1%}")                   # 15.6%
print(f"{0.156:.0%}")                   # 16%
print(f"{1.5:.1%}")                     # 150.0%

% qiymatni 100 ga ko'paytiradi va belgi qo'shadi.

Ishora:

python
print(f"{5:+}")                         # +5
print(f"{-5:+}")                        # -5
print(f"{5:-}")                         # 5    (sukut)
print(f"{5: }")                         # " 5" — musbatga bo'sh joy

Ishora bilan tekislashda = foydali:

python
print(f"{-42:08}")                      # -0000042  ← ishora oldinda
print(f"{-42:=8}")                      # -     42

Aniqlik satrlar uchun — qisqartirish:

python
print(f"{'juda uzun matn':.5}")         # juda
print(f"{'qisqa':.10}")                 # qisqa

2.5. !r, !s, !a — aylantirish

python
matn = "salom\n"

print(f"{matn}")                        # salom + yangi qator
print(f"{matn!r}")                      # 'salom\n'
print(f"{matn!s}")                      # salom + yangi qator (sukut)
print(f"{'oʻzbek'!a}")                  # 'oʻzbek' — ASCII
Belgi Chaqiradi Qachon
!s str() Sukut
!r repr() Nosozlik izlashda
!a ascii() ASCII kafolat kerak bo'lsa

!r nosozlik izlashda majburiy:

python
qiymat = "42"

print(f"Qiymat: {qiymat}")              # Qiymat: 42     ← son yoki satr?
print(f"Qiymat: {qiymat!r}")            # Qiymat: '42'   ← aniq: satr

2.6. = — nosozlik izlash (Python 3.8+)

python
a, b = 5, 10

print(f"{a=}")                          # a=5
print(f"{b=}")                          # b=10
print(f"{a + b=}")                      # a + b=15
print(f"{a=}, {b=}")                    # a=5, b=10

Ifodaning matni ham chiqadi. Bu — nosozlik izlashning eng tez usuli.

Format bilan birga:

python
narx = 1234.5678
print(f"{narx=:.2f}")                   # narx=1234.57
print(f"{narx=!r}")                     # narx=1234.5678

Bo'sh joy saqlanadi:

python
print(f"{a = }")                        # a = 5

Bu — print(f"a={a}") ni almashtiruvchi. Nom o'zgarganda qo'lda tuzatish kerak emas.

2.7. Sana va maxsus turlar

python
from datetime import datetime, date

hozir = datetime(2026, 9, 7, 14, 30, 45)

print(f"{hozir:%d.%m.%Y}")              # 07.09.2026
print(f"{hozir:%H:%M}")                 # 14:30
print(f"{hozir:%d.%m.%Y %H:%M:%S}")     # 07.09.2026 14:30:45
print(f"{hozir:%A, %d %B %Y}")          # Monday, 07 September 2026
print(f"{hozir:%Y-%m-%dT%H:%M:%S}")     # ISO format

Asosiy kodlar:

Kod Ma'nosi Misol
%Y Yil (4 raqam) 2026
%m Oy (01-12) 09
%d Kun (01-31) 07
%H Soat (00-23) 14
%M Daqiqa 30
%S Soniya 45
%A Hafta kuni (to'liq) Monday
%B Oy nomi September

O'zbek tili uchun: %A va %B tizim tiliga bog'liq va ko'p muhitda ingliz tilida chiqadi. O'zbekcha kerak bo'lsa — qo'lda jadval tuzing (bu Wisar loyihasida ham shunday qilingan).

Decimal bilan:

python
from decimal import Decimal

narx = Decimal("1234.5678")
print(f"{narx:,.2f}")                   # 1,234.57

2.8. input() — to'liq

python
input(prompt="")

Asosiy qoidalar:

  1. Doim str qaytaradi — hatto raqam kiritilsa ham
  2. Yangi qator belgisi (\n) kirmaydi
  3. prompt — stdout ga yoziladi, buferlanmaydi
python
ism = input("Ismingiz: ")
print(f"Salom, {ism}!")
print(type(ism))                        # <class 'str'>

Aylantirish majburiy:

python
yosh = input("Yosh: ")                  # '25'
print(yosh + 1)                         # ❌ TypeError
print(int(yosh) + 1)                    # ✅ 26

Ammo bu ham xavfli:

python
yosh = int(input("Yosh: "))             # foydalanuvchi "abc" yozsa → ValueError

Xavfsiz usul (3.9-darsdan):

python
def son_sora(savol: str) -> int:
    while True:
        try:
            return int(input(savol).strip())
        except ValueError:
            print("  ⚠️ Butun son kiriting.")

.strip() — deyarli doim kerak:

python
javob = input("Ha yoki yo'q: ").strip().lower()
if javob in {"ha", "h", "y"}:
    ...

Ko'p qiymat bir qatorda:

python
kirish = input("Uch son (bo'sh joy bilan): ")
a, b, c = map(int, kirish.split())

Yoki xavfsizroq:

python
sonlar = [int(x) for x in input().split()]

Ko'p qator o'qish:

python
qatorlar = []
print("Matn kiriting (bo'sh qator — tugatish):")
while (qator := input()) != "":
    qatorlar.append(qator)

Morj operatori bilan (3.12-dars).

Faylga yo'naltirilganda:

bash
python3 main.py < kirish.txt

input() fayldan o'qiydi. Fayl tugasa — EOFError:

python
try:
    while True:
        qator = input()
        print(f"O'qildi: {qator}")
except EOFError:
    print("Fayl tugadi")

Parol o'qish — input() emas:

python
import getpass

parol = getpass.getpass("Parol: ")      # ekranda ko'rinmaydi

input() yozilganini ko'rsatadi — parol uchun yaramaydi.

2.9. Boshqa formatlash usullari

f-satr ( zamonaviy, Python 3.6+):

python
print(f"Salom, {ism}! Yosh: {yosh}")

.format() (eski, lekin hali ishlatiladi):

python
print("Salom, {}! Yosh: {}".format(ism, yosh))
print("Salom, {0}! Yosh: {1}".format(ism, yosh))
print("Salom, {n}! Yosh: {y}".format(n=ism, y=yosh))
print("{:,.2f}".format(1234.5))

Qachon kerak? Shablon oldindan tayyor bo'lsa:

python
SHABLON = "Salom, {}! Sizga {} xabar bor."
print(SHABLON.format(ism, 5))

% (juda eski, C uslubi):

python
print("Salom, %s! Yosh: %d" % (ism, yosh))
print("%.2f" % 3.14159)

Yangi kodda ishlatmang. Lekin loglashda uchraydi:

python
import logging
logging.info("Foydalanuvchi %s kirdi", ism)     # ✅ shunday yozing
logging.info(f"Foydalanuvchi {ism} kirdi")      # ⚠️ har doim hisoblanadi

logging da % uslubi afzal — chunki xabar chiqarilmasa, format hisoblanmaydi.

string.Template (xavfsizlik uchun):

python
from string import Template

shablon = Template("Salom, $ism!")
print(shablon.substitute(ism="Ali"))

Foydalanuvchi shablon berganda xavfsizroq — f-satr kod bajaradi, Template yo'q.

Solishtirish jadvali:

Usul Tezlik O'qish Qachon
f-satr Eng tez Eng oson Deyarli doim
.format() O'rtacha Yaxshi Tayyor shablon
% O'rtacha Yomon logging
Template Sekin Yaxshi Foydalanuvchi shabloni

3. Tez ma'lumotnoma

print

python
print(*obyektlar, sep=" ", end="\n", file=sys.stdout, flush=False)

print("a", "b", sep=" | ")      a | b
print("x", end="")              qator tashlashsiz
print(*royxat, sep="\n")        har biri yangi qatorda
print("xato", file=sys.stderr)  xatolar oqimiga
print("...", flush=True)        bufersiz

f-satr formatlari

python
{x:<10}   {x:^10}   {x:>10}        tekislash
{x:*>10}  {x:08}                   to'ldirish
{x:.2f}   {x:,.2f}   {x:e}         kasr
{x:b} {x:o} {x:x} {x:X} {x:#x}     sanoq tizimlari
{x:.1%}                            foiz
{x:+}                              ishora
{x!r}  {x!s}  {x!a}                aylantirish
{x=}                               nosozlik izlash
{sana:%d.%m.%Y}                    sana

input

python
matn = input("Savol: ")         DOIM str qaytaradi
matn = input().strip()          .strip() deyarli doim kerak
son = int(input())              ⚠️ ValueError xavfi
a, b = map(int, input().split())
getpass.getpass("Parol: ")      ko'rinmas kiritish

Xavfsiz naqsh

python
while True:
    try:
        return int(input(savol).strip())
    except ValueError:
        print("Son kiriting")

4. Batafsil misollar

Misol 1 — print ning barcha imkoniyati

python
import sys

print("=== 1. sep ===")
print("  ", end="")
print("2026", "09", "07", sep="-")
print("  ", end="")
print("a", "b", "c", sep="")
print("  ", end="")
print(*range(5), sep=" → ")

print("\n=== 2. end ===")
print("  Yuklanmoqda", end="")
for _ in range(3):
    print(".", end="")
print(" tayyor!")

print("\n=== 3. Ro'yxatni chiqarish ===")
mevalar = ["olma", "anor", "uzum"]
print(f"  Oddiy:     {mevalar}")
print(f"  join:      {', '.join(mevalar)}")
print("  Yoyish:    ", end="")
print(*mevalar, sep=", ")
print("  Ro'yxat:")
print("\n".join(f"    • {m}" for m in mevalar))

print("\n=== 4. Jadval ===")
malumot = [
    ("Mahsulot", "Narx", "Soni"),
    ("Non", 4000, 2),
    ("Sut", 12000, 1),
    ("Guruch", 18000, 3),
]
for qator in malumot:
    nom, narx, soni = qator
    if isinstance(narx, str):
        print(f"  {nom:<12} {narx:>10} {soni:>6}")
        print(f"  {'─' * 30}")
    else:
        print(f"  {nom:<12} {narx:>10,} {soni:>6}")

print("\n=== 5. stderr ===")
print("  Bu stdout ga ketadi")
print("  Bu stderr ga ketadi", file=sys.stderr)
print("  (terminalda ikkalasi ko'rinadi, lekin > bilan ajraladi)")

print("\n=== 6. Faylga yozish ===")
with open("sinov_hisobot.txt", "w", encoding="utf-8") as f:
    print("HISOBOT", file=f)
    print("=" * 20, file=f)
    for nom, narx, soni in malumot[1:]:
        print(f"{nom:<12} {narx * soni:>10,}", file=f)
print("  sinov_hisobot.txt yozildi")

with open("sinov_hisobot.txt", encoding="utf-8") as f:
    print("  Mazmuni:")
    for qator in f:
        print(f"    {qator.rstrip()}")

import os
os.remove("sinov_hisobot.txt")
text
=== 1. sep ===
  2026-09-07
  abc
  0 → 1 → 2 → 3 → 4

=== 2. end ===
  Yuklanmoqda... tayyor!

=== 3. Ro'yxatni chiqarish ===
  Oddiy:     ['olma', 'anor', 'uzum']
  join:      olma, anor, uzum
  Yoyish:    olma, anor, uzum
  Ro'yxat:
    • olma
    • anor
    • uzum

=== 4. Jadval ===
  Mahsulot           Narx   Soni
  ──────────────────────────────
  Non               4,000      2
  Sut              12,000      1
  Guruch           18,000      3

=== 5. stderr ===
  Bu stdout ga ketadi
  Bu stderr ga ketadi
  (terminalda ikkalasi ko'rinadi, lekin > bilan ajraladi)

=== 6. Faylga yozish ===
  sinov_hisobot.txt yozildi
  Mazmuni:
    HISOBOT
    ====================
    Non               8,000
    Sut              12,000
    Guruch           54,000

Nima ko'rsatdi: 2.1, 2.2-bo'limlar.

Misol 2 — Format spetsifikatorlari ma'lumotnomasi

python
"""Barcha format varianti — bir joyda."""

from datetime import datetime

print("=== Tekislash ===")
for tekislash, nom in [("<", "chap"), ("^", "markaz"), (">", "o'ng")]:
    print(f"  {tekislash!r:>4}  |{'matn':{tekislash}14}|  {nom}")

print("\n=== To'ldirish ===")
namunalar = [
    ("{:*>10}", "* bilan o'ngga"),
    ("{:0>10}", "0 bilan o'ngga"),
    ("{:010}", "qisqa shakl (sonlar)"),
    ("{:-^20}", "- bilan markazga"),
    ("{:.^20}", ". bilan markazga"),
]
for shablon, izoh in namunalar:
    print(f"  {shablon:<12} → |{shablon.format(42)}|  {izoh}")

print("\n=== Kasr sonlar ===")
son = 1234567.891234
formatlar = [
    (".2f", "ikki xona"),
    (".0f", "butun"),
    (",.2f", "mingliklar bilan"),
    ("_.2f", "pastki chiziq bilan"),
    ("e", "ilmiy"),
    (".3e", "ilmiy, 3 xona"),
    ("g", "avtomatik"),
    ("15,.2f", "kenglik 15"),
    (">20,.2f", "o'ngga, kenglik 20"),
]
for f, izoh in formatlar:
    print(f"  {{:{f}}}".ljust(14) + f" → |{son:{f}}|  {izoh}")

print("\n=== Butun sonlar ===")
n = 255
for f, izoh in [("d", "o'nlik"), ("b", "ikkilik"), ("08b", "ikkilik, 8 xona"),
                ("o", "sakkizlik"), ("x", "o'n oltilik"), ("X", "katta harfda"),
                ("#x", "prefiks bilan"), (",", "mingliklar")]:
    print(f"  {{:{f}}}".ljust(12) + f" → {n:{f}}  {izoh}")

print("\n=== Foiz va ishora ===")
print(f"  {{:.1%}}  → {0.1567:.1%}")
print(f"  {{:.0%}}  → {0.1567:.0%}")
print(f"  {{:+}}    → {42:+}")
print(f"  {{:+}}    → {-42:+}")
print(f"  {{: }}    → |{42: }|")

print("\n=== Aylantirish ===")
matn = "salom\n"
print(f"  {{}}    → {matn!s}".rstrip())
print(f"  {{!r}}  → {matn!r}")

print("\n=== Nosozlik izlash (=) ===")
a, b = 5, 10
narx = 1234.5678
print(f"  {a=}")
print(f"  {a + b=}")
print(f"  {narx=:.2f}")
print(f"  {a = }")

print("\n=== Sana ===")
hozir = datetime(2026, 9, 7, 14, 30, 45)
for f, izoh in [("%d.%m.%Y", "o'zbekcha sana"),
                ("%Y-%m-%d", "ISO sana"),
                ("%H:%M", "vaqt"),
                ("%d.%m.%Y %H:%M:%S", "to'liq"),
                ("%Y-%m-%dT%H:%M:%S", "ISO to'liq")]:
    print(f"  {f:<22} → {hozir:{f}}  {izoh}")

Natijaning muhim qismi:

text
=== Kasr sonlar ===
  {:.2f}         → |1234567.89|  ikki xona
  {:,.2f}        → |1,234,567.89|  mingliklar bilan
  {:e}           → |1.234568e+06|  ilmiy
  {:>20,.2f}     → |        1,234,567.89|  o'ngga, kenglik 20

=== Butun sonlar ===
  {:b}        → 11111111  ikkilik
  {:08b}      → 11111111  ikkilik, 8 xona
  {:x}        → ff  o'n oltilik
  {:#x}       → 0xff  prefiks bilan

=== Nosozlik izlash (=) ===
  a=5
  a + b=15
  narx=1234.57
  a = 5

Nima ko'rsatdi: 2.4, 2.5, 2.6, 2.7-bo'limlar.

Misol 3 — Xavfsiz kiritish kutubxonasi

python
"""Foydalanuvchi kiritmasini xavfsiz olish."""

from datetime import date, datetime


def matn_sora(savol: str, majburiy: bool = True, sukut: str = "") -> str:
    """Matn so'raydi."""
    while True:
        javob = input(f"{savol}: ").strip()
        if javob:
            return javob
        if not majburiy:
            return sukut
        print("  ⚠️ Bo'sh qoldirmang.")


def son_sora(savol: str, minimal: int | None = None,
             maksimal: int | None = None) -> int:
    """Butun son so'raydi."""
    chegara = ""
    if minimal is not None and maksimal is not None:
        chegara = f" ({minimal}–{maksimal})"
    elif minimal is not None:
        chegara = f" (≥{minimal})"
    elif maksimal is not None:
        chegara = f" (≤{maksimal})"

    while True:
        kirish = input(f"{savol}{chegara}: ").strip()
        try:
            son = int(kirish)
        except ValueError:
            print(f"  ⚠️ {kirish!r} — butun son emas.")
            continue

        if minimal is not None and son < minimal:
            print(f"  ⚠️ Kamida {minimal} bo'lishi kerak.")
            continue
        if maksimal is not None and son > maksimal:
            print(f"  ⚠️ Ko'pi bilan {maksimal} bo'lishi kerak.")
            continue

        return son


def kasr_sora(savol: str) -> float:
    """Kasr son so'raydi (vergul ham qabul qilinadi)."""
    while True:
        kirish = input(f"{savol}: ").strip().replace(",", ".")
        try:
            return float(kirish)
        except ValueError:
            print(f"  ⚠️ {kirish!r} — son emas.")


def ha_yoq(savol: str, sukut: bool | None = None) -> bool:
    """Ha/yo'q savoli."""
    ROST = {"ha", "h", "yes", "y", "1", "true"}
    YOLGON = {"yo'q", "yoq", "no", "n", "0", "false"}

    if sukut is True:
        belgi = "[Ha/yo'q]"
    elif sukut is False:
        belgi = "[ha/Yo'q]"
    else:
        belgi = "[ha/yo'q]"

    while True:
        javob = input(f"{savol} {belgi}: ").strip().lower()
        if not javob and sukut is not None:
            return sukut
        if javob in ROST:
            return True
        if javob in YOLGON:
            return False
        print("  ⚠️ 'ha' yoki 'yo'q' deb javob bering.")


def sana_sora(savol: str) -> date:
    """Sana so'raydi (kk.oo.yyyy)."""
    while True:
        kirish = input(f"{savol} (kk.oo.yyyy): ").strip()
        try:
            return datetime.strptime(kirish, "%d.%m.%Y").date()
        except ValueError:
            print(f"  ⚠️ {kirish!r} — noto'g'ri format. Masalan: 07.09.2026")


def tanlov(savol: str, variantlar: list[str]) -> str:
    """Ro'yxatdan tanlash."""
    print(f"\n{savol}")
    for i, v in enumerate(variantlar, 1):
        print(f"  {i}. {v}")
    raqam = son_sora("Tanlang", 1, len(variantlar))
    return variantlar[raqam - 1]


# ─── Namoyish ───
if __name__ == "__main__":
    print("╔═══════════════════════════════════╗")
    print("║   RO'YXATDAN O'TISH               ║")
    print("╚═══════════════════════════════════╝\n")

    ism = matn_sora("Ismingiz")
    yosh = son_sora("Yoshingiz", 1, 120)
    boy = kasr_sora("Bo'yingiz (m)")
    tugilgan = sana_sora("Tug'ilgan sana")
    shahar = tanlov("Shahringiz:", ["Toshkent", "Samarqand", "Buxoro", "Boshqa"])
    obuna = ha_yoq("\nYangiliklarga obuna bo'lasizmi?", sukut=True)

    print("\n╔═══════════════════════════════════╗")
    print("║   MA'LUMOTLARINGIZ                ║")
    print("╠═══════════════════════════════════╣")
    print(f"║ Ism:      {ism:<24}║")
    print(f"║ Yosh:     {yosh:<24}║")
    print(f"║ Bo'y:     {boy:<24.2f}║")
    print(f"║ Tug'ilgan:{tugilgan:%d.%m.%Y}                  ║")
    print(f"║ Shahar:   {shahar:<24}║")
    print(f"║ Obuna:    {'Ha' if obuna else 'Yoʻq':<24}║")
    print("╚═══════════════════════════════════╝")

Namunaviy seans:

text
╔═══════════════════════════════════╗
║   RO'YXATDAN O'TISH               ║
╚═══════════════════════════════════╝

Ismingiz:
  ⚠️ Bo'sh qoldirmang.
Ismingiz: Sarvarbek
Yoshingiz (1–120): 200
  ⚠️ Ko'pi bilan 120 bo'lishi kerak.
Yoshingiz (1–120): 25
Bo'yingiz (m): 1,78
Tug'ilgan sana (kk.oo.yyyy): 15.03.2001

Shahringiz:
  1. Toshkent
  2. Samarqand
  3. Buxoro
  4. Boshqa
Tanlang (1–4): 1

Yangiliklarga obuna bo'lasizmi? [Ha/yo'q]:

╔═══════════════════════════════════╗
║   MA'LUMOTLARINGIZ                ║
╠═══════════════════════════════════╣
║ Ism:      Sarvarbek               ║
║ Yosh:     25                      ║
║ Bo'y:     1.78                    ║
║ Tug'ilgan:15.03.2001              ║
║ Shahar:   Toshkent                ║
║ Obuna:    Ha                      ║
╚═══════════════════════════════════╝

Kodda ko'rish kerak:

  • Har bir funksiya while True + try/except (EAFP — 3.8-dars)
  • .strip() doim
  • .replace(",", ".") — o'zbekcha kasr uchun
  • sukut: bool | None — uch holat: True, False, "berilmagan" (3.6-dars)
  • {ism:<24} — jadval tekislash

Nima ko'rsatdi: 2.8-bo'lim, 3.6, 3.8, 3.9-darslar birgalikda.

Misol 4 — Progress ko'rsatgich va jonli chiqish

python
"""Buferlash va \\r bilan jonli chiqish."""

import sys
import time


def progress(joriy: int, jami: int, kenglik: int = 40) -> None:
    """Progress chizig'ini chizadi."""
    foiz = joriy / jami
    toldirilgan = int(kenglik * foiz)
    chiziq = "█" * toldirilgan + "░" * (kenglik - toldirilgan)
    print(f"\r  [{chiziq}] {foiz:>6.1%}  ({joriy}/{jami})", end="", flush=True)


def spinner_bilan_kutish(soniya: float, xabar: str) -> None:
    """Aylanuvchi belgi bilan kutish."""
    belgilar = "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"
    boshlandi = time.time()
    i = 0
    while time.time() - boshlandi < soniya:
        print(f"\r  {belgilar[i % len(belgilar)]} {xabar}", end="", flush=True)
        time.sleep(0.08)
        i += 1
    print(f"\r  ✅ {xabar} — tayyor" + " " * 10)


print("=== 1. Progress chizig'i ===")
JAMI = 50
for i in range(JAMI + 1):
    progress(i, JAMI)
    time.sleep(0.02)
print("\n")

print("=== 2. Spinner ===")
spinner_bilan_kutish(1.5, "Ma'lumot yuklanmoqda")
spinner_bilan_kutish(1.0, "Qayta ishlanmoqda")

print("\n=== 3. flush farqi ===")
print("  flush=False bilan (hammasi birga chiqishi mumkin):")
for i in range(3):
    print(f"    Qadam {i+1}", end=" ")
    time.sleep(0.4)
print()

print("  flush=True bilan (har biri darhol):")
for i in range(3):
    print(f"    Qadam {i+1}", end=" ", flush=True)
    time.sleep(0.4)
print()

print("\n=== 4. Ko'p qatorli jonli yangilanish ===")
holatlar = ["Ulanish", "Autentifikatsiya", "Ma'lumot olish", "Saqlash"]
natijalar = ["⏳"] * len(holatlar)

for i in range(len(holatlar)):
    natijalar[i] = "⏳"
    # Oldingi chiqishni o'chirish
    if i > 0:
        print(f"\033[{len(holatlar)}A", end="")
    for h, n in zip(holatlar, natijalar):
        print(f"  {n} {h:<20}")
    time.sleep(0.5)
    natijalar[i] = "✅"

print(f"\033[{len(holatlar)}A", end="")
for h, n in zip(holatlar, natijalar):
    print(f"  {n} {h:<20}")

print("\n=== 5. stderr ga log ===")
def log(daraja: str, xabar: str) -> None:
    belgilar = {"INFO": "ℹ️ ", "OGOH": "⚠️ ", "XATO": "❌"}
    print(f"{belgilar.get(daraja, '  ')} [{daraja}] {xabar}", file=sys.stderr)

log("INFO", "Dastur ishga tushdi")
log("OGOH", "Fayl topilmadi, sukut qiymat ishlatildi")
log("XATO", "Ulanish uzildi")
print("  (Bu xabarlar stderr ga ketdi — 2> bilan ajratish mumkin)")

Diqqat: \033[NA — ANSI ketma-ketligi, kursorni N qator yuqoriga ko'taradi. Windows Terminal, macOS va Linux terminallarida ishlaydi; eski cmd da ishlamasligi mumkin.

Nima ko'rsatdi: 2.1-bo'limdagi end, flush, file parametrlari va 1.8-darsdagi buferlash.


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"input() son qaytarishi mumkin" Doim str. Aylantirish majburiy
"print faqat bitta argument oladi" Istalgancha. sep bilan ajratiladi
"print("a" + 5) ishlaydi" TypeError. print("a", 5) yoki f-satr
"f"{x}" va f"{x!r}" bir xil" !r — repr(), tirnoqlarni ko'rsatadi
"% formatlash eskirgan, ishlatmaslik kerak" logging da hali ham afzal
"print darhol chiqaradi" Buferlanadi. flush=True kerak bo'lishi mumkin
"input() ni int() ga o'rash yetarli" ValueError xavfi. try/except kerak
"f-satr sekin" Eng tez formatlash usuli
"{x=} faqat nosozlik uchun" Ha, lekin juda foydali — nom o'zgarsa avtomatik yangilanadi

6. Keng tarqalgan xatolar va yechimlari

1. TypeError: can only concatenate str

python
print("Yosh: " + yosh)                  # ❌ yosh — int
print("Yosh:", yosh)                    # ✅
print(f"Yosh: {yosh}")                  # ✅

2. ValueError — int(input())

python
yosh = int(input("Yosh: "))             # ❌ "abc" → ValueError

while True:                             # ✅
    try:
        yosh = int(input("Yosh: "))
        break
    except ValueError:
        print("Son kiriting")

3. .strip() ni unutish

python
if input("Ha? ") == "ha":               # ❌ " ha" ishlamaydi
if input("Ha? ").strip().lower() == "ha":   # ✅

4. f-satrda tirnoq to'qnashuvi (3.12 gacha)

python
print(f"{lugat["kalit"]}")              # ❌ SyntaxError (3.12 gacha)
print(f"{lugat['kalit']}")              # ✅

5. f harfini unutish

python
print("Salom, {ism}!")                  # ❌ 'Salom, {ism}!'
print(f"Salom, {ism}!")                 # ✅

Ruff bu xatoni topadi: F541.

6. Progress ko'rinmaydi

python
print(f"\r{i}", end="")                 # ❌ buferlangan
print(f"\r{i}", end="", flush=True)     # ✅

7. logging da f-satr

python
logging.debug(f"Qiymat: {qimmat_hisob()}")      # ⚠️ doim hisoblanadi
logging.debug("Qiymat: %s", qimmat_hisob())     # ✅ faqat kerak bo'lsa

8. Parolni input() bilan so'rash

python
parol = input("Parol: ")                # ❌ ekranda ko'rinadi

import getpass
parol = getpass.getpass("Parol: ")      # ✅

9. Foizni ikki marta ko'paytirish

python
foiz = 0.156
print(f"{foiz * 100:.1f}%")             # 15.6% — ishlaydi
print(f"{foiz:.1%}")                    # 15.6% — soddaroq
print(f"{foiz * 100:.1%}")              # ❌ 1560.0%

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 3.14-dars: PEP 8 — qator uzunligi, f-satr uslubi
  • 4-QISM: satrlar chuqur — formatlashning barcha nozikligi
  • 5-qism: sikllarda progress ko'rsatish
  • 9-qism: ValueError ni ushlash, input bilan xatolar
  • 15-qism: logging — print o'rniga to'g'ri usul
  • 16-qism: fayllarga yozish (file= parametri)
  • 19-qism: CLI dasturlar, argparse, rich kutubxonasi
  • Har bir dasturda: foydalanuvchi bilan muloqot

8. Eng yaxshi amaliyotlar

  1. f-satrlarni ishlating. Eng tez, eng o'qiladigan. % va .format() — faqat maxsus holatlarda.

  2. input() natijasini doim .strip() qiling. Foydalanuvchi kiritmasida ortiqcha bo'sh joy — norma.

  3. int(input()) ni himoyalang. try/except ValueError yoki tayyor funksiya.

  4. Nosozlik izlashda {x=} va !r ishlating. f"{qiymat=!r}" — nom, qiymat va tur haqida hammasini aytadi.

  5. Xato xabarlarini stderr ga yozing. print(..., file=sys.stderr).

  6. Progress uchun flush=True. Aks holda foydalanuvchi dastur qotib qolgan deb o'ylaydi.

  7. logging da % uslubini ishlating. logging.info("Foydalanuvchi %s", ism) — f-satr emas.

  8. Parol uchun getpass. input() yozilganini ekranda ko'rsatadi.


9. Amaliy topshiriq

Vazifa 1: Format natijalari

python
son = 1234.5678
matn = "salom"

1.  f"{son:.2f}"
2.  f"{son:,.2f}"
3.  f"{son:>15,.2f}"
4.  f"{son:e}"
5.  f"{42:08b}"
6.  f"{255:#x}"
7.  f"{0.156:.1%}"
8.  f"{matn:*^15}"
9.  f"{matn!r}"
10. f"{son=:.1f}"
Javoblar
  1. '1234.57'
  2. '1,234.57'
  3. ' 1,234.57'
  4. '1.234568e+03'
  5. '00101010'
  6. '0xff'
  7. '15.6%'
  8. '*****salom*****'
  9. "'salom'"
  10. 'son=1234.6'

Vazifa 2: Chek chiqarish

Do'kon chekini formatlang:

text
╔══════════════════════════════════╗
║          WISAR MARKET            ║
╠══════════════════════════════════╣
║ Non           4,000 × 2   8,000  ║
║ Sut          12,000 × 1  12,000  ║
║ Guruch       18,000 × 3  54,000  ║
╠══════════════════════════════════╣
║ Summa                    74,000  ║
║ QQS (12%)                 8,880  ║
║ JAMI                     82,880  ║
╚══════════════════════════════════╝
        07.09.2026 14:30

Vazifa 3: Xavfsiz kiritish

3-misoldagi kutubxonaga qo'shing:

  1. email_sora() — @ va . borligini tekshirsin
  2. telefon_sora() — +998XXXXXXXXX formatini tekshirsin
  3. parol_sora() — getpass bilan, kuchini tekshirsin (3.5-darsdagi funksiya)

Vazifa 4: Progress ko'rsatgich

progress_bar(joriy, jami) funksiyasini yozing:

  • Foiz, chiziq va qolgan vaqtni ko'rsatsin
  • Tugagach ✅ Tayyor (X soniya) yozsin
  • Terminal kengligiga moslashsin (shutil.get_terminal_size())

Vazifa 5: print bilan jadval

Funksiya yozing: lug'atlar ro'yxatidan avtomatik jadval chizsin.

python
malumot = [
    {"ism": "Ali", "yosh": 25, "shahar": "Toshkent"},
    {"ism": "Sarvarbek", "yosh": 30, "shahar": "Samarqand"},
]
jadval(malumot)

Ustun kengligi eng uzun qiymatga moslashsin.

Yechim
python
def jadval(qatorlar: list[dict]) -> None:
    if not qatorlar:
        print("(bo'sh)")
        return

    ustunlar = list(qatorlar[0].keys())
    kengliklar = {
        u: max(len(str(u)), max(len(str(q[u])) for q in qatorlar))
        for u in ustunlar
    }

    sarlavha = " │ ".join(f"{u:<{kengliklar[u]}}" for u in ustunlar)
    chiziq = "─┼─".join("─" * kengliklar[u] for u in ustunlar)

    print(sarlavha)
    print(chiziq)
    for q in qatorlar:
        print(" │ ".join(f"{str(q[u]):<{kengliklar[u]}}" for u in ustunlar))

{u:<{kengliklar[u]}} — kenglik ham o'zgaruvchi bo'lishi mumkin (2.4-bo'lim).

Vazifa 6: = bilan nosozlik izlash

Quyidagi kodni {x=} yordamida qayta yozing:

python
a, b = 5, 10
print("a =", a)
print("b =", b)
print("a + b =", a + b)
print("a / b =", round(a / b, 3))
Javob
python
a, b = 5, 10
print(f"{a=}")
print(f"{b=}")
print(f"{a + b=}")
print(f"{a / b=:.3f}")

Vazifa 7: O'ylash

Nega logging da f-satr o'rniga % uslubi tavsiya etiladi?

Javob

Dangasa hisoblash.

python
logging.debug(f"Natija: {qimmat_hisob()}")

Bu yerda qimmat_hisob() har doim chaqiriladi — hatto DEBUG darajasi o'chirilgan bo'lsa ham. Chunki f-satr logging.debug chaqirilishidan oldin hisoblanadi.

python
logging.debug("Natija: %s", qimmat_hisob())

Bu ham qimmat_hisob() ni chaqiradi (argument sifatida). Lekin:

python
logging.debug("Natija: %s", qimmat_obyekt)

Bu yerda qimmat_obyekt.__str__() faqat xabar chiqariladigan bo'lsa chaqiriladi.

Ishlab chiqarishda DEBUG odatda o'chirilgan bo'ladi va bunday minglab chaqiruv bo'lishi mumkin — farq sezilarli.

15-qismda batafsil.

Nimani mustahkamlaydi: 2.1, 2.4, 2.5, 2.6, 2.8, 2.9-bo'limlar.


Xulosa

Bu darsda print() va input() ni to'liq o'rgandik.

Eng muhim uch fikr:

  1. input() doim str qaytaradi. Aylantirish majburiy va u ValueError berishi mumkin — try/except bilan himoyalang. .strip() deyarli doim kerak.

  2. f-satrlar juda kuchli. {qiymat:>15,.2f} bitta ifodada tekislash, kenglik, mingliklar va aniqlikni beradi. {x=} esa nosozlik izlashning eng tez usuli.

  3. print ning to'rt parametri bor: sep, end, file, flush. Ular jadval chizish, progress ko'rsatish, xatolarni ajratish uchun zarur.

Keyingi darsda — 3-qismning yakuni — izohlar, docstring va PEP 8 ni o'rganamiz. Kodni faqat ishlaydigan emas, o'qiladigan qilishning qoidalari.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
3.13-dars: input() va print() chuqur — IlmHamroh