Pythonda "Comprehensions" Kavramı, "lambda" ve "yield" Deyimleri

Helmsys

Ar-Ge Ekibi Kıdemli
16 Mar 2022
1,492
1,652
Yeniden merhaba.

Bugün ki konumda internette python kodlarını incelerken karşınıza gelen tek satırda yazılan ama "ney bu yahu" diye sürekli baktığınız ama okuyamadığınız genel syntax yapısından farklı olan hem comprehension'ları hemde ufaktan lambda anahtar kelimesine ve yield anahtar kelimesine değinicem.

Baştan belirtmek istiyorum; Vereceğim bilgiler naçizane bildiğim bilgilerdir. Çok daha iyisini bilenler zaten kendini belli edip yanlışın doğrusunu, doğru olanında daha da açıklayıcı halini aşağıya yazacaktır. Kolaydan orta ve zora gitmeyi düşünüyorum. Sözlük anlamından uzak kalarak hazırsanız başlıyorum....


Comprehensionlar:
Arkadaşlar bu kelimenin ne anlama geldiğini bilmenizin gerçekten bir önemi yok. Sadece bu kelimenin var olduğunu bilmeniz yeterli. Daha sonrasında Google'da aratıp çok daha farklı kullanımlarına bakabilirsiniz. Kendi bildiğim şekilde açıklayacak olursam tek satırda yazım kurallarına uygun yazılan kod diyebilirim. Normal yazılan kod parçasından farkını aşağıdaki resim çok daha iyi açıklayacağına eminim.


Resmi şuan açıklamıyorum aşağıda vereceğim örnek ve anlatımlarla zaten anlayacağınızı düşünüyorum. Bu resim yalnızca kafanızda "heee demek ki buymuş" düşüncesini yaratmak için
ekledim.

Bu kelime kullanıldığı bölümlere göre üçe ayrılıyor. Bunlar List Comprehension, Dict Comprehension ve Generator Comprehension. Sırasıyla hepsine bakalım...

List Comprehension:
Python:
liste = []
for i in range(0,10):
    liste.append(i)

print(liste)
Görüldüğü üzere liste adında bir list(array) türünde bir değişken oluşturduk ona boş bir liste atadık
for döngüsünde o boş listenin içine 0'dan 9'a kadar bütün rakamları ekledik
Bu listeyi ekrana yazdırdık ve görüldüğü üzere 0'dan 9'a kadar bütün rakamların bulunduğu bir liste çıktısı elde etmiş olduk. Bunu şimdi Comprehension kullanarak yazalım:

Python:
liste = [i for i in range(0,10)]
print(liste)
Bakın iki satırda yazdık. Bunu tek satırda yazmak için değişken oluşturmadan direk print içerisinde liste oluşturup ekrana yazdırabilirdik. Neyse bunun pek bir önemi yok zaten :) burada yazılan bu kodu okumaya çalışalım:

Şimdi görüldüğü üzere for döngüsü listenin içerisinde oluşturulmuş. Burada
alışıla gelmişin dışında bir söz dizimi mevcut. Burada okumaya soldan sağa doğru başlarsanız hata yaparsınız ve anlamsız geldiğini görürsünüz. Peki nasıl okumalıyım ? Şöyle; Önce "for i in range(0,9)" olarak okuyup en solda olan "i" değişkenini okumalısınız. Okuduktan sonra şöyle yorumlayacaksınız: "For döngüsündeki i değişkeni 0'dan 9'a kadar bütün değerleri alıyor ve aldığı sırayla da listenin içerisine ekleniyor". Unutmayın soldan sağa okumayacaksınız(kitap okur gibi).

Bir başka örnek:

Python:
liste = [i for i in range(0,10) if i %2 == 0]
print(liste)
Normal yazım:
Python:
liste = []
for i in range(0,10):
    if i % 2 == 0:
        liste.append(i)
print(liste)

Burada da öncekinden biraz farklı bir yapı ile beraberiz. Görüldüğü gibi if yapısı eklenmiş ve yapmamanız gereken yine önemli hareketlerden biri soldan sağa okumak :). Önce "for i in range(0,10)" olarak okuyup "if i % 2 == 0" diyerek devam ediyor son olarak en başta(solda) yazan "i" değişkenini okuyoruz. Buradan çıkan anlam "0'dan 9'a kadar olan bütün rakamlardan ikiye tam bölünebilenleri liste içine ekle".

Bir başka örnek:
Bu örnekte lambda kullanımını göreceksiniz. Görmeden hemen önce lambdaya ait birkaç küçük örnek ve küçük bir bilgi paylaşıcam. Şimdi lambda fonksiyonları pythonda tek satırda yazılabilen ve herhangi bir isimlendirmesi olmayan ama değişkene atanabilen atanan değişkeninde çağırma operatörleri kullanılarak çağrılan fonksiyonlara deniyor. Yani ister bir değişkene atayıp işlem yapın ister değişkene atamadan herhangi bir başka fonksiyonun parametresine arguman girmede kullanın. Dilediğiniz gibi eğip bükün.

Örnek 1:
Python:
(lambda: print("hello world"))()
Çağırma operatörü kullanarak ama değişkene atanmadan kullanılan en basit lambda fonksiyonu ve söz dizimi.

Örnek 2:
Python:
fonksiyon = lambda: print("hello world")
fonksiyon()
Değişkene atanmış haliyle kullanılan çağırma operatörü ile çağrılan en basit lambda fonksiyonu ve söz dizimi.
Örnek 3:
Python:
fonksiyon = lambda parametre: print(f"Girilen Parametre: {parametre}")
fonksiyon("Helmsys")
Burada da parametreli olarak kullanılan lambda fonksiyon.

*Spesifik Örnek* 1:
Python:
sayılar = [-1,1,-2,2,-3,3,-4,4,-5,5,-6,6,-7,7,-8,8,-9,9,-10,10,-11,11,-12,12,-13,13,-14,14,-15,15,-16,16,-17,17,-18,18,-19,19,-20,20]
negatifler = []
(lambda: [sayılar[i] if sayılar[i]>0 else negatifler.append(sayılar[i]) for i in range(len(sayılar))])()
print(negatifler)
Bunu anlamaya çalışın. Eğer anlayamazsanız aşağıya yazın*

*Spesifik bir örnek*:
Bu örnekte dolar ya da euro kurunu çeken bir script yazıcaz burada bloomberght sitesine gidip doların ve euronun değerini alıp kaç tl yaptığını bulucaz. Bloomberght'de şöyle bir trick var dolar mı euro mu olduğu urlsine bakarak anlayabiliyoruz...
Python:
import requests
from bs4 import BeautifulSoup

döviz = input("Dolar mı Euro mu (dolar/euro): ")
def dolar_euro():
    url = f"https://www.bloomberght.com/doviz/{''.join([i for i in ['dolar','euro'] if i == döviz])}"
    r = requests.get(url)
    soup = BeautifulSoup(r.content,"lxml")
    kur = "".join([i.text for i in soup.find_all("div",attrs={"class":"widget-interest-detail type1"})]).split()[1]
    return f"1 {döviz} = {kur} TL"

