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.
str(satr) turi o‘zgaruvchisining har bir elementi, ya’ni belgisiforuchun 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.
tupleturi bilanlistturi 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.
range(start, stop, step)funksiyasilistturidagi kesish amaliga o‘xshash tarizda uchta agument qabul qilib, takrorlanadigan obyekt qaytaradi. Uning argumentlari quyidagicha o‘zini tutadi:startvastopargumentining kelishuv bo‘yicha qiymati0va1ga teng. Agar bitta argumentga qiymat berilsa, u holda bu argumentstopbo‘ladi. Hamdastopqiymati 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
enumerate(iterable, start=0)funksiyasi takrorlanadigan turdagi obyektni qabul qilib, ushbu obyektning elementiga qo‘shib uning o‘rnini ham qaytaradi. Agarstart=0argumentiga 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
zip()funksiyasi bittadan ortiq takrorlanadigan obyektlarni mos elementlarini bittatupleobyekti 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.
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
Masala. 1 dan n gacha bo‘lgan toq va juft sonlarning yig‘indisini alohida toping. Yechish. Buni masalani yechish uchun
if-elseoperatoridan foydalanamiz hamda agar son juft bo‘lsa, u holda shu sonni ikkiga bo‘lganimizda, qoldik nol chiqish kerak. Masalan, juft bo‘lsa14 % 2 = 0va toq bo‘lsa13 % 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
Masala. Quyidagi jadvalni o‘zida saqlovchi dastur matnini
fortakrorlash operatori bilan hosil qiling. Ushbu masalani oldingiwhiletakrorlash 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