Comprehensions
‘Comprehension’ nədir?
Pythonda ‘comprehension’ bizə mövcud ardıcıllıqlardan istifadə edərək, yeni ardıcıllıqlar (list, set,dict və s.) yaratmağa imkan verir.Yəni, dövrlərdən və şərtlərdən istifadə edərək yazdığımız uzun kod blokları əvəzinə daha səliqəli və bir sətirlik kod blokları yazmaq ikmanı yaradır.Pythonda əsasən 3 növ ‘comprehension’ istifadə olunur.
1. List (matrikslər üçün)
2. Set (çoxluqlar üçün)
3. Dictionary (lüğətlər üçün)
List comprehension
‘Comprehension’ istifadə edərək birbaşa list yaratmaq və ya mövcud listdən müəyyən şərt daxilində elementlər götürərək yeni list yaratmaq olar.Gəlin,nümunəyə baxaq:
Tutaq ki, biz, içində 1-dən 20-yə qədər ədədlər olan my_list adında bir list yaratmaq istəyirik,Bunun üçün hər bir ədədi ya özümüz yazmalıyıq,ya da çox sətirli kod bloklarından istifadə etməliyik.
my_list = [ ]
for i in range(1,20):
my_list.append(i)
print(my_list)
Onun əvəzinə isə ‘comprehension’ istifadə edərək daha yığcam kod yazmaq olar.Burada birinci yazılan (i) dəyişəni listə əlavə olunacaq elementi təmsil edir və for dövrü ilə bağlıdır.
my_list=[i for i in range(1,20)]
print(my_list) #nəticə:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
İndi isə,mövcud listin müəyyən şərt daxilində götürülmüş elementlərindən necə yeni list yaratmaq olar ona baxaq. Tutaq ki,bir listin içindəki cüt ədədləri götürüb, yeni bir listə əlavə etmək istəyirik.Əvvəlcə bunu adi qayda ilə edək.
my_list = [1,2,3,4,5,6]
new_list = [ ]
for i in my_list:
if i%2 == 0:
new_list.append(i)
print(new_list) #nəticə [2, 4, 6]
Gəlin, indi ‘comprehension’ ilə yazılışına baxaq:
my_list=[1,2,3,4,5,6]
new_list=[i for i in my_list if i%2 == 0]
print(new_list) #nəticə [2, 4, 6]
Göründüyüz kimi burda sintaksis 3 hissədən ibarətdir:
1.Listə əlavə olunacaq elementi təmsil edən dəyişən(şərt ödəndiyi halda) — i
2.Dövr — for i in my_list
3.Şərt — if i%2 == 0
İndi isə, listdəki tək elementəri 2 dəfə, cüt elementləri 3 dəfə artıran bir proqram yazaq və bunu ‘comprehension’ ilə edək.
my_list=[1,2,3,4,5,6]
new_list=[i*2 if i % 2 == 1 else i*3 for i in my_list ]
print(new_list) #nəticə [2, 6, 6, 12, 10, 18]
Gördüyünüz kimi, adi yazılışdan fərqli olaraq burada birinci şərt bloku, daha sonra dövr yazılır.Əgər if blokundakı şərt ödənilirsə, birinci proses(i*2) əks halda isə ikinci proses (i*3) həyata keçirilir və listə əlavə olunur.
‘Comprehension’ da həmçinin, iç-içə dövrlərdən istifadə edərək ikili listlər yarada və ya mövcud listlərin üzərində iterasiya edə bilərik.Gəlin, əvvəlcə sadə bir ikili list yaradaq və bunu adi qayda ilə edək.
new_list = [ ]
for i in range(3):
temp = [ ]
for j in range(3):
temp.append(i)
new_list.append(temp)
print(new_list) #nəticə [[0, 0, 0], [1, 1, 1], [2, 2, 2]]
Gördüyünüz kimi kod uzun oldu və əlavə dəyişənlər istifadə etməyə məcbur olduq.Bu isə, heç də xoşa gələn hal deyil.Gəlin kodu daha yığcam hala salaq.
new_list=[ [ i for j in range(3) ] for i in range(3) ]print(new_list) #nəticə [[0, 0, 0], [1, 1, 1], [2, 2, 2]]
Burada sintaksis 2 əsas hissədən ibarətdir və hər iki hissəyə ayrı-ayrılıqda ‘comprehension’ tətbiq olunmuşdur.Həmçinin, 1-ci hissənin özüdə 2 hissədən ibarətdir.
1. [ i for j in range(3) ]
1. i
2. for j in range(3)
2. for i in range(3)
Əvvəlcə i dövrü işləyir.
1-ci addımda i=0, j dövrü 3 dəfə işləyərək [ 0, 0, 0 ] listini yaradır və bu listi əsas listə əlavə edir.
2-ci addımda i=1, j dövrü 3 dəfə işləyərək [ 1, 1, 1 ] listini yaradır və bu listi əsas listə əlavə edir.
3-cü addımda i=2, j dövrü 3 dəfə işləyərək [ 2, 2, 2 ] listini yaradır və bu listi əsas listə əlavə edir.
Koddan da göründüyü kimi,j dövrü bir növ yuxarıdakı nümunədəki temp dəyişənin rolunu oynayır.
Bu yazımızda ümumi ‘compherension’ anlayışı ilə tanış olduq və ‘list compherension’ aydınlaşdırdıq.Növbəti yazımızda ‘set,dict compherension’ haqqında danışacağıq.
Vəli Vəliyev