print(dolar_euro())
*Spesifik bir örnek* 2:
Sevgili @Hê-ll'in aşağıdaki sorusunu yapalım. Anlayamazsanız aşağıya yine yazarsınız. Sorusu şöyle:
m=[[[ 25, 36, 62],[ 28, 38, 64],[ 30, 40, 67]],[[ 1, 27, 56],[ 1, 25, 55],[ 2, 21, 51]]]
Bu listenin çıktısını [25, 36, 62, 28, 38, 64, 30, 40, 67, 1, 27, 56, 1, 25, 55, 2, 21, 51] bu çıktı olarak değiştirmemiz gerekliymiş.
Cevap:
Python:
m = [[[ 25, 36, 62],[ 28, 38, 64],[ 30, 40, 67]],[[ 1, 27, 56],[ 1, 25, 55],[ 2, 21, 51]]]
istenen_çıktı = [c for a in m for b in a for c in b]
print(istenen_çıktı)

Dict Comprehension
Pythonda sözlük veri tiplerini biliyorsunuzdur. Anlatmama gerek olmadığını düşünerek ufak bir değinme yapıcam.
Pythonda bir sözlük süslü parantezler belirtilerek oluşturulur. Bu süslü parantezlerin içeriği anahtar ve değer olarak ayrılır. Dışarıdan bu değerlere ulaşmak için ilgili değişkenin adı yazılarak köşeli parantez içine anahtar ifadesi yazılarak gerçekleştirir. Bunun daha ayrıntılısını konu uzamasın diye size bırakıyorum. Google'dan bakarsınız.

Burada tek ama açıklayıcı bir örneğe yer vericem. Bu örnekte yazdığımız metinde hangi harf kaç defa kullanıldığını ilk olarak normal ikinci olarak da Comprehension halini göreceksiniz. Önce yazıyorum ardından açıklamasını yapıcam...

Python:
import string

harfler = list(string.ascii_lowercase)
sözlük = {}
metin = "merhaba ben Helmsys".lower()

for i in harfler:
    if i in metin:
        sözlük.update({i : metin.count(i)})

print(sözlük)
--
Python:
import string

harfler = list(string.ascii_lowercase)
metin = "merhaba ben Helmsys".lower()
print({i : metin.count(i) for i in harfler if i in metin})

Aradaki görsel farkı gördükten sonra bunun açıklamasını yapabilirim. Normal olarak yazılanın nasıl okunduğunu bildiğinizi düşünerekten Comprehension halini açıklıyacağım. İlk olarak string modülünü dahil ettik çünkü elimizle harfleri teker teker girmek istemedik. bu harflerin her birini bir liste içerisinde sakladık. bu listeyi harfler adlı değişkende sakladık. Bir metin belirledik. Bu belirlenen metin string türündeki "metin" adlı değişkende saklı. print içerisinde Comprehension yapmamızın sebebi çıktının ekranda gözükmesi. Eveet geliyorum asıl olaya. Burada da okurken önce for döngüsünü okuyarak başlıyoruz. "for i in harfler" hemen ardından "if i in metin" koşulunu okuyor sonrasında for döngüsünün solunda yer alan "metin.count(i)" ifadesini okuyoruz. Bu bizim metinde geçen harflerin sayısını gösteriyor. Hangi harfin kaç adet kullanıldığını da ":" işaretinin solunda yer alan "i" değişkeni belirtiyor. Neden ? Çünkü Sözlüklerde "Anahtar(Key) : Değer(Value)" söz dizimi mevcut.
Buradan çıkan çıktı ise şöyle
{'a': 2, 'b': 2, 'e': 3, 'h': 2, 'l': 1, 'm': 2, 'n': 1, 'r': 1, 's': 2, 'y': 1}

Generator Comprehension

Bu belki yeni duyduğunuz belki de kıyısından köşesinden kulak aşinalığınız olan bir yapı. Pythonda Generator'ler bellek kullanımı açısından oldukça faydalı. Liste(array)lerde elemanları saklamanız için bellekte bunlara önceden yer ayrılıyor ve program sonlanana kadar o yapı bellekte yer kaplamaya devam ediyor. Fakat generatorler oluşturuldukları andan itibaren bellekten siliniyor ve bellekten kazanç elde etmemizi sağlıyor. Şimdi göstereceğim ilk örnekte yeni bir anahtar kelime ile karşılaşacaksınız. Bu anahtar kelime "yield". İnternette kullanımlarını bol bol görebilirsiniz. Ben yine basit düzeyde tutup gerisini sizin getireceğiniz birkaç örnek bırakıcam.
Örnek 1:
Python:
def generator():
    for i in range(50000):
        yield i
Burada 49.999 adet integer veri tipine sahip tam sayılar liste içerisine atılıyor. Döngü sonunda ise hepsi siliniyor :)
Bir fonksiyon içerisinde "yield" anahtar kelimesini bulunduruyorsa bu fonksiyon bir generator olarak adlandırılıyor. Bu generatorde(fonksiyonda) oluşan elemanları görüntüleyebilmek için ya liste içerisine alıp ekrana yazdırmanız gerekli ya da for döngüsü ile içeriğine ulaşıp yalnızca for döngüsünün elemanını ekrana yazdırmanız gerekli. Burada yine bellek açısından avantaj olması adına liste içerisine almaktansa döngü ile içeriğinde dolaşıp ardından silinen bir yapı işimize çok daha fazla yarayacak. Ulaşmak içinde aşağıdaki gibi yazmamız yeterli:
Python:
for j in generator():
    print(j)

Örnek 2:
Python:
def generator(a=5,c=10):
    while a <= c:
        yield a
        a += 1

for j in generator():
    print(j)

Pythonda Normal parantez "( )" içerisine yazılan comprehension bir generatordur. Aynı normal olarak yazılan fonksiyonun tek seferde yazılan isimsiz(lambda) fonksiyonların olduğu gibi. Burada da benzer yapı tıpkı List Comprehension gibi. Tek fark parantezlerin normal olması :). Bunun dışında okuması ve yazması birebir aynı.
Arıyorsanız bir örnek şöyle verebilirim... Bu örnekte lambda ve generator comprehension ortak kullanıldı:

Python:
import string
import random
from time import sleep, time

letters = list(string.printable)
input_ = input("Parola oluştur: ")
passw = ""
ilk = time()
while input_ != passw:
    sleep(0.3)
    try_again = random.choices(letters,k=len(input_))
    (lambda: [try_again.remove(j) for j in try_again if j in list(string.whitespace)])() # lambda ve Generator comprehension kullanımı
    for i in try_again:
        if i in input_:
            passw += i
    if input_ == passw:
        print(passw)
        print("Bulundu")
        print(f"{(son-ilk).__round__(3)} Saniye sürdü")
    else:
        print(f"Denendi : {try_again}")
    son = time()

.
.
.
Eklemek istedikleriniz varsa, yanlış bulduğunuz yer varsa ya da başka herhangi olumsuz bir şey... Belirtmekten geri durmayın.
Hoşçakalın....
 
Son düzenleme:

JohnWick51

