for takrorlash operatori

Operatorning sintaksisi

Ushbu takrorlash operatori ham while operatori kabi amallar uchun ishlatiladi. Faqat, asosiy farqi ularning ishlash tamoyilida. Biz while takrorlash operatoriga biror shartni bog‘lab shu shart bajarilguncha ushbu operatorning tanasidagi kod qayta-qayta bajarilishini ko‘rdik. Qachonki, ushbu shart bajarilmasa, while operatorining ishlashi tugatilib, undan keyingi qatordagi dastur matnlari ishga tushiriladi. while operatorida biz asosan biror shartni tekshirgan bo‘lsak, ushbu operatorda esa biror takrorlanadigan(masalan, list yoki tuple turi) obyektdan elementlarni birma-bir ko‘rib chiqish asosida takrorlash jarayoni hosil qilinadi. Quyida, faraz qilamiz, mevalardan iborat fruits list obyekti berilgan bo‘lsin, uning elementlarini bitalab chop qiluvchi dastur matni keltirilgan:

Eslatma. Ingliz tilidagi Iterable so‘zini biz O‘zbek tilida takrorlanadigan deb tarjima qildik.

[ ]:
# uchta elementdan iborat ro‘yxat
fruits = ["olma", "banan", "behi"]
# for opertatori va shu ro‘yxatdagi
# elementlarni ko‘rib chiquvchi
# x o‘zgaruvchisi va in kalit so‘zi
# hamda ro‘yxat va nuqta
for x in fruits:
  # bu takrorlash operatorining
  print(x)
olma
banan
behi

Ushbu dastur matnida biz birinchi fruits o‘zgaruvchisini e’lon qildik. Undan so‘ng esa for kalit so‘zi, biror ixtiyoriy o‘zgaruvchi (hozirgi holda x), fruits obyekti hamda har doimgidek ikki nuqta va oxirida esa ushbu operatorning asosiy tansi print(x) keltirilgan. Ushbu matni, sodda qilibm quyidagicha o‘qish mumkin: x o‘zgaruvchisi fruits ro‘yxatining elementlarini birma-bir oladi: 1-holda x = "olma", 2-holda x = "bana", 3-holda esa x = "behi", hamda ularni chop etadi. Quyida yana shunga o‘xshash sodda namuna keltirilgan:

[3]:
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for num in nums:
  print(num, end=',')
0,1,2,3,4,5,6,7,8,9,

Ushbu hol ham oldingisi bilan deyarli bir xil, ya’ni nums ro‘yxatida raqamlarni saqladik hamda ularni birma-bir num o‘zgaruvchisiga olish orqali qiymatlarni chop qildik. E’tirbor bering nums bu ro‘yxat, num esa o‘zgaruvchi(ikki o‘zgaruvchining nomlari faqat s harfi bilan farqlanadi). Shuning uchun quyidagi dastur matni natijasi ham yuqoridagi bilan bir xil hisoblanadi:

[4]:
raqamlar = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for raqam in raqamlar:
  print(raqam, end=',')
0,1,2,3,4,5,6,7,8,9,

Natija bir xil bo‘lishi nuqtai nazaridan, ushbu o‘zgaruvchilarni qanday nomlash umuman ahamiyatga ega emas. Ammo, imkon qadar o‘zgaruvchi nomlari dasturdagi bajaryotgan vazifasiga mutanosib bo‘lishi qat’iy tavsiya etiladi. Oxirgi ikki dastur matni bir xil natija hosil qiladi, faqat o‘zgaruvchi nomlarini Ingliz va O‘zbek tilida yozdik. Tajribamizdan kelib chiqib, siz o‘quvchilarga o‘zgaruvchi nomlarini Ingliz tilida nomlashni hamda iloji bo‘lsa, imkon qadar qisqartirib belgilashni maslahat beramiz.

Takrorlanadigan o‘zgaruvchi turlari

Python dasturlash tilida bir qancha ichki takrorlanadigan turlar mavjud bo‘lib, ularni turli maqsadlarda ishlatganimiz uchun ham for operatori bilan ushbu turlarni ishlatganimizda har xil holatlar mavjud bo‘lishi mumkin. Shu sababdan ulardan bir qanchalarini ko‘rib chiqamiz.

  1. str(satr) turi o‘zgaruvchisining har bir elementi, ya’ni belgisi for uchun bitta takrorlash amalini bajarishga xizmat qiladi. Quyidagi misolda,

