Sınırsız sayıda isimli argüman oluşturma hk. destek

  def karşılık_bul(*args, **kwargs):
    for sözcük in args:
        if sözcük in kwargs:
            print("{} = {}".format(sözcük, kwargs[sözcük]))
        else:
            print("{} kelimesi sözlükte yok!".format(sözcük))


sözlük = {"kitap"      : "book",
          "bilgisayar" : "computer",
          "programlama": "programming"}

karşılık_bul("kitap", "bilgisayar", "programlama", "fonksiyon", **sözlük)

yukarıda tanımlanan sözlük değişkeni (sözlük veri tipinde olan) oluşturduğumuz karşılık_bul() fonk. içine yazılırken " **sözlük " şeklinde yazılıyor. Bir sözlük veri tipindeki değişken fonk. içine yazılamıyor biliyorum fakat burada tam olarak o " ** " ne işe yarıyor tam anlayamadım.

karşılık_bul("kitap", "bilgisayar", "programlama", "fonksiyon", kitap= "book", bilgisayar = "computer", programlama = "programming")

eğer o " ** " (iki yıldız) kullanımı sözlük veri tipini yukarı ki şekle getiriyor ise;

print(**sözlük)

yapıtığımda neden syntax hatası alıyorum. Muhtemel kuvvetle basit hatalardan oluşan bir durum söz konusu fakat hiç programlama mantığı bilmeden python’a başladığım için kusuruma bakmayın :slight_smile:

1 Beğeni

Şu konuya bir bakar mısınız lütfen.

anlatımınız için teşekkür ederim, yine de kafamda canlanmadı desem yalan söylemiş olmam. Sözlük veri tipine ** (çift yıldız) koyduğumuz zaman gerçekleşen değişim kafamda canlanmıyor bir türlü.

Söyle bir değişim oluyor:

>>> bir_fonksiyon(**{"a": 1, "b": 2})
>>> bir_fonksiyon(a=1, b=2)

Bu iki satır eşdeğer.

4 Beğeni

@EkremDincel’in yazdıklarına ilaveten şöyle bir örnek yapalım:

sozluk = {"end": "\n\n", "sep": "---"}
print("merhaba", "dünya", **sozluk)

Bu yukarıdaki kod hata vermeden çalışır. Çünkü sozluk isimli sözlüğün içindeki anahtarlar zaten print fonksiyonunun ön-tanımlı argümanları. Bu yukarıdaki ifade şuna dönüşür:

print("merhaba", "dünya", end="\n\n", sep="---")
3 Beğeni

karşılık_bul("kitap", "bilgisayar", "programlama", "fonksiyon", kitap= "book", bilgisayar = "computer", programlama = "programming")

yani aslında benim yukarıdaki varmış olduğum sonuç gibi, sizin söylediğiniz üzere benim;

print(**sözlük)

yaptığımda syntax hata almamın sebebi de aslında print(kitap= "book", bilgisayar = "computer", programlama = "programming") haline gelmesi ve print fonk’nun böyle parametre alamamasıymış.

1 Beğeni

Haklısınız, aynen öyle. print fonksiyonundaki anahtar kelime argümanlarının isimleri belirlenmiş. Dolayısıyla bu tanımlı olan anahtar kelime argümanlarından başka anahtar kelime argümanı yazamayız.

Ama mesela şöyle bir fonksiyonda, bu parametreler belli değil.

def fonksiyon(**kwargs):
    print(kwargs)


fonksiyon(a=1, b=2, bir_baska_anahtar="hello")

Dolayısıyla yukarıdaki fonksiyonda keyfimize göre anahtarlar oluşturabiliyoruz.

2 Beğeni

evet bunu anladım, istediğim bunu ezberlemektense arkadan arkaya gerçekleşen işlemi ve mantığını kavramaktı onu da anladım çok şükür. Desteğin için teşekkür ederim.