Siyahı generatorları

   Öncəliklə qeyd edək ki, generatorlar ilə siyahı generatorları ayrı-ayrı şeylərdir. Generatorlar funksiyalar mövzusundan sizə tanış gəlməlidir. Belə ki, generatorlar hər iterasiya zamanı müəyyən qiyməti qaytaran funksiyalardır. İndi haqqında bəhs edəcəyimiz siyahı generatorları isə müəyyən qaydalar əsasında qiymətlərlə doldurulmuş siyahılar düzəldən xüsusi sintaksik konstruksiyalardır.

   Siyahı generatorlarının üstünlüyü siyahıları əldə etmək üçün çox qısa koddan istifadə etməsindən ibarətdir. Adi qaydada siyahıların düzəldilməsi nisbətən daha çox kod yazılmasını tələb edir.

Siyahı generatorunun sintaksisi aşağıdakı kimidir:

[ifadə for element in ardıcıllıq/kolleksiya]

   Burada element istifadə olunan dəyişəndir, ardıcıllıq (sətir, siyahı və kortej) və ya kolleksiya (çoxluq və lüğət) elementi götürdüyümüz yerdir, ifadə isə element üzərində aparılan əməliyyatdır.

   Gəlin bir neçə nümunələri nəzərdən keçirək. Aşağıdakı proqram elementləri 1-dən 10-a qədər ədədlərdən ibarət olan siyahı düzəldir:

>>> m = [i for i in range(1, 11)]
>>> print(m)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>

   Siyahı generatorundan istifadə etmədən də bu məsələni həll etmək olardı. Lakin bu zaman daha çox kod yazmaq lazım gələcəkdi:

>>> m = []
>>> for i in range(1, 11):
	m.append(i)

	
>>> print(m)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>

   Aşağıdakı proqram elementləri 1-dən 10-a qədər ədədlərin kvadratlarından ibarət olan siyahı düzəldir:

>>> m = [i ** 2 for i in range(1, 11)]
>>> print(m)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>

   Siyahı generatoruna şərt də əlavə etmək olar:

>>> num = [1, 4, 3, 17, 8, 9, 22, 6, 13]
>>> m = [i for i in num if i % 2 == 0]
>>> print(m)
[4, 8, 22, 6]
>>>

   Siyahı generatorundakı parametr ifadədə istifadə olunmaya da bilər. Məsələn aşağıdakı nümunədə siyahı 10 təsadüfi ədəddən düzəldilir:

>>> from random import randint
>>> m = [randint(10, 20) for i in range(10)]
>>> print(m)
[20, 11, 16, 14, 16, 17, 18, 11, 11, 12]
>>>

   Siyahı generatorundan istifadə etməklə siyahını klaviaturdan daxil edilən sətirlərlə də düzəltmək olar. Bunun üçün öncə sətirlərin sayını daxil etməlisiniz:

n = int(input())
m = [input() for i in range(n)]

   Siyahı generatorunda kolleksiya kimi lüğət (dict) tipindən də istifadə edə bilərsiniz:

>>> a = {1:10, 2:20, 3:30}
>>> b = [i*a[i] for i in a]
>>> print(b)
[10, 40, 90]
>>>

   Siyahı generatorundan istifadə etməklə iç-içə siyahılar da əldə etmək mümkündür:

>>> m = [[i,i**2,i**3] for i in range(2,10,2)]
>>> print(m)
[[2, 4, 8], [4, 16, 64], [6, 36, 216], [8, 64, 512]]
>>>

   Siyahı generatorunda iç-içə for konstruksiyasından istifadə etmək mümkündür. Bu cür istifadə verilmiş iç-içə siyahıdan bir səviyyəli siyahı əldə etmədə faydalı ola bilər:

>>> a = [[1,10], [2,20], [3,30]]
>>> b = [j for i in a for j in i]
>>> print(b)
[1, 10, 2, 20, 3, 30]
>>>

   Siyahı generatorundan istifadə etməklə fayldan oxunan sətrlərdən də siyahı düzəltmək mümkündür:

f = open("text.txt","r")
lines = [line.strip() for line in f]
f.close()
print(lines)