[5]:
matn = "Salom, Olam"
for belgi in matn:
    print(belgi)
S
a
l
o
m
,

O
l
a
m

E’tibor bering, biz har safar takrorlanadigan o‘zgaruvchilarning elementlarini chop qilyabmiz. Ammo, haqiqiy dastur yozganimizda, biz boshqa amallarni ham bajarishimiz mumkin. Masalan, quyidagi dastur matni berilgan satrdagi harflar va raqamlar sonini topadi:

[6]:
satr = "2jsdk39sie3ujis40540"
num_letters = 0
num_digits = 0
for belgi in satr:
    if belgi.isalpha():
        num_letters += 1
    elif belgi.isdigit():
        num_digits += 1
print("Harflar soni:", num_letters)
print("Raqamlar soni:", num_digits)
Harflar soni: 11
Raqamlar soni: 9

Yuqordagi kodda biz ikkita .isalpha() va .isdigit() metodlarini ishlatdik. Ushbu metodlar obyektlarga tegishli bo‘lgani uchun, aslida funksiya bo‘lsada, metod deb nomlandi. Chunki biz ularni biror obyekt nomidan keyin nuqta orqali chaqirishimiz mumkin. Bu kabi metodlarni keyinchalik obyektga yo‘naltirilgan dasturlash bo‘lmida o‘rganib chiqamiz.

  1. tuple turi bilan list turi o‘rtasida deyarli farqlanish yo‘q shuning uchun bu turga misol keltirmaymiz.

Bundan tashqari biz hali o‘rganib chiqmagan bir qancha turlar mavjud, shuning uchun ham biz ushbu qismda boshqa turlarga to‘xtalmaymiz.

Takrorlash hosil qiluvchi funksiyalar

Takrorlanadigan turlardan tashqari, bir nechta Python funksiyalari mavjud bo‘lib, ular bizga takrorlanadigan obyektlarni hosil qilib berish uchun xizmat qiladi.

  1. range(start, stop, step) funksiyasi list turidagi kesish amaliga o‘xshash tarizda uchta agument qabul qilib, takrorlanadigan obyekt qaytaradi. Uning argumentlari quyidagicha o‘zini tutadi: start va stop argumentining kelishuv bo‘yicha qiymati 0 va 1 ga teng. Agar bitta argumentga qiymat berilsa, u holda bu argument stop bo‘ladi. Hamda stop qiymati element sifatida qaytarilmaydi. Quyida ba’zi namunalar keltirilgan:

[10]:
# start=0, stop=5, step=1
for i in range(5): # range(0, 5, 1)
    print(i)
0
1
2
3
4
[11]:
# start=2, stop=5, step=1
for i in range(2, 5): # range(0, 5, 1)
    print(i)
2
3
4
[12]:
# start=0, stop=5, step=2
for i in range(2, 5, 2): # range(0, 5, 1)
    print(i)
2
4
  1. enumerate(iterable, start=0) funksiyasi takrorlanadigan turdagi obyektni qabul qilib, ushbu obyektning elementiga qo‘shib uning o‘rnini ham qaytaradi. Agar start=0 argumentiga biror qiymat bersak, u holda elementlarni sanashni shu sondan boshlaydi. Quyida namunalar:

[13]:
# masalan, list obyekti
letters = ['a', 'b', 'c', 'd', 'e']
for i, letter in enumerate(letters):
    print(letter, "harf o'rni:", i)
a harf o'rni: 0
b harf o'rni: 1
c harf o'rni: 2
d harf o'rni: 3
e harf o'rni: 4
[14]:
# masalan, list obyekti
letters = ['a', 'b', 'c', 'd', 'e']
for i, letter in enumerate(letters, 2):
    print(letter, "harf o'rni:", i)
a harf o'rni: 2
b harf o'rni: 3
c harf o'rni: 4
d harf o'rni: 5
e harf o'rni: 6
  1. zip() funksiyasi bittadan ortiq takrorlanadigan obyektlarni mos elementlarini bitta tuple obyekti sifatida jamlab, takrorlash hosil qiladi:

[15]:
digit_nums = [0, 1, 2, 3, 4, 5]
letter_nums = ['nol', 'bir', 'ikki', 'uch', "to'rt", 'besh']
for digit, letter in zip(digit_nums, letter_nums):
    print(digit, letter)
