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 belgisifor
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.
tuple
turi bilanlist
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.
range(start, stop, step)
funksiyasilist
turidagi kesish amaliga o‘xshash tarizda uchta agument qabul qilib, takrorlanadigan obyekt qaytaradi. Uning argumentlari quyidagicha o‘zini tutadi:start
vastop
argumentining kelishuv bo‘yicha qiymati0
va1
ga teng. Agar bitta argumentga qiymat berilsa, u holda bu argumentstop
bo‘ladi. Hamdastop
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
enumerate(iterable, start=0)
funksiyasi takrorlanadigan turdagi obyektni qabul qilib, ushbu obyektning elementiga qo‘shib uning o‘rnini ham qaytaradi. Agarstart=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
zip()
funksiyasi bittadan ortiq takrorlanadigan obyektlarni mos elementlarini bittatuple
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 banan
ga 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-else
operatoridan foydalanamiz hamda agar son juft bo‘lsa, u holda shu sonni ikkiga bo‘lganimizda, qoldik nol chiqish kerak. Masalan, juft bo‘lsa14 % 2 = 0
va 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
for
takrorlash operatori bilan hosil qiling. Ushbu masalani oldingiwhile
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