You are on page 1of 11

პროგრამირების საწყისები

Python
ლ ე ქ ც ი ა 1 2 : კ ო ნ ტე ი ნ ე რ ე ბ ი ,  ი ტე რ ა ტო რ ე ბ ი ,   გ ე ნ ე რ ა ტო რ ე ბ ი

ლიკა სვანაძე
lika.s v anadze@bt u.edu.ge
for ციკლი სხვადასხვა ტიპის მონაცემებისთვის
§ for ციკლი შეიძლება გამოყენებული იყოს სხვადასხვა ტიპის
მონაცემებთან, მაგ. სტრიქონი, სია, tuple, სიმრავლე,  ლექსიკონი.

text= "Python"
for i in [3,6,2,3,1,8]: for i in {3,6,5,2,4,3}:
for i in text:
print(i) print(i)
print(i)

t=(4,6,5,2) for i in {1:1, 9:81, 4:16}:


for i in range(10):
for i in t: print(i)
print(i)
print(i)

§ for ციკლი არის კარგი მაგალითი იტერაციის, რაც გულისხმობს


თანმიმდევრობით (თითო-თითოდ) ოპერაციების შესრულებას.

17.12.19 lika.svanadze@btu.edu.ge 2
კონტეინერი
§ კონტეინერი არის ობიექტი, რომელიც აერთიანებს სხვადასხვა ტიპის ობიექტებს, ან
წარმოადგენენ მონაცემთა მიმდევრობას. მაგალითად ჩაშენებული (built-in)
კონტეინერებია: list, tuple, set, dict.

§ მონაცემთა ერთობლიობის დროს ხშირად გვჭირდება მის ყველა ელემენტზე


თანმიმდევრული წვდომა და სხვადასხვა მოქმედებების შესრულება.

§ კონტეინერის (მაგ. სიის) ელემენტებისთვის მნიშვნელობების მინიჭებისთვის ხშირად


გამოიყენება for-ციკლის მოკლე ჩანაწერი შემდეგნაირად:

double = [i*i for i in range(10)] შედეგი: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
print(double)

double = list(i*i for i in range(10)) შედეგი: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
print(double)

double = [i*i for i in range(10) if i%2==1] შედეგი: [1, 9, 25, 49, 81]
print(double)

17.12.19 lika.svanadze@btu.edu.ge 3
იტერატორი
§ იტერაცია ნიშნავს მონაცემებზე წვდომას და მათ დამუშავებას თანმიმდევრობით.

§ იტერატორი არის ობიექტი, რომლის მეშვეობით ხდება მონაცემებიდან


თანმიმდევრობით თითო-თითო ელემენტის დაბრუნება.

§ იტერატორს აქვს ორი ფუნქცია:


§ ფუნქცია iter() -­‐ ასევე შეიძლება გამოყენებული იქნას მეთოდის სახით __iter__()  .  მისი
მეშვეობით ხდება კონკრეტული კონტეინერის გარდაქმნა იტერატორში.
§ ფუნქცია next() -­‐ ასევე შეიძლება გამოყენებული იქნას მეთოდის სახით __next__(),
რომელიც აბრუნებს მომდევნო ელემენტს რიგ-რიგობით. თუ მიმდევრობაში აღარ არის
შემდეგი ელემენტი, ფუნქცია აბრუნებს StopIteration შეცდომას.

§ Python-ში არსებულ ჩაშენებულ კონტეინერებს აქვთ იტერატორის მხარდაჭერა. ანუ


ჩაშენებული კონტეინერები პითონში არის იტერაციული (ანუ მათი გარდაქმნა
იტერატორში შესაძლებელია).

17.12.19 lika.svanadze@btu.edu.ge 4
იტერატორის შექმნა
§ იტერატორის შექმნა ხდება iter() ფუნქციის საშუალებით.
თავდაპირველად შევქმნათ რომელიმე მიმდევრობითი ტიპის (მაგ.
სიის) მონაცემი და გარდავქმნათ იტერატორში. შექმნილი ობიექტის
ტიპია list_iterator.

Python  Console

>>> t=[1,4,3,2]
>>> my_iter=iter(t)
>>> type(my_iter)
<class 'list_iterator'>

17.12.19 lika.svanadze@btu.edu.ge 5
იტერატორის მეშვეობით ელემენტების დაბრუნება

§ იტერატორის შექმნის შემდეგ, იმისათვის რომ მიმდევრობის (ჩვენს


მაგალითში სიის) თითო-თითო ელემენტი წავიკითხოთ უნდა
გამოვიყენოთ next() ფუნქცია.
Python  Console
§ თითოეული გამოძახებისას, next()
>>> t=[1,4,3,2]
>>> my_iter=iter(t) ფუნქცია აბრუნებს მომდევნო
>>> next(my_iter)
1
ელემენტს. თუ აღარ არის
>>> next(my_iter) #ან my_iter.__next__() მომდევნო ელემენტი, მაშინ
4
>>> next(my_iter) აბრუნებს StopIteration
3
>>> next(my_iter) შეცდომას.
2
>>> next(my_iter)
Traceback (most recent call last):
§ ასევე შეგიძლიათ გამოიყენოთ
File "<input>", line 1, in <module> __next__() მეთოდი იტერატორის
StopIteration
ობიექტისთვის.

17.12.19 lika.svanadze@btu.edu.ge 6
მაგალითი 1

§ მოცემულია სია [4, 5, 6, 7, 3, 5, 3, 1]. შექმენით სიის იტერატორი. next()