Uzman üye
20 Mar 2022
1,867
770
28
Yeniden merhaba.

Bugün ki konumda internette python kodlarını incelerken karşınıza gelen tek satırda yazılan ama "ney bu yahu" diye sürekli baktığınız ama okuyamadığınız genel syntax yapısından farklı olan hem comprehension'ları hemde ufaktan lambda anahtar kelimesine ve yield anahtar kelimesine değinicem.

Baştan belirtmek istiyorum; Vereceğim bilgiler naçizane bildiğim bilgilerdir. Çok daha iyisini bilenler zaten kendini belli edip yanlışın doğrusunu, doğru olanında daha da açıklayıcı halini aşağıya yazacaktır. Kolaydan orta ve zora gitmeyi düşünüyorum. Sözlük anlamından uzak kalarak hazırsanız başlıyorum....


Comprehensionlar:
Arkadaşlar bu kelimenin ne anlama geldiğini bilmenizin gerçekten bir önemi yok. Sadece bu kelimenin var olduğunu bilmeniz yeterli. Daha sonrasında Google'da aratıp çok daha farklı kullanımlarına bakabilirsiniz. Kendi bildiğim şekilde açıklayacak olursam tek satırda yazım kurallarına uygun yazılan kod diyebilirim. Normal yazılan kod parçasından farkını aşağıdaki resim çok daha iyi açıklayacağına eminim.


Resmi şuan açıklamıyorum aşağıda vereceğim örnek ve anlatımlarla zaten anlayacağınızı düşünüyorum. Bu resim yalnızca kafanızda "heee demek ki buymuş" düşüncesini yaratmak için
ekledim.

Bu kelime kullanıldığı bölümlere göre üçe ayrılıyor. Bunlar List Comprehension, Dict Comprehension ve Generator Comprehension. Sırasıyla hepsine bakalım...

List Comprehension:
Python:
liste = []
for i in range(0,10):
    liste.append(i)

print(liste)
Görüldüğü üzere liste adında bir list(array) türünde bir değişken oluşturduk ona boş bir liste atadık
for döngüsünde o boş listenin içine 0'dan 9'a kadar bütün rakamları ekledik
Bu listeyi ekrana yazdırdık ve görüldüğü üzere 0'dan 9'a kadar bütün rakamların bulunduğu bir liste çıktısı elde etmiş olduk. Bunu şimdi Comprehension kullanarak yazalım:

Python:
liste = [i for i in range(0,10)]
print(liste)
Bakın iki satırda yazdık. Bunu tek satırda yazmak için değişken oluşturmadan direk print içerisinde liste oluşturup ekrana yazdırabilirdik. Neyse bunun pek bir önemi yok zaten :) burada yazılan bu kodu okumaya çalışalım:

Şimdi görüldüğü üzere for döngüsü listenin içerisinde oluşturulmuş. Burada
alışıla gelmişin dışında bir söz dizimi mevcut. Burada okumaya soldan sağa doğru başlarsanız hata yaparsınız ve anlamsız geldiğini görürsünüz. Peki nasıl okumalıyım ? Şöyle; Önce "for i in range(0,9)" olarak okuyup en solda olan "i" değişkenini okumalısınız. Okuduktan sonra şöyle yorumlayacaksınız: "For döngüsündeki i değişkeni 0'dan 9'a kadar bütün değerleri alıyor ve aldığı sırayla da listenin içerisine ekleniyor". Unutmayın soldan sağa okumayacaksınız(kitap okur gibi).

Bir başka örnek:

Python:
liste = [i for i in range(0,10) if i %2 == 0]
print(liste)
Normal yazım:
Python:
liste = []
for i in range(0,10):
    if i % 2 == 0:
        liste.append(i)
print(liste)

Burada da öncekinden biraz farklı bir yapı ile beraberiz. Görüldüğü gibi if yapısı eklenmiş ve yapmamanız gereken yine önemli hareketlerden biri soldan sağa okumak :). Önce "for i in range(0,10)" olarak okuyup "if i % 2 == 0" diyerek devam ediyor son olarak en başta(solda) yazan "i" değişkenini okuyoruz. Buradan çıkan anlam "0'dan 9'a kadar olan bütün rakamlardan ikiye tam bölünebilenleri liste içine ekle".

Bir başka örnek:
Bu örnekte lambda kullanımını göreceksiniz. Görmeden hemen önce lambdaya ait birkaç küçük örnek ve küçük bir bilgi paylaşıcam. Şimdi lambda fonksiyonları pythonda tek satırda yazılabilen ve herhangi bir isimlendirmesi olmayan ama değişkene atanabilen atanan değişkeninde çağırma operatörleri kullanılarak çağrılan fonksiyonlara deniyor. Yani ister bir değişkene atayıp işlem yapın ister değişkene atamadan herhangi bir başka fonksiyonun parametresine arguman girmede kullanın. Dilediğiniz gibi eğip bükün.

Örnek 1:
Python:
(lambda: print("hello world"))()
Çağırma operatörü kullanarak ama değişkene atanmadan kullanılan en basit lambda fonksiyonu ve söz dizimi.

Örnek 2:
Python:
fonksiyon = lambda: print("hello world")
fonksiyon()
Değişkene atanmış haliyle kullanılan çağırma operatörü ile çağrılan en basit lambda fonksiyonu ve söz dizimi.
Örnek 3:
Python:
fonksiyon = lambda parametre: print(f"Girilen Parametre: {parametre}")
fonksiyon("Helmsys")
Burada da parametreli olarak kullanılan lambda fonksiyon.

*Spesifik Örnek* 1:
Python:
sayılar = [-1,1,-2,2,-3,3,-4,4,-5,5,-6,6,-7,7,-8,8,-9,9,-10,10,-11,11,-12,12,-13,13,-14,14,-15,15,-16,16,-17,17,-18,18,-19,19,-20,20]
negatifler = []
(lambda: [sayılar[i] if sayılar[i]>0 else negatifler.append(sayılar[i]) for i in range(len(sayılar))])()
print(negatifler)
Bunu anlamaya çalışın. Eğer anlayamazsanız aşağıya yazın*

*Spesifik bir örnek*:
Bu örnekte dolar ya da euro kurunu çeken bir script yazıcaz burada bloomberght sitesine gidip doların ve euronun değerini alıp kaç tl yaptığını bulucaz. Bloomberght'de şöyle bir trick var dolar mı euro mu olduğu urlsine bakarak anlayabiliyoruz...
Python:
import requests
from bs4 import BeautifulSoup

döviz = input("Dolar mı Euro mu (dolar/euro): ")
def dolar_euro():
    url = f"https://www.bloomberght.com/doviz/{''.join([i for i in ['dolar','euro'] if i == döviz])}"
    r = requests.get(url)
    soup = BeautifulSoup(r.content,"lxml")
    kur = "".join([i.text for i in soup.find_all("div",attrs={"class":"widget-interest-detail type1"})]).split()[1]
    return f"1 {döviz} = {kur} TL"

