Python’da Yıldız İşaretinin 5 Kullanımı

Oğuzhan Çelikarslan
4 min readNov 20, 2020

Yıldız işareti ingilizce ifadesiyle asterisk(*) çarpma işareti olarak bilinir ve genel olarak bütün programlama dillerinde yaygın olarak kullanılır.

Python’da ise bu işaretin sadece çarpma işareti olarak değil, birçok farklı kullanım şekilleri vardır. Bu makalemizde ise 5 adet asteriskin farklı kullanım şekillerine göz atacağız.

Kullanım 1: Çarpma veya Üs Alma Operatörü

En basit anlamıyla çarpma veya üst alma operatörü olarak asteriski kullanabiliriz.

>>> 2*3 # iki kere üç altıdır
>>> 6
>>> 2**3 # ikinin üçüncü kuvveti 8 dir
>>> 8

Kullanım 2: Fonksiyonun Dinamik Argüman Alabilmesi

Python’da bir fonksiyon tanımlarken, normalde bu fonksiyona belli başlı parametreler yazarız ve daha sonra biz bu fonksiyonu çalıştırıken gerekli parametreleri gönderiririz. Asterisk burada bize bir farklı kullanım alanı daha sunuyor. Peki bu esneklik nedir? Yukarıda ki örneği inceleyelim. Öncelikle print_genius adında bir fonksiyon tanımlanmış bu fonksiyona kişilerin adını teker teker parametre olarak vermek yerine, *names yazılmış ve parametreler belirlenmemiş. Bu sayede kullanıcıya büyük bir esneklik sağlanmış. Kullanıcı ne kadar parametre girerse bu fonksiyonu kullanırken otomatik olarak fonksiyonumuz o kadar parametre almış oluyor. Bu tek olarak tanımlanmış parametreye aktarılan verilerin hepsine, fonksiyon içerisinde tuple olarak erişebilirsiniz. Örneğin print(type(names))’i yazdırırsanız ekranınıza names adında ki bu parametrenin tuple tipinde olduğunu göreceksiniz. Bu sayede bir tuple ile ne yapabiliyorsanız her şeyi yapıyor olabileceksiniz. Bir diğer kullanım ise names isminde ki parametrenin başına ** iki adet yıldız işareti koymaktır. Yine bu fonksiyonun kullanıcısına “istediğin kadar parametre gönder ” demektir lakin, gönderilen parametreler bir keyword ile gönderilmelidir. Örneğin ilk örneğimizde ki fonksiyonda print_genius(‘Elon Mask’, ‘Mark Zuckerberg ‘, ‘Yang Zhou’) şeklinde bir kullanım yaptık. Direkt olarak keywordler olmadan fonksiyona parametreler gönderdik. İkinci örneğimizde 17. satırda, top_genius(Top1=”Elon Mask”, Top2=”Mark Zuckerberg”, Top3=”Yang Zhou”) şeklinde fonksiyonu çalışdırdık. Bunun sebebi 12. satırda ki fonksiyonda tanımlanan parametre başına ** koyulmasıdır. Eğer ki bir parametre başına “**” işareti koyulursa, o fonksiyonu kullanırken, gönderilen parametrelerin başlarına Top1, Top2 ve Top3 gibi keywordler koymamız gerekecektir. Tabi ki de Top1, Top2 ve Top3 yerine istediğiniz keywordleri de yazabilirsiniz. Peki bu neyi değiştirdi?

İkinci fonksiyonun içerisine girerseniz ve print(type(names)) yazıp çalıştırırsanız artık names parametresinin bir tuple değil, bir sözlük olduğunu göreceksiniz.

Not: Eğer bir fonksiyonun ne kadar argüman aldığına karar veremiyorsanız aşağıda ki gibi bir tanımlama yapabilirsiniz.

Kullanım 3: Sadece Anahtar Kelimeli Parametreler Gönderilsin Kısıtı

Eğer ki fonksiyonunuza sadece anahtar kelimerler(keyword arguments) ile parametre gönderilmesini istiyorsanız. Aşağıda ki örneği inceleyiniz.

Fonksiyonun birince parametresine bir tane yıldız işareti koyduğumuzu gördük. Devamında istediğimiz parametrelerimizin adını yazdık. genius(‘Yang’, ‘Zhou’) diyerek fonksiyonumuzu çalıştırdık hata verdi. Bunun sebebi bu fonksiyona parametre gönderirken anahtar kelime kullanmamış olamamızdır.