ფუნქციის მეშვეობით წაიკითხეთ თითოეული ელემენტი და დაბეჭდეთ
ეკრანზე. StopIteration შეცდომის გამოსროლის შემთხვევაში დაასრულეთ
მონაცემების წაკითხვა.

შესრულება: შედეგი:

4
t=[4,5,6,7,3,5,3,1]
5
my_iter=t.__iter__()
6
while True:
7
try:
3
print(next(my_iter))
5
except StopIteration:
3
break
1

17.12.19 lika.svanadze@btu.edu.ge 7
გენერატორი
§ გენერატორის მეშვეობით შესაძლებელია იტერატორის შექმნა.

§ გენერატორი იწერება როგორც ფუნქცია, თუმცა return-ის ნაცვლად არის yield


ბრძანება.  გენერატორი შეიძლება შეიცავდეს ერთ ან რამდენიმე yield ბრძანებას.

§ თავდაპირველად ხდება გენერატორის გამოძახება (მსგავსად ფუნქციისა).


გამოძახებისას გენერატორი აბრუნებს იტერატორს, მაგრამ არ ხდება გენერატორის
ბრძანებების შესრულება.

§ გენერატორის ბრძანებების შესრულება ხდება next() ფუნქციის გამოყენებით უკვე


შექმნილი იტერატორისთვის. პირველად next-ის გამოყენებისას გენერატორში
სრულდება არსებული ბრძანებები yield-­‐ის ჩათვლით. მომდევნო next()-ის
გამოყენებისას გენერატორი აგრძელებს იმ ადგილიდან სადაც გაჩერდა და
ასრულებს ბრძანებებს მომდევნო yield-მდე. თუ გენერატორში არ არის მომდევნო
yield, next() ფუნქციის გამოყენებისას ბრუნდება StopIteration შეცდომა
(იხილეთ მაგალითი მომდევნო სლაიდზე).

17.12.19 lika.svanadze@btu.edu.ge 8
მაგალითი 2
def my_gen(): გენერატორის შექმნა
n = 1
print('This is printed first')
yield n

n += 1
print('This is printed second')
yield n
შედეგი:
n += 1
print('This is printed at last')
yield n This is printed first
1

This is printed second


##იტერატორის შექმნა my_gen გენერატორის მეშვეობით 2
a=my_gen()
This is printed at last
## გენერატორის ბრძანებების შესრულება 3

print(next(a)) Traceback (most recent call last): File


print(next(a)) "L12.py", line 98, in <module>
print(next(a)) print(next(a))
print(next(a)) StopIteration

17.12.19 lika.svanadze@btu.edu.ge 9
მაგალითი 3
შექმენით (აღწერეთ) 5-ის ჯერადი რიცხვების გენერატორი. გენერატორის
მეშვეობით შექმენით იტერატორი და 10 ჯერ დაბეჭდეთ 5-ის ჯერადი რიცხვები
თანმიმდევრობით.

შესრულება შედეგი:

def gen5(): 5
i=5 10
while True: 15
if i%5==0: yield i 20
i+=5 25
30
b=gen5() 35
for i in range(10): 40
print(next(b)) 45
50

17.12.19 lika.svanadze@btu.edu.ge 10
სავარჯიშოები
• შექმენით სია, რომლის ელემენტებია 1-დან 100-მდე არსებული 5-ის ჯერადი რიცხვების კუბები. გამოიყენეთ for ციკლის
მოკლე ჩაწერის ფორმა. შესაბამისი ფუნქციის გამოყენებით იპოვეთ სიის მაქსიმალური ელემენტი.
• წინა მაგალითში არსებული სიისთვის შექმენით იტერატორი და StopIteration შეცდომის გამოსროლამდე
დაბეჭდეთ სათითაოდ იტერატორის ელემენტები next() ფუნქციის გამოყენებით.
• შექმენით სიმრავლე, რომლის ელემენტებია 1-დან 100-მდე არსებული 5-ის ჯერადი რიცხვების კუბები. გამოიყენეთ for
ციკლის მოკლე ჩაწერის ფორმა. შესაბამისი ფუნქციების გამოყენებით იპოვეთ სიმრავლის ელემენტების საშუალო
არითმეტიკული.
• წინა მაგალითში არსებული სიმრავლისთვის შექმენით იტერატორი და StopIteration შეცდომის გამოსროლამდე
დაბეჭდეთ სათითაოდ იტერატორის ელემენტები next() ფუნქციის გამოყენებით.
• შექმენით tuple ტიპის ობიექტი, რომლის ელემენტებია 1-დან 100-მდე არსებული 5-ის ჯერადი რიცხვების კუბები.
გამოიყენეთ for ციკლის მოკლე ჩაწერის ფორმა. შესაბამისი ფუნქციის გამოყენებით იპოვეთ tuple-­‐ის სიგრძე
(ელემენტების რაოდენობა).
• წინა მაგალითში არსებული tuple ტიპის ობიექტისთვის შექმენით იტერატორი და StopIteration შეცდომის
გამოსროლამდე დაბეჭდეთ სათითაოდ იტერატორის ელემენტები next() ფუნქციის გამოყენებით.
• შექმენით გენერატორი, რომელიც სათითაოდ დააბურნებს რიცხვებს 1-დან 5-მდე. შექმენით შესაბამისი იტერატორი და
სათითაოდ გამოიძახეთ 1-დან 5-მდე მდე რიცხვები.

17.12.19 lika.svanadze@btu.edu.ge 11

You might also like