print(dolar_euro())
*Spesifik bir örnek* 2:
Sevgili @Hê-ll'in aşağıdaki sorusunu yapalım. Anlayamazsanız aşağıya yine yazarsınız. Sorusu şöyle:
m=[[[ 25, 36, 62],[ 28, 38, 64],[ 30, 40, 67]],[[ 1, 27, 56],[ 1, 25, 55],[ 2, 21, 51]]]
Bu listenin çıktısını [25, 36, 62, 28, 38, 64, 30, 40, 67, 1, 27, 56, 1, 25, 55, 2, 21, 51] bu çıktı olarak değiştirmemiz gerekliymiş.
Cevap:
Python:
m = [[[ 25, 36, 62],[ 28, 38, 64],[ 30, 40, 67]],[[ 1, 27, 56],[ 1, 25, 55],[ 2, 21, 51]]]
istenen_çıktı = [c for a in m for b in a for c in b]
print(istenen_çıktı)

Dict Comprehension
Pythonda sözlük veri tiplerini biliyorsunuzdur. Anlatmama gerek olmadığını düşünerek ufak bir değinme yapıcam.
Pythonda bir sözlük süslü parantezler belirtilerek oluşturulur. Bu süslü parantezlerin içeriği anahtar ve değer olarak ayrılır. Dışarıdan bu değerlere ulaşmak için ilgili değişkenin adı yazılarak köşeli parantez içine anahtar ifadesi yazılarak gerçekleştirir. Bunun daha ayrıntılısını konu uzamasın diye size bırakıyorum. Google'dan bakarsınız.

Burada tek ama açıklayıcı bir örneğe yer vericem. Bu örnekte yazdığımız metinde hangi harf kaç defa kullanıldığını ilk olarak normal ikinci olarak da Comprehension halini göreceksiniz. Önce yazıyorum ardından açıklamasını yapıcam...

Python:
import string

harfler = list(string.ascii_lowercase)
sözlük = {}
metin = "merhaba ben Helmsys".lower()

for i in harfler:
    if i in metin:
        sözlük.update({i : metin.count(i)})

print(sözlük)
--
Python:
import string

harfler = list(string.ascii_lowercase)
metin = "merhaba ben Helmsys".lower()
print({i : metin.count(i) for i in harfler if i in metin})

Aradaki görsel farkı gördükten sonra bunun açıklamasını yapabilirim. Normal olarak yazılanın nasıl okunduğunu bildiğinizi düşünerekten Comprehension halini açıklıyacağım. İlk olarak string modülünü dahil ettik çünkü elimizle harfleri teker teker girmek istemedik. bu harflerin her birini bir liste içerisinde sakladık. bu listeyi harfler adlı değişkende sakladık. Bir metin belirledik. Bu belirlenen metin string türündeki "metin" adlı değişkende saklı. print içerisinde Comprehension yapmamızın sebebi çıktının ekranda gözükmesi. Eveet geliyorum asıl olaya. Burada da okurken önce for döngüsünü okuyarak başlıyoruz. "for i in harfler" hemen ardından "if i in metin" koşulunu okuyor sonrasında for döngüsünün solunda yer alan "metin.count(i)" ifadesini okuyoruz. Bu bizim metinde geçen harflerin sayısını gösteriyor. Hangi harfin kaç adet kullanıldığını da ":" işaretinin solunda yer alan "i" değişkeni belirtiyor. Neden ? Çünkü Sözlüklerde "Anahtar(Key) : Değer(Value)" söz dizimi mevcut.
Buradan çıkan çıktı ise şöyle
{'a': 2, 'b': 2, 'e': 3, 'h': 2, 'l': 1, 'm': 2, 'n': 1, 'r': 1, 's': 2, 'y': 1}

Generator Comprehension

Bu belki yeni duyduğunuz belki de kıyısından köşesinden kulak aşinalığınız olan bir yapı. Pythonda Generator'ler bellek kullanımı açısından oldukça faydalı. Liste(array)lerde elemanları saklamanız için bellekte bunlara önceden yer ayrılıyor ve program sonlanana kadar o yapı bellekte yer kaplamaya devam ediyor. Fakat generatorler oluşturuldukları andan itibaren bellekten siliniyor ve bellekten kazanç elde etmemizi sağlıyor. Şimdi göstereceğim ilk örnekte yeni bir anahtar kelime ile karşılaşacaksınız. Bu anahtar kelime "yield". İnternette kullanımlarını bol bol görebilirsiniz. Ben yine basit düzeyde tutup gerisini sizin getireceğiniz birkaç örnek bırakıcam.
Örnek 1:
Python:
def generator():
    for i in range(50000):
        yield i
Burada 49.999 adet integer veri tipine sahip tam sayılar liste içerisine atılıyor. Döngü sonunda ise hepsi siliniyor :)
Bir fonksiyon içerisinde "yield" anahtar kelimesini bulunduruyorsa bu fonksiyon bir generator olarak adlandırılıyor. Bu generatorde(fonksiyonda) oluşan elemanları görüntüleyebilmek için ya liste içerisine alıp ekrana yazdırmanız gerekli ya da for döngüsü ile içeriğine ulaşıp yalnızca for döngüsünün elemanını ekrana yazdırmanız gerekli. Burada yine bellek açısından avantaj olması adına liste içerisine almaktansa döngü ile içeriğinde dolaşıp ardından silinen bir yapı işimize çok daha fazla yarayacak. Ulaşmak içinde aşağıdaki gibi yazmamız yeterli:
Python:
for j in generator():
    print(j)

Örnek 2:
Python:
def generator(a=5,c=10):
    while a <= c:
        yield a
        a += 1

for j in generator():
    print(j)

Pythonda Normal parantez "( )" içerisine yazılan comprehension bir generatordur. Aynı normal olarak yazılan fonksiyonun tek seferde yazılan isimsiz(lambda) fonksiyonların olduğu gibi. Burada da benzer yapı tıpkı List Comprehension gibi. Tek fark parantezlerin normal olması :). Bunun dışında okuması ve yazması birebir aynı.
Arıyorsanız bir örnek şöyle verebilirim... Bu örnekte lambda ve generator comprehension ortak kullanıldı:

Python:
import string
import random
from time import sleep, time

letters = list(string.printable)
input_ = input("Parola oluştur: ")
passw = ""
ilk = time()
while input_ != passw:
    sleep(0.3)
    try_again = random.choices(letters,k=len(input_))
    (lambda: [try_again.remove(j) for j in try_again if j in list(string.whitespace)])() # lambda ve Generator comprehension kullanımı
    for i in try_again:
        if i in input_:
            passw += i
    if input_ == passw:
        print(passw)
        print("Bulundu")
        print(f"{(son-ilk).__round__(3)} Saniye sürdü")
    else:
        print(f"Denendi : {try_again}")
    son = time()

.
.
.
Eklemek istedikleriniz varsa, yanlış bulduğunuz yer varsa ya da başka herhangi olumsuz bir şey... Belirtmekten geri durmayın.
Hoşçakalın....
Ellerine saglik
 

1wexter1

Katılımcı Üye
24 Eyl 2021
921
647
Uzayda1yer
Yeniden merhaba.