Eğer ki birkaç tane parametrenin pozisyon ile çalışıp geri kalanının ise yine anahtar kelimelerle gönderilmesini zorunlu tutmak istiyorsanız bununda bir dinamik yolu var.

Öncelikle pozisyonsal olarak girilebilmesini istediğiniz argumanların isimlerini yazın, daha sonra ikici parametreye bir adet yıldız koyduktan sonra almak istediğimiz keyword argumanların adını yazıyoruz ve sonuç olarak ilk örnekteki işlemin aynısını uygulamış oluruz. 2 ve 3. parametreler anahtar kelime ile gönderilmek zorunda kalacaktır.

Kullanım 4: Iterablelar Üzerinde Kullanım

Bu kavrama unpacking de deniliyor. Aşağıda ki örneğe bakalım ve bu işlemin aslında ne kadar da işimizi kolaylaştırdığını görelim. Bizden bir kod parçası yazmamızın istendiğini varsayalım. Bir liste, set ve tuple içerisinde ki tüm elemanları alalım ve yeni bir listeye atalım. Python ile çok haşır neşir olmayan bir kimse büyük ihtimalle bu olayı aşağıda ki yöntem ile çözerdi.

Sırayla tüm iterableları itere edip bir listeye eleman olarak atardık. Artık bu makaleyi okuyanlar ve henüz bilgi sahibi olamayanlar, aşağıda ki yöntemle bu olayı çözecekler.

Yukarıda ki örneğe baktığımızda bir iterableın başına yıldız ifadesi koyarsanız otamatik olarak içinde ki elemanları dışarı çıkarmış olacaktır. Eğer bir listenin(L) içerisinde ki tüm iterableların başına yıldız işareti koyarsanız bu durumda l’nin içerisinde bizim tüm iterablelarımızın içinde ki veriler olmuş olacaktır.

Peki sözlük kullansaydık durum nasıl değişecekti?

Eğer ki bir sözlük objesinin başına bir adet * koyarsanız çıktı olarak unpacking olan şey bu sözlüğün anahtarları olacaktır. ** adet koyarsanız bu seferde değerleri alacağız peki biz ne yapmalıyız?

D adında bir sözlüğümüz olsun bu sözlüğümüzün başına * işareti koyarak yazdırırsak ekrana first, second ve third sırasıyla yazılacaktır. print(**D) yazarsak hata alacağız o sebeple biz değerleri yazdırmak için ** ile değerleri almalıyız ve bu değerleri karşılıkları olan keyleri kullanarak ekrana bastırmalıyız. Yukarıda ki örnekte 9. satırı incelediğimizde tamda bunu kodsal olarak örneklemiş oluyoruz.

Kullanım 5: Genişletilmiş Iterable Unpacking

Başlığı kasıtlı ingilizce kullanmaya çalıştım bu sayede bu kelimeleri yabancı kaynaklarda gördüğünüzde yabancılamazsınız.

Bu syntax PEP 3132 ile birlikte tanıtılmıştır. Bu kullanımı uzunca yazarak anlatmak yerine direkt olarak bir örnek ile birlikte açıklamak istiyorum.

Aslında buradaki kullanım tarzı ile birlikte L dizisi üzerinde verileri parça parça açabiliyoruz. a, *b diyerek burada aslında şunu demiş olduk. L dizisinin içerisinde ki 0. eleman yani “1” i a değerine ata geri kalan tüm verileri “*b” olarak belirtmiş olduğum b içerisine koy. Eğer ki sırasıyla a ve b parametresini ekrana bastırırsak çıktılar karşımıza gelecektir.

Kapanış

yıldız işareti programlarımızda çok yaygın kullanılan işaretlerden birisidir. Direkt olarak sadece yıldız işaretini çarpma işlemlerinde kullanmak yerine, pythonda ki diğer kullanım şekillerinden de faydalanarak daha Pythonic kodlar yazabiliriz.

Bu makaleyi yazma fikrini yazılım geliştirici ve girişimci Yang Zhou’dan esinlendim. Kendisine emekleri ve yazılıma katkıları için teşekkür ederim.

--

--

Oğuzhan Çelikarslan

Python enthusiast who focuses on the problem, break down it, and solves it. https://oguzhann.net