0 nol
1 bir
2 ikki
3 uch
4 to'rt
5 besh

Aloqador operatorlar

for-else operatori

Ushbu operator juda sodda hisoblanib, qachon for operatori tugasa bir marta bajariladi holos. Masalan, quyidagicha:

[ ]:
for x in range(6):
  print(x)
else:
  print("Oxiri tugadi")
0
1
2
3
4
5
Finally finished!

E’tibor qilgan bo‘lsangiz, ushbu dastur 0 dan 5 bo‘lgan sonlarni chop qilib, undan so‘ng bir marta else operatori tanasidagi qismni bajardi. Xuddi shunday operatorni while uchun ham qo‘llash mumkin:

[18]:
x = 0
while x < 6:
  print(x)
  x += 1
else:
  print("Oxiri tugadi")
0
1
2
3
4
5
Oxiri tugadi

break operatori

Bu operator ixtiyoriy takrorlashni to‘lig‘icha to‘xtatishni ta’minlaydi. Ba’zi hollarda, takrorlash jarayoni tugamasada dasturda takrorlashni majburan tugatish zarurati yuzaga keladi.

[20]:
fruits = ["olma", "banan", "qulupnay"]
for x in fruits:
  print(x)
  if x == "banan":
    break
olma
banan
[24]:
fruits = ["olma", "banan", "qulupnay"]
x = 0
while x < len(fruits):
  print(fruits[x])
  if fruits[x] == "banan":
    break
  x += 1
olma
banan

Yuqorida birinchi navbatdagi ro‘yxat elementi qiymat chop qilinib, undan so‘ng shart amali orqali shu qiymat banan ga tengligi tekshirilyabdi. Agar teng bo‘lsa, dastur to‘xtatilyabdi va undan so‘ng umuman takrorlanish davom etmaydi. Quyida esa navbatdagi element break operatori qo‘llanilishidan so‘ng chop qilinayotgani sababli, natijada faqat olma qiymatigina chop qilindi.

[21]:
fruits = ["olma", "banan", "qulupnay"]
for x in fruits:
  if x == "banan":
    break
  print(x)
olma

Agar takrorlash break operatori ishga tushishi natijasida to‘xtatilsa, u holda uning else operatori bajarilmaydi. Quyidagi takrorlashda ham 0 dan 6 gacha bo‘lgan sonlarni chop qilinyapti, lekin 3 ga kelganda break operatori ishga tushib, takrorlashni to‘xtatayabdi.

[ ]:
for x in range(6):
  if x == 3: break
  print(x)
else:
  print("Oxiri tugadi")
0
1
2
[26]:
x = 0
while x < 6:
  if x == 3: break
  print(x)
  x += 1
else:
  print("Oxiri tugadi")
0
1
2

continue operatori

Bu operator bilan break operatorining o‘rtasidagi asosiy farq. ushbu operator qo‘llanganda takrorlash tugamasda, balki shu operator qo‘llangan joydan boshlab qolgan hamma takrorlash amalning tanasidagi buyruqlar ishga tushirilmaydi yoki qisqa qilib, keyingisiga o‘tkazib yuboriladi:

[22]:
fruits = ["olma", "banan", "qulupnay"]
for x in fruits:
  if x == "banan":
    continue
  print(x)
olma
qulupnay
[28]:
fruits = ["olma", "banan", "qulupnay"]
x = 0
while x < len(fruits):
  if fruits[x] == "banan":
    x += 1
    continue
  print(fruits[x])
  x += 1
olma
qulupnay

Yuqorida aynan navbatdagi element qiymati bananga teng bo‘lganda, undan keyingi ammallar tashlab ketilyabdi hamda natijada ushbu banan qiymati chop etilmayabdi.

pass operatori

Ushbu operator ko‘plab boshqa operatorlar bilan birga kelishi mumkin hamda ularning tanasida hech qanday narsa mavjud emasligiga ishora qiladi. Albatta siz o‘quvchilarda, unda bunday mantiqqa ega bo‘lmagan qismlarni yozish nimaga zarur degan savollar tug‘ilishi turgan gap. Bundan savollarga keyinchalik javob olishingiz mumkin bo‘ladi, hozir esa buni ham bir qulaylik sifatida qabul qilish yetarli.

[ ]:
for x in range(10):
  pass
print(x)
9