Bugün ki konumda internette python kodlarını incelerken karşınıza gelen tek satırda yazılan ama "ney bu yahu" diye sürekli baktığınız ama okuyamadığınız genel syntax yapısından farklı olan hem comprehension'ları hemde ufaktan lambda anahtar kelimesine ve yield anahtar kelimesine değinicem.

Baştan belirtmek istiyorum; Vereceğim bilgiler naçizane bildiğim bilgilerdir. Çok daha iyisini bilenler zaten kendini belli edip yanlışın doğrusunu, doğru olanında daha da açıklayıcı halini aşağıya yazacaktır. Kolaydan orta ve zora gitmeyi düşünüyorum. Sözlük anlamından uzak kalarak hazırsanız başlıyorum....


Comprehensionlar:
Arkadaşlar bu kelimenin ne anlama geldiğini bilmenizin gerçekten bir önemi yok. Sadece bu kelimenin var olduğunu bilmeniz yeterli. Daha sonrasında Google'da aratıp çok daha farklı kullanımlarına bakabilirsiniz. Kendi bildiğim şekilde açıklayacak olursam tek satırda yazım kurallarına uygun yazılan kod diyebilirim. Normal yazılan kod parçasından farkını aşağıdaki resim çok daha iyi açıklayacağına eminim.


Resmi şuan açıklamıyorum aşağıda vereceğim örnek ve anlatımlarla zaten anlayacağınızı düşünüyorum. Bu resim yalnızca kafanızda "heee demek ki buymuş" düşüncesini yaratmak için
ekledim.

Bu kelime kullanıldığı bölümlere göre üçe ayrılıyor. Bunlar List Comprehension, Dict Comprehension ve Generator Comprehension. Sırasıyla hepsine bakalım...

List Comprehension:
Python:
liste = []
for i in range(0,10):
    liste.append(i)

print(liste)
Görüldüğü üzere liste adında bir list(array) türünde bir değişken oluşturduk ona boş bir liste atadık
for döngüsünde o boş listenin içine 0'dan 9'a kadar bütün rakamları ekledik
Bu listeyi ekrana yazdırdık ve görüldüğü üzere 0'dan 9'a kadar bütün rakamların bulunduğu bir liste çıktısı elde etmiş olduk. Bunu şimdi Comprehension kullanarak yazalım:

Python:
liste = [i for i in range(0,10)]
print(liste)
Bakın iki satırda yazdık. Bunu tek satırda yazmak için değişken oluşturmadan direk print içerisinde liste oluşturup ekrana yazdırabilirdik. Neyse bunun pek bir önemi yok zaten :) burada yazılan bu kodu okumaya çalışalım:

Şimdi görüldüğü üzere for döngüsü listenin içerisinde oluşturulmuş. Burada
alışıla gelmişin dışında bir söz dizimi mevcut. Burada okumaya soldan sağa doğru başlarsanız hata yaparsınız ve anlamsız geldiğini görürsünüz. Peki nasıl okumalıyım ? Şöyle; Önce "for i in range(0,9)" olarak okuyup en solda olan "i" değişkenini okumalısınız. Okuduktan sonra şöyle yorumlayacaksınız: "For döngüsündeki i değişkeni 0'dan 9'a kadar bütün değerleri alıyor ve aldığı sırayla da listenin içerisine ekleniyor". Unutmayın soldan sağa okumayacaksınız(kitap okur gibi).

Bir başka örnek:

Python:
liste = [i for i in range(0,10) if i %2 == 0]
print(liste)
Normal yazım:
Python:
liste = []
for i in range(0,10):
    if i % 2 == 0:
        liste.append(i)
print(liste)

Burada da öncekinden biraz farklı bir yapı ile beraberiz. Görüldüğü gibi if yapısı eklenmiş ve yapmamanız gereken yine önemli hareketlerden biri soldan sağa okumak :). Önce "for i in range(0,10)" olarak okuyup "if i % 2 == 0" diyerek devam ediyor son olarak en başta(solda) yazan "i" değişkenini okuyoruz. Buradan çıkan anlam "0'dan 9'a kadar olan bütün rakamlardan ikiye tam bölünebilenleri liste içine ekle".

Bir başka örnek:
Bu örnekte lambda kullanımını göreceksiniz. Görmeden hemen önce lambdaya ait birkaç küçük örnek ve küçük bir bilgi paylaşıcam. Şimdi lambda fonksiyonları pythonda tek satırda yazılabilen ve herhangi bir isimlendirmesi olmayan ama değişkene atanabilen atanan değişkeninde çağırma operatörleri kullanılarak çağrılan fonksiyonlara deniyor. Yani ister bir değişkene atayıp işlem yapın ister değişkene atamadan herhangi bir başka fonksiyonun parametresine arguman girmede kullanın. Dilediğiniz gibi eğip bükün.

Örnek 1:
Python:
(lambda: print("hello world"))()
Çağırma operatörü kullanarak ama değişkene atanmadan kullanılan en basit lambda fonksiyonu ve söz dizimi.

Örnek 2:
Python:
fonksiyon = lambda: print("hello world")
fonksiyon()
Değişkene atanmış haliyle kullanılan çağırma operatörü ile çağrılan en basit lambda fonksiyonu ve söz dizimi.
Örnek 3:
Python:
fonksiyon = lambda parametre: print(f"Girilen Parametre: {parametre}")
fonksiyon("Helmsys")
Burada da parametreli olarak kullanılan lambda fonksiyon.

*Spesifik Örnek* 1:
Python:
sayılar = [-1,1,-2,2,-3,3,-4,4,-5,5,-6,6,-7,7,-8,8,-9,9,-10,10,-11,11,-12,12,-13,13,-14,14,-15,15,-16,16,-17,17,-18,18,-19,19,-20,20]
negatifler = []
(lambda: [sayılar[i] if sayılar[i]>0 else negatifler.append(sayılar[i]) for i in range(len(sayılar))])()
print(negatifler)
Bunu anlamaya çalışın. Eğer anlayamazsanız aşağıya yazın*

*Spesifik bir örnek*:
Bu örnekte dolar ya da euro kurunu çeken bir script yazıcaz burada bloomberght sitesine gidip doların ve euronun değerini alıp kaç tl yaptığını bulucaz. Bloomberght'de şöyle bir trick var dolar mı euro mu olduğu urlsine bakarak anlayabiliyoruz...
Python:
import requests
from bs4 import BeautifulSoup

döviz = input("Dolar mı Euro mu (dolar/euro): ")
def dolar_euro():
    url = f"https://www.bloomberght.com/doviz/{''.join([i for i in ['dolar','euro'] if i == döviz])}"
    r = requests.get(url)
    soup = BeautifulSoup(r.content,"lxml")
    kur = "".join([i.text for i in soup.find_all("div",attrs={"class":"widget-interest-detail type1"})]).split()[1]
    return f"1 {döviz} = {kur} TL"

