Tarmoqlanuvchi dasturlash

if-else operatori

Shu vaqtgacha biz faqat chiziqli dasturlashdan foydalandik, ya’ni biz yozgan kodlarning hammasi chiziqli (ketma-ket) ravishda ishladi va biror shartga ko’ra ma’lum bir kod qismi qolib ketmadi, albatta izohlardan tashqari (# belgisi bilan boshlanuvchi qatorlar). Bunday kodlash bilan murakkab dasturlarni yozishning iloji yo’q, shuning uchun endilikda biz bosqichma-bosqich chiziqli dasturlashdan tarmoqli dasturlashga, undan keyin esa takrorlanuvchi dasturlashga o’tamiz. Albatta biz har doim ushbu uchta turdan bir vaqtda foydalanamiz. Keling, amaliy misolga o’tsak. Masalan, foydalanuvchi o’zinning shaxsiy sahifasiga kirmoqchi. Buning uchun u dasturga o’zing yashirin paroli va email pochtasini yozishi kerak. Agar foydalanuvchi kiritgan ma’lumotlar mos bo’lmasa, unda biz foydalanuvchiga bu haqida xabar berishimiz kerak. Bu kabi buyruqlarni yozishda, biz if-elif-else buyruq strukturasidan foydalanamiz. Avval soddaroq holni qaraylik, bizda \(a, b \in R\) (ikkita haqiqiy sonlar ) berilgan bo’lsin. Ulardan qaysi biri katta ekanligini chop qilishimiz kerak, quyidagicha.

[1]:
# birinchi son
a = 20
# ikkinchi son
b = 15

# Bu yerda
# 1) if kalit so'z, har doim yozilishi kerak
# ma'nosi - agar
# keyin bo'sh joy tashlab
# Shartni yozamiz: a > b
# Undan so'ngi ikki nuqta (:) majburiy qo'yiladi
if a > b:
  # agar a > b shart to'g'iri bo'lsa
  # else kalit so'zgacha bo'lgan
  # hamma qatordagi kodlar bajariladi
  # faqat biz print funksiyani
  # qator boshidan 2 ta bo'sh joydan keyin yozdik
  print("Birinchi son katta")
# agar a > b shart noto'g'iri bo'lsa,
# else kalit so'zi va ikkit nuqta(:) majburiy
else:
  # agar a > b shart noto'g'iri bo'lsa
  # u holda else: dan keyingi hamma kod
  # bajariladi
  # faqat biz print funksiyani
  # qator boshidan 2 ta bo'sh joydan keyin yozdik
  print("Ikkinchi son katta")
Birinchi son katta

Yuqoridagi kodda hozirgacha bo’lgan eng qiyini. Shuning uchun batafsil har xil misollar yordamida tushunishga harakat qilamiz:

  1. joriy holda \(a=20\) va \(b=15\). Shunga asosan \(a>b \rightarrow 20>15\) ifoda to’g’iri, ya’ni 20 soni har doim 15 dan katta bo’ladi.

  2. Ushbu holni ifodalash uchun biz, Pythonda if kalit so’zini yozamiz, undan so’ng esa bizga zarur bo’lgan shartni ya’ni a > n va oxirda esa ikki nutqani (:)

  3. demak, agar \(a\) soni \(b\) sonidan katta bo’lsa (bu joriy holda to’g’iri), u holda print("Birinchi son katta") shu kodni ishlatamiz, ya’ni Birinchi son katta natija chiqadi.

  4. print("Birinchi son katta") kod qismi if ga tegishligini ifodalash uchun biz print("Birinchi son katta") ni if ga qaraganda bir nechta bo’sh joy tashlab, ichkariga kiritgan holda yozamiz (ushbu holda 2 ta).

  5. Bu narsani biz ingliz tilida ‘indentation’ deb ataymiz, o’zbek tilida chekinish deb tarjima qilsak to’g’iri bo’ladi deb o’ylaymiz. Bu narsa dastur kodida sintaktik xato bermasligi uchun, biz har doim bir sondagi bo’sh joy tashlashimiz kerak. Ushbu kitobda biz har doim 2 ta tashlaymiz.

  6. Ushbu kodning ikkinchi qismida, ya’ni if dagi shart noto’g’iri bo’lganda, biz boshqa kod print("Ikkinchi son katta") ni ishga tushirmoqchimiz. Buning uchun biz chekinishi (indentation) if bilan bir xil boshlanuvchi else (manosi, boshqa holda) kalit so’zni ikki nuqta bilan yozamiz hamda keyingi qatorga ikkitalik chekinishdan keyin esa print("Ikkinchi son katta") yozamiz.

Yuqoridagi kod bajarilishi natijasida bizga Ikkinchi son katta yozuvi chiqadi. Chunki \(a\) o’zgaruvchining qiymati \(b\) nikidan katta. Keling qulay bo’lishi uchun quyidagi atama kiritsak: ushbu kod ishga tushish natijasida bir qismdagi kod ishga tushiriladi (hozirgi holda, print("Birinchi son katta")), shu kodlarni if ning va else ning kodlari deymiz.

Mantiqiy(bool) tur bilan ishlash

Bundan oldingi kod yordamida biz tarmoqlanuvchi dasturlashni o’rgandik. Aslida biz if kalit so’zidan keyin qo’ygan ifodamiz rost (True) yoki yolg’on (False) ekanligini tekshirdik. Agar ifoda rost bo’lsa, if ning kodi bajariladi, aks holde else niki. Ushbu \(a>b\) ifodaning natijasi ikki xil bo’lishi mumkin: rost(True) yoki yolg’on(False). Bu kabi turni Pythonda ifodalash uchun biz bool turidan foydalanamiz. Ushbu turda faqat ikkita qiymat bo’ladi: True yoki False. Bu turda o’zgaruvchi e’lon qilmoqchi bo’lsak, unda biz True yoki False qiymatlaridan ishlatamiz. True va False qiymatlari literal qiymatlar deyiladi.

[2]:
# bool turidagi o'zgaruvchi
a = True
print(a)
b = False
print(b)
True
False

Bunday turni katta, kichik va teng amallari orqali ham yaratishimiz mumkin.

[3]:
# a o'zgaruvchisi
a = 15
# b o'zgaruvchisi
b = 20
# a > b ifodani boshqa bool
# turidagi o'zgaruvchiga
# yuklash
c = a > b
print(c)
False

Natija har doim False chiqdi chunki \(b\) o’zgaruvchisining qiymati \(a\) nikidan katta. Keling bundan oldingi kodi qayta yozaylik. Faqat yuqoridagi kod kabi, shart natijasini boshqa alohida o’zgaruvchiga yuklab.

[4]:
a = 20
b = 15
c = a > b
if c:
  print("Birinchi son katta")
else:
  print("Ikkinchi son katta")
Birinchi son katta

Ushbu turda bir qancha turli xil amallar mavjud bo’lib, ular odatiy matematik amallardan farqlanadi, ular:

  1. and - amali ikkita qiymat ham rost (True) bo’lsa natija ham rost True

[5]:
a = True
b = True
# natija True
c = a and b
print(c)
a =True
b = False
# natija False
c = a and b
print(c)
True
False
  1. or - amali ikkita qiymatdan biri rost (True) bo’lsa, natija ham rost True

[6]:
a = True
b = True
# natija True
c = a or b
print(c)
a =True
b = False
# natija True
c = a or b
print(c)
a =False
b = False
# natija False
c = a or b
print(c)
True
True
False
  1. not - amali qiymatni teskarisiga o’tkazadi, rost bo’lsa yolg’on yoki yolg’on bo’lsa rostga

[7]:
a = True
# natija False
c = not a
print(c)
a = False
# natija rost
c = not a
print(c)
False
True

if-elif-else operatori

O’tgan boblarda biz ushbu operatorning qisqartirilgan ko’rinishi bilan tanishdik. Ushbu qismda esa to’liq o’rganib chiqamiz. Avvalo ushbu operator ishlashi uchun eng kamida operatorning if qismi bo’lishi shart. Qolgan ikki qismi elif va else kodga qarab zurur bo’lsa ishlatiladi.

[8]:
# email o'zgaruvchisi
email = 'example@mail.com'
# yuqoridagi email to'g'iriligini tekshirish
if email == 'example@mail.com':
  # if ning kodi
  print("Kiritilgan email to'g'iri")
Kiritilgan email to'g'iri

Bu operatorning elif (else if) qismi bir vaqtda undan oldingi if yoki elif ga teskarilikni hamda ya’na bitta shartni bildiradi. Quyidagi kiritilgan \(a\) raqamini so’zlar bilan ifodalashga misolni ko’raylik.

[9]:
a = 5
# a=0 bo'lgan holat
if a == 0:
  print('Nol')
# # a=1 bo'lgan holat
elif a == 1:
  print('Bir')
elif a == 2:
  print('Ikki')
elif a == 3:
  print('Uch')
elif a == 4:
  print('To\'rt')
elif a == 5:
  print('Besh')
elif a == 6:
  print('Olti')
elif a == 7:
  print('Yetti')
elif a == 8:
  print('Sakkiz')
elif a == 9:
  print('To\'qiz')
else:
  print("Kiritilgan son 0 va 9 orasida bo'lishi shart")
Besh

Yuqoridagi kod birinchi if yordamida \(a\) o’zgaruvchisi qiymatini 0 ga tekshiradi, agar teng bo’lmasa o’zidan keyingi, birinchi elif ishlaydi va bu soning qiymatini 1 ga tengligini tekshiradi va shu tarzda davom etadi. Oxirida esa, raqamlar tugagandan so’ng, else qismida raqam chegaradan chiqib ketdimi yo’qmi shu tekshiriladi. Agar ushbu ketma-ketlikning biror shart to’g’iri bo’lsa, shu qismdagi kod ishlaydi va dasturning qolgan qismlariga (shartlariga) o’tilmaydi. Yuqoridagi qiymat 5 bo’lgani uchun biz Besh ni natija sifatida ko’rdik. Demak, beshgacha bo’lgan 6 shartni bittalab tekshirilgan va ulardan birinchi beshtasi noto’g’iri bo’lgan.

Namunalar

Keling yuqorida o’rganib chiqqan mavzularimizga ozroq qo’shimcha qilib internet sahifasiga kirishga ruxsat bor yoki yo’qligini tekshiruvchi kichkina dastur yozib ko’raylik va shu orqali olgan bilimlarimizni mustahkamlaylik. Buning uchun foydalanuvchi tomonidan qiymatlarni kiritishni birinchi o’rganaylik. Buning uchun biz input(str) funksiyasidan foydalanamiz, bu funksiya bizga str (satr) turida qiymat qaytaradi. Quyida foydalanuvchi kiritgan matni chop qiluvchi dastur.

[10]:
# matni name o'zgaruvchisiga yozish
name = input('Ismingizni kiriting: ')
# Kiritilgan qiymatni chop qilish
print('Sizning ismingiz:', name)
Sizning ismingiz: Alisher

Yuqorida ko’rib turganimizdek, biz birinchi input() funksiyasi orqali foydalanuvchi o’zining ismini yozishi uchun maydonni hosil qilyabmiz. Foydalanuvchi o’zining ismini kiritib, keyin ‘kiritish’ (Enter) tugmasini bosgandan so’ng, biz input() funksiyasi qaytargan natijasini ekranga chiqarayapmiz. Agar qaytarilgan qiymat, masalan, foydalanuvchi yoshi bo’lsa unda, biz bu qiymatni butun songa o’tkazishimiz kerak, chunki input() funksiyasi har doim sart qaytaradi. Buning uchun bizda tayyor funkiyalar har bir tur uchun mavjud. Oson bo’lishi uchun avval str va int o’zgaruvhisi farqiga oid ba’zi sodda misollarni qarab chiqaylik. Quyidagi kodda ulardan bir nechtasiga namuna keltirilgan.

[11]:
# a qiymatni insoning yoshini saqlaydi
# a o'garuvchisi satr butun emas
a = '25'
# keyinig o'zgaruvchini qaraylik
# bu o'zgaruvchi butun turda
b = 20

# agar o'zgaruvchini qo'shsak
# unda xatolik yuz beradi
# chunki satr turiga butun turni
# qo'shish mumkin emas
c = a + b
print(c)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[11], line 12
      6 b = 20
      8 # agar o'zgaruvchini qo'shsak
      9 # unda xatolik yuz beradi
     10 # chunki satr turiga butun turni
     11 # qo'shish mumkin emas
---> 12 c = a + b
     13 print(c)

TypeError: can only concatenate str (not "int") to str

Agar yuqoridagi kodni to’g’irlab ishlatmoqchi bo’lsak, unda \(a\) sonini int turiga o’kazishimiz zarur. Buning uchun int() funksiyasini ishlatamiz.

[12]:
a = '25'
b = 20
# a ning qiymatini int turiga
# o'girib uni d
# o'zgaruvchisiga saqladik
d = int(a)
c = d + b
print(c)
45

Bir eng muhim jihatdni turdan boshqa turga o’zgaruvchini o’tkazishdan oldin bilishimiz kerak. Odatda biz hamma turlarni boshida satr ko’rinishida, ya’ni satr turida olamiz va ularning qanday ma’lumot ekanligiga qarab mos turlarga o’giramiz. Lekin har doim ham bunday qilishning iloji yo’q. Masalan, tassavur qilaylik foydalanuvchi o’zining yoshini kiritish jarayonida xatolik qilib qo’ydi. Misol uchun ‘22’ o’rniga ‘22a’ yoki ‘22 ‘ kiritib qo’ydi. Unda yuqoridagi int() funksiyasi xatolik qaytaradi va dastur oxirigacha yetmasdan yakunlanadi. Quyidagi kodda ushbu hol uchun ba’zi bir misollarni ko’ramiz.

[13]:
# to'g'ir holat
age = '22'
# natija <class 'str'>
print(type(age))
# endi int turiga o'tkazaylik
age = int(age)
# natija <class 'int'>
print(type(age))
# xato hollatlar
age = int('22a') # bu yerda xatolik bor
# bu joyga kod kelmaydi
print(age)
<class 'str'>
<class 'int'>
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[13], line 10
      8 print(type(age))
      9 # xato hollatlar
---> 10 age = int('22a') # bu yerda xatolik bor
     11 # bu joyga kod kelmaydi
     12 print(age)

ValueError: invalid literal for int() with base 10: '22a'

Bu kabi hollatlarda biz ValueError ga ega bo’lamiz, buning ma’nosi kiritilgan qiymatni (‘22a’) int turiga o’girib bo’lmaydi. Endi asosiy maqsadimiz bo’lgan, dasturga qaytsak bo’ladi.

[14]:
email = input('Emailingizni kiriting: ')
password = input('passwordingizni kiriting: ')
# birinchi shart
a = email == 'example@mail.com'
# ikkinchi shart
b = password == 'qwerty1234'
# foydalanuvchi sahifasiga kirishi
# uchun ikkisi ham
# bir vaqtda to'g'iri
# bo'lishi kerak
if a and b:
  print("Siz shaxsiy sahifangizdasiz")
else:
  print("Email yoki parolingiz xato kiritilgan")
Siz shaxsiy sahifangizdasiz