Yuqoridagi dastur matnida biz for takrorlash operatorining to‘liq tanasi sifatida pass operatorini yozdik, bu operator hech qanday tana mavjud emasligini bildiradi, lekin ushbu holatda ham x o‘zgaruvchisi 9 qiymatiga yetib boradi, ya’ni takrorlash bajariladi.

Ichma-ich for operatori

Ixtiyoriy amallar ichma-ich bo‘lishi mumkin, bunday hollatlar algoritmlarni qanday yozishdan kelib chiqadi. Quyida mevalar va ularning sifatlarini chop etuvchi dastur matni keltirilgan.

[ ]:
adj = ["sariq", "katta", "shirin"]
fruits = ["olma", "banan", "qulupnay"]

for x in adj:
  for y in fruits:
    print(x, y)
qizil olma
qizil banan
qizil qulupnay
katta olma
katta banan
katta qulupnay
shirin olma
shirin banan
shirin qulupnay

Namunalar

Odatda, while operatoridan ham for operatorini ko‘proq ishlatamiz. Shuning uchun quyida turli holatlar uchun bir nechta namunaviy masalalarni ko‘rib chiqamiz.

  1. Masala. 1 dan n gacha bo‘lgan sonlarning yig‘indisini toping. Yechish. Odatda, agar biror sonlarning yig‘indisini topmoqchi bo‘lsak, unda biz har doim ularni biror umumiy o‘zgaruvchiga yig‘ib borishimizga to‘g‘iri keladi va u o‘zgaruvchining boshlang‘ich qiymati har doim 0 bo‘ladi.

[ ]:
s = 0
n = 10
for i in range(1, n):
  s += i
print("Yig‘indi:", s)
Yig‘indi: 45
  1. Masala. 1 dan n gacha bo‘lgan toq va juft sonlarning yig‘indisini alohida toping. Yechish. Buni masalani yechish uchun if-else operatoridan foydalanamiz hamda agar son juft bo‘lsa, u holda shu sonni ikkiga bo‘lganimizda, qoldik nol chiqish kerak. Masalan, juft bo‘lsa 14 % 2 = 0 va toq bo‘lsa 13 % 2 = 1.

[ ]:
s_odd = 0
s_even = 0
n = 10
for i in range(1, n):
  if i % 2 == 1: s_odd += i
  else: s_even += i
print("Toq yig‘indi:", s_odd)
print("Juft yig‘indi:", s_even)
Toq yig‘indi: 25
Juft yig‘indi: 20
  1. Masala. Quyidagi jadvalni o‘zida saqlovchi dastur matnini for takrorlash operatori bilan hosil qiling. Ushbu masalani oldingi while takrorlash operatori mavzusidagi kabi yechamiz.

Familiyasi

Ismi

Yoshi

Bo‘yi

Vazni

Samandarov

Baxtiryor

22

159

63

Axmadov

Doston

19

180

85

Qarshiyev

Baxrom

20

190

100

Davronov

Akmal

25

175

80

[34]:
n = 4
humans = []
for i in range(n):
  print(i+1, "-odam ma'lumotlarini kiriting: ")
  # familiyasi
  last_name = input('Familiya:')
  # ismi
  first_name = input('Ismi: ')
  # yoshi
  age = int(input('Yoshi: '))
  # bo‘yi
  height = int(input("Bo‘yi: "))
  # vazni
  weight = int(input("Vazni: "))
  # i-odamni to‘liq bitta o‘zgaruvchi
  # sifatida ifodalovchi list
  human = [last_name, first_name, age, height, weight]
  # umumiy listga qo‘shish
  humans.append(human)

# chop qilish
# sarlavha chop qilish
print("Familiya   |   Ism   |   Yosh   |   Bo‘y  |   Vazn")
for i in range(n):
  print(humans[i][0], "   |   ", humans[i][1],
  "   |   ", humans[i][2],
  "   |   ", humans[i][3],
  "   |   ", humans[i][4])
  i = i + 1
1 -odam ma'lumotlarini kiriting:
2 -odam ma'lumotlarini kiriting:
3 -odam ma'lumotlarini kiriting:
4 -odam ma'lumotlarini kiriting:
Familiya   |   Ism   |   Yosh   |   Bo‘y  |   Vazn
Samandarov    |    Baxtiryor    |    22    |    159    |    63
Axmadov    |    Doston    |    19    |    180    |    85
Qarshiyev    |    Baxrom    |    20    |    190    |    100
Davronov    |    Akmal    |    25    |    175    |    80