print(dolar_euro())
*Spesifik bir örnek* 2:
Sevgili @Hê-ll'in aşağıdaki sorusunu yapalım. Anlayamazsanız aşağıya yine yazarsınız. Sorusu şöyle:
m=[[[ 25, 36, 62],[ 28, 38, 64],[ 30, 40, 67]],[[ 1, 27, 56],[ 1, 25, 55],[ 2, 21, 51]]]
Bu listenin çıktısını [25, 36, 62, 28, 38, 64, 30, 40, 67, 1, 27, 56, 1, 25, 55, 2, 21, 51] bu çıktı olarak değiştirmemiz gerekliymiş.
Cevap:
Python:
m = [[[ 25, 36, 62],[ 28, 38, 64],[ 30, 40, 67]],[[ 1, 27, 56],[ 1, 25, 55],[ 2, 21, 51]]]
istenen_çıktı = [c for a in m for b in a for c in b]
print(istenen_çıktı)

Dict Comprehension
Pythonda sözlük veri tiplerini biliyorsunuzdur. Anlatmama gerek olmadığını düşünerek ufak bir değinme yapıcam.
Pythonda bir sözlük süslü parantezler belirtilerek oluşturulur. Bu süslü parantezlerin içeriği anahtar ve değer olarak ayrılır. Dışarıdan bu değerlere ulaşmak için ilgili değişkenin adı yazılarak köşeli parantez içine anahtar ifadesi yazılarak gerçekleştirir. Bunun daha ayrıntılısını konu uzamasın diye size bırakıyorum. Google'dan bakarsınız.

Burada tek ama açıklayıcı bir örneğe yer vericem. Bu örnekte yazdığımız metinde hangi harf kaç defa kullanıldığını ilk olarak normal ikinci olarak da Comprehension halini göreceksiniz. Önce yazıyorum ardından açıklamasını yapıcam...

Python:
import string

harfler = list(string.ascii_lowercase)
sözlük = {}
metin = "merhaba ben Helmsys".lower()

for i in harfler:
    if i in metin:
        sözlük.update({i : metin.count(i)})

print(sözlük)
--
Python:
import string

harfler = list(string.ascii_lowercase)
metin = "merhaba ben Helmsys".lower()
print({i : metin.count(i) for i in harfler if i in metin})

Aradaki görsel farkı gördükten sonra bunun açıklamasını yapabilirim. Normal olarak yazılanın nasıl okunduğunu bildiğinizi düşünerekten Comprehension halini açıklıyacağım. İlk olarak string modülünü dahil ettik çünkü elimizle harfleri teker teker girmek istemedik. bu harflerin her birini bir liste içerisinde sakladık. bu listeyi harfler adlı değişkende sakladık. Bir metin belirledik. Bu belirlenen metin string türündeki "metin" adlı değişkende saklı. print içerisinde Comprehension yapmamızın sebebi çıktının ekranda gözükmesi. Eveet geliyorum asıl olaya. Burada da okurken önce for döngüsünü okuyarak başlıyoruz. "for i in harfler" hemen ardından "if i in metin" koşulunu okuyor sonrasında for döngüsünün solunda yer alan "metin.count(i)" ifadesini okuyoruz. Bu bizim metinde geçen harflerin sayısını gösteriyor. Hangi harfin kaç adet kullanıldığını da ":" işaretinin solunda yer alan "i" değişkeni belirtiyor. Neden ? Çünkü Sözlüklerde "Anahtar(Key) : Değer(Value)" söz dizimi mevcut.
Buradan çıkan çıktı ise şöyle
{'a': 2, 'b': 2, 'e': 3, 'h': 2, 'l': 1, 'm': 2, 'n': 1, 'r': 1, 's': 2, 'y': 1}

Generator Comprehension

Bu belki yeni duyduğunuz belki de kıyısından köşesinden kulak aşinalığınız olan bir yapı. Pythonda Generator'ler bellek kullanımı açısından oldukça faydalı. Liste(array)lerde elemanları saklamanız için bellekte bunlara önceden yer ayrılıyor ve program sonlanana kadar o yapı bellekte yer kaplamaya devam ediyor. Fakat generatorler oluşturuldukları andan itibaren bellekten siliniyor ve bellekten kazanç elde etmemizi sağlıyor. Şimdi göstereceğim ilk örnekte yeni bir anahtar kelime ile karşılaşacaksınız. Bu anahtar kelime "yield". İnternette kullanımlarını bol bol görebilirsiniz. Ben yine basit düzeyde tutup gerisini sizin getireceğiniz birkaç örnek bırakıcam.
Örnek 1:
Python:
def generator():
    for i in range(50000):
        yield i
Burada 49.999 adet integer veri tipine sahip tam sayılar liste içerisine atılıyor. Döngü sonunda ise hepsi siliniyor :)
Bir fonksiyon içerisinde "yield" anahtar kelimesini bulunduruyorsa bu fonksiyon bir generator olarak adlandırılıyor. Bu generatorde(fonksiyonda) oluşan elemanları görüntüleyebilmek için ya liste içerisine alıp ekrana yazdırmanız gerekli ya da for döngüsü ile içeriğine ulaşıp yalnızca for döngüsünün elemanını ekrana yazdırmanız gerekli. Burada yine bellek açısından avantaj olması adına liste içerisine almaktansa döngü ile içeriğinde dolaşıp ardından silinen bir yapı işimize çok daha fazla yarayacak. Ulaşmak içinde aşağıdaki gibi yazmamız yeterli:
Python:
for j in generator():
    print(j)

Örnek 2:
Python:
def generator(a=5,c=10):
    while a <= c:
        yield a
        a += 1

for j in generator():
    print(j)

Pythonda Normal parantez "( )" içerisine yazılan comprehension bir generatordur. Aynı normal olarak yazılan fonksiyonun tek seferde yazılan isimsiz(lambda) fonksiyonların olduğu gibi. Burada da benzer yapı tıpkı List Comprehension gibi. Tek fark parantezlerin normal olması :). Bunun dışında okuması ve yazması birebir aynı.
Arıyorsanız bir örnek şöyle verebilirim... Bu örnekte lambda ve generator comprehension ortak kullanıldı:

Python:
import string
import random
from time import sleep, time

letters = list(string.printable)
input_ = input("Parola oluştur: ")
passw = ""
ilk = time()
while input_ != passw:
    sleep(0.3)
    try_again = random.choices(letters,k=len(input_))
    (lambda: [try_again.remove(j) for j in try_again if j in list(string.whitespace)])() # lambda ve Generator comprehension kullanımı
    for i in try_again:
        if i in input_:
            passw += i
    if input_ == passw:
        print(passw)
        print("Bulundu")
        print(f"{(son-ilk).__round__(3)} Saniye sürdü")
    else:
        print(f"Denendi : {try_again}")
    son = time()

.
.
.
Eklemek istedikleriniz varsa, yanlış bulduğunuz yer varsa ya da başka herhangi olumsuz bir şey... Belirtmekten geri durmayın.
Hoşçakalın....
Çok güzel örnekler ile açıklamışsın eline emeğine sağlık
"Generator Comprehension" daha önce bilmiyordum sayende öğrendim. Açıkcası Comprehensionslar ne kadar işlev görse de ben kullanmıyorum
çünkü tam hakim olamadığım için bu comprehensionlar sürekli yazarken bir yerde hata yapıyorum ve sürekli başa dönüyorum sanırım bunu iyicene kavrayabilmek için uygulamak lazım.
 

oldminer

Hunter / Malware Developer
1 Eyl 2022
239
111
Yeniden merhaba.

Bugün ki konumda internette python kodlarını incelerken karşınıza gelen tek satırda yazılan ama "ney bu yahu" diye sürekli baktığınız ama okuyamadığınız genel syntax yapısından farklı olan hem comprehension'ları hemde ufaktan lambda anahtar kelimesine ve yield anahtar kelimesine değinicem.

Baştan belirtmek istiyorum; Vereceğim bilgiler naçizane bildiğim bilgilerdir. Çok daha iyisini bilenler zaten kendini belli edip yanlışın doğrusunu, doğru olanında daha da açıklayıcı halini aşağıya yazacaktır. Kolaydan orta ve zora gitmeyi düşünüyorum. Sözlük anlamından uzak kalarak hazırsanız başlıyorum....


Comprehensionlar:
Arkadaşlar bu kelimenin ne anlama geldiğini bilmenizin gerçekten bir önemi yok. Sadece bu kelimenin var olduğunu bilmeniz yeterli. Daha sonrasında Google'da aratıp çok daha farklı kullanımlarına bakabilirsiniz. Kendi bildiğim şekilde açıklayacak olursam tek satırda yazım kurallarına uygun yazılan kod diyebilirim. Normal yazılan kod parçasından farkını aşağıdaki resim çok daha iyi açıklayacağına eminim.


Resmi şuan açıklamıyorum aşağıda vereceğim örnek ve anlatımlarla zaten anlayacağınızı düşünüyorum. Bu resim yalnızca kafanızda "heee demek ki buymuş" düşüncesini yaratmak için
ekledim.

Bu kelime kullanıldığı bölümlere göre üçe ayrılıyor. Bunlar List Comprehension, Dict Comprehension ve Generator Comprehension. Sırasıyla hepsine bakalım...

List Comprehension:
Python:
liste = []
for i in range(0,10):
    liste.append(i)

print(liste)
Görüldüğü üzere liste adında bir list(array) türünde bir değişken oluşturduk ona boş bir liste atadık
for döngüsünde o boş listenin içine 0'dan 9'a kadar bütün rakamları ekledik
Bu listeyi ekrana yazdırdık ve görüldüğü üzere 0'dan 9'a kadar bütün rakamların bulunduğu bir liste çıktısı elde etmiş olduk. Bunu şimdi Comprehension kullanarak yazalım:

Python:
liste = [i for i in range(0,10)]
print(liste)
Bakın iki satırda yazdık. Bunu tek satırda yazmak için değişken oluşturmadan direk print içerisinde liste oluşturup ekrana yazdırabilirdik. Neyse bunun pek bir önemi yok zaten :) burada yazılan bu kodu okumaya çalışalım:

Şimdi görüldüğü üzere for döngüsü listenin içerisinde oluşturulmuş. Burada
alışıla gelmişin dışında bir söz dizimi mevcut. Burada okumaya soldan sağa doğru başlarsanız hata yaparsınız ve anlamsız geldiğini görürsünüz. Peki nasıl okumalıyım ? Şöyle; Önce "for i in range(0,9)" olarak okuyup en solda olan "i" değişkenini okumalısınız. Okuduktan sonra şöyle yorumlayacaksınız: "For döngüsündeki i değişkeni 0'dan 9'a kadar bütün değerleri alıyor ve aldığı sırayla da listenin içerisine ekleniyor". Unutmayın soldan sağa okumayacaksınız(kitap okur gibi).

Bir başka örnek:

Python:
liste = [i for i in range(0,10) if i %2 == 0]
print(liste)
Normal yazım:
Python:
liste = []
for i in range(0,10):
    if i % 2 == 0:
        liste.append(i)
print(liste)

Burada da öncekinden biraz farklı bir yapı ile beraberiz. Görüldüğü gibi if yapısı eklenmiş ve yapmamanız gereken yine önemli hareketlerden biri soldan sağa okumak :). Önce "for i in range(0,10)" olarak okuyup "if i % 2 == 0" diyerek devam ediyor son olarak en başta(solda) yazan "i" değişkenini okuyoruz. Buradan çıkan anlam "0'dan 9'a kadar olan bütün rakamlardan ikiye tam bölünebilenleri liste içine ekle".

Bir başka örnek:
Bu örnekte lambda kullanımını göreceksiniz. Görmeden hemen önce lambdaya ait birkaç küçük örnek ve küçük bir bilgi paylaşıcam. Şimdi lambda fonksiyonları pythonda tek satırda yazılabilen ve herhangi bir isimlendirmesi olmayan ama değişkene atanabilen atanan değişkeninde çağırma operatörleri kullanılarak çağrılan fonksiyonlara deniyor. Yani ister bir değişkene atayıp işlem yapın ister değişkene atamadan herhangi bir başka fonksiyonun parametresine arguman girmede kullanın. Dilediğiniz gibi eğip bükün.

Örnek 1:
Python:
(lambda: print("hello world"))()
Çağırma operatörü kullanarak ama değişkene atanmadan kullanılan en basit lambda fonksiyonu ve söz dizimi.

Örnek 2:
Python:
fonksiyon = lambda: print("hello world")
fonksiyon()
Değişkene atanmış haliyle kullanılan çağırma operatörü ile çağrılan en basit lambda fonksiyonu ve söz dizimi.
Örnek 3:
Python:
fonksiyon = lambda parametre: print(f"Girilen Parametre: {parametre}")
fonksiyon("Helmsys")
Burada da parametreli olarak kullanılan lambda fonksiyon.

*Spesifik Örnek* 1:
Python:
sayılar = [-1,1,-2,2,-3,3,-4,4,-5,5,-6,6,-7,7,-8,8,-9,9,-10,10,-11,11,-12,12,-13,13,-14,14,-15,15,-16,16,-17,17,-18,18,-19,19,-20,20]
negatifler = []
(lambda: [sayılar[i] if sayılar[i]>0 else negatifler.append(sayılar[i]) for i in range(len(sayılar))])()
print(negatifler)
Bunu anlamaya çalışın. Eğer anlayamazsanız aşağıya yazın*

*Spesifik bir örnek*:
Bu örnekte dolar ya da euro kurunu çeken bir script yazıcaz burada bloomberght sitesine gidip doların ve euronun değerini alıp kaç tl yaptığını bulucaz. Bloomberght'de şöyle bir trick var dolar mı euro mu olduğu urlsine bakarak anlayabiliyoruz...
Python:
import requests
from bs4 import BeautifulSoup

döviz = input("Dolar mı Euro mu (dolar/euro): ")
def dolar_euro():
    url = f"https://www.bloomberght.com/doviz/{''.join([i for i in ['dolar','euro'] if i == döviz])}"
    r = requests.get(url)
    soup = BeautifulSoup(r.content,"lxml")
    kur = "".join([i.text for i in soup.find_all("div",attrs={"class":"widget-interest-detail type1"})]).split()[1]
    return f"1 {döviz} = {kur} TL"

print(dolar_euro())
*Spesifik bir örnek* 2:
Sevgili @Hê-ll'in aşağıdaki sorusunu yapalım. Anlayamazsanız aşağıya yine yazarsınız. Sorusu şöyle:
m=[[[ 25, 36, 62],[ 28, 38, 64],[ 30, 40, 67]],[[ 1, 27, 56],[ 1, 25, 55],[ 2, 21, 51]]]
Bu listenin çıktısını [25, 36, 62, 28, 38, 64, 30, 40, 67, 1, 27, 56, 1, 25, 55, 2, 21, 51] bu çıktı olarak değiştirmemiz gerekliymiş.
Cevap:
Python:
m = [[[ 25, 36, 62],[ 28, 38, 64],[ 30, 40, 67]],[[ 1, 27, 56],[ 1, 25, 55],[ 2, 21, 51]]]
istenen_çıktı = [c for a in m for b in a for c in b]
print(istenen_çıktı)

Dict Comprehension
Pythonda sözlük veri tiplerini biliyorsunuzdur. Anlatmama gerek olmadığını düşünerek ufak bir değinme yapıcam.
Pythonda bir sözlük süslü parantezler belirtilerek oluşturulur. Bu süslü parantezlerin içeriği anahtar ve değer olarak ayrılır. Dışarıdan bu değerlere ulaşmak için ilgili değişkenin adı yazılarak köşeli parantez içine anahtar ifadesi yazılarak gerçekleştirir. Bunun daha ayrıntılısını konu uzamasın diye size bırakıyorum. Google'dan bakarsınız.

Burada tek ama açıklayıcı bir örneğe yer vericem. Bu örnekte yazdığımız metinde hangi harf kaç defa kullanıldığını ilk olarak normal ikinci olarak da Comprehension halini göreceksiniz. Önce yazıyorum ardından açıklamasını yapıcam...

Python:
import string

harfler = list(string.ascii_lowercase)
sözlük = {}
metin = "merhaba ben Helmsys".lower()

for i in harfler:
    if i in metin:
        sözlük.update({i : metin.count(i)})

print(sözlük)
--
Python:
import string

harfler = list(string.ascii_lowercase)
metin = "merhaba ben Helmsys".lower()
print({i : metin.count(i) for i in harfler if i in metin})

Aradaki görsel farkı gördükten sonra bunun açıklamasını yapabilirim. Normal olarak yazılanın nasıl okunduğunu bildiğinizi düşünerekten Comprehension halini açıklıyacağım. İlk olarak string modülünü dahil ettik çünkü elimizle harfleri teker teker girmek istemedik. bu harflerin her birini bir liste içerisinde sakladık. bu listeyi harfler adlı değişkende sakladık. Bir metin belirledik. Bu belirlenen metin string türündeki "metin" adlı değişkende saklı. print içerisinde Comprehension yapmamızın sebebi çıktının ekranda gözükmesi. Eveet geliyorum asıl olaya. Burada da okurken önce for döngüsünü okuyarak başlıyoruz. "for i in harfler" hemen ardından "if i in metin" koşulunu okuyor sonrasında for döngüsünün solunda yer alan "metin.count(i)" ifadesini okuyoruz. Bu bizim metinde geçen harflerin sayısını gösteriyor. Hangi harfin kaç adet kullanıldığını da ":" işaretinin solunda yer alan "i" değişkeni belirtiyor. Neden ? Çünkü Sözlüklerde "Anahtar(Key) : Değer(Value)" söz dizimi mevcut.
Buradan çıkan çıktı ise şöyle
{'a': 2, 'b': 2, 'e': 3, 'h': 2, 'l': 1, 'm': 2, 'n': 1, 'r': 1, 's': 2, 'y': 1}

Generator Comprehension

Bu belki yeni duyduğunuz belki de kıyısından köşesinden kulak aşinalığınız olan bir yapı. Pythonda Generator'ler bellek kullanımı açısından oldukça faydalı. Liste(array)lerde elemanları saklamanız için bellekte bunlara önceden yer ayrılıyor ve program sonlanana kadar o yapı bellekte yer kaplamaya devam ediyor. Fakat generatorler oluşturuldukları andan itibaren bellekten siliniyor ve bellekten kazanç elde etmemizi sağlıyor. Şimdi göstereceğim ilk örnekte yeni bir anahtar kelime ile karşılaşacaksınız. Bu anahtar kelime "yield". İnternette kullanımlarını bol bol görebilirsiniz. Ben yine basit düzeyde tutup gerisini sizin getireceğiniz birkaç örnek bırakıcam.
Örnek 1:
Python:
def generator():
    for i in range(50000):
        yield i
Burada 49.999 adet integer veri tipine sahip tam sayılar liste içerisine atılıyor. Döngü sonunda ise hepsi siliniyor :)
Bir fonksiyon içerisinde "yield" anahtar kelimesini bulunduruyorsa bu fonksiyon bir generator olarak adlandırılıyor. Bu generatorde(fonksiyonda) oluşan elemanları görüntüleyebilmek için ya liste içerisine alıp ekrana yazdırmanız gerekli ya da for döngüsü ile içeriğine ulaşıp yalnızca for döngüsünün elemanını ekrana yazdırmanız gerekli. Burada yine bellek açısından avantaj olması adına liste içerisine almaktansa döngü ile içeriğinde dolaşıp ardından silinen bir yapı işimize çok daha fazla yarayacak. Ulaşmak içinde aşağıdaki gibi yazmamız yeterli:
Python:
for j in generator():
    print(j)

Örnek 2:
Python:
def generator(a=5,c=10):
    while a <= c:
        yield a
        a += 1

for j in generator():
    print(j)

Pythonda Normal parantez "( )" içerisine yazılan comprehension bir generatordur. Aynı normal olarak yazılan fonksiyonun tek seferde yazılan isimsiz(lambda) fonksiyonların olduğu gibi. Burada da benzer yapı tıpkı List Comprehension gibi. Tek fark parantezlerin normal olması :). Bunun dışında okuması ve yazması birebir aynı.
Arıyorsanız bir örnek şöyle verebilirim... Bu örnekte lambda ve generator comprehension ortak kullanıldı:

Python:
import string
import random
from time import sleep, time

letters = list(string.printable)
input_ = input("Parola oluştur: ")
passw = ""
ilk = time()
while input_ != passw:
    sleep(0.3)
    try_again = random.choices(letters,k=len(input_))
    (lambda: [try_again.remove(j) for j in try_again if j in list(string.whitespace)])() # lambda ve Generator comprehension kullanımı
    for i in try_again:
        if i in input_:
            passw += i
    if input_ == passw:
        print(passw)
        print("Bulundu")
        print(f"{(son-ilk).__round__(3)} Saniye sürdü")
    else:
        print(f"Denendi : {try_again}")
    son = time()

.
.
.
Eklemek istedikleriniz varsa, yanlış bulduğunuz yer varsa ya da başka herhangi olumsuz bir şey... Belirtmekten geri durmayın.
Hoşçakalın....
iyi konu ellerine saglik epey ugrasmissin
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.