Ana içeriğe geç

Python’da Operatörler

Bu eğitimde Python’daki operatör türleri, operatör aşırı yükleme, işlem önceliği ve birleşme kuralları ele alınmaktadır.
· 9 dk. oku

Yapay Zeka ile Keşfedin

Matematikte olduğu gibi, Python gibi programlama dillerinde de operatörler vardır. Bunları, bilgisayar bilimlerinin temelinde yatan son derece basit fonksiyonlar olarak düşünebilirsiniz. Bir bilgisayar programının indirgenebileceği en basit işlemlerdir. Her hevesli Veri Bilimci veya Yazılım Mühendisi için temel bilgidir.

Bu eğitimde şunları öğreneceksiniz:

Python Programlama Dili’nin temelleri hakkında daha fazla bilgi edinmek isterseniz, ücretsiz Intro to Python for Data Science kursumuza mutlaka göz atın.

Aritmetik Operatörler

Bunlara muhtemelen zaten aşinasınızdır; temel matematikten gelirler.

Aritmetik operatörler toplama (+), çıkarma (-), çarpma (*), bölme (/), üs alma (**), tam bölme (//) ve modülüs (%)’tür. İlk dördü oldukça basittir; toplama, çıkarma, çarpma ve bölmedir ve muhtemelen bunlara hâlihazırda aşinasınızdır.

# Addition
print(5 + 2)

# Subtraction
print(5 - 2)

# Multiplication
print(5 * 2)

# Division
print(5 / 2)
7
3
10
2.5

Diğer üçü biraz daha karmaşıktır. Üs operatörü “müşterek kuvvetine yükseltme” anlamına gelir. Örneğin, 2 ** 3 ifadesi 2’nin kendisiyle 3 kez çarpılması demektir; yani 2 ** 3, 2 * 2 * 2 ile aynıdır ve 8’e eşittir.

Tam bölme, normal bölme gibidir; ancak sonuç her zaman aşağı yuvarlanır. Aşağıdaki örnekte 5, 2’ye bölünür ve sonuç 2,5’tir. Ancak tam bölme söz konusu olduğundan 2,5 aşağı yuvarlanarak 2 olur.

Son olarak modülüs, bölmeden kalan değerdir. 5%2 örneğinde, 2 sayısı 5’in içine yalnızca iki kez sığar, bu da kalanının 1 olduğu anlamına gelir.

# Exponent
print(5 ** 2)
# This is the same as 5 * 5

# Floor Division
print(5 // 2)

# Modulus
print(5 % 2)
25
2
1

Python’da toplama operatörü, string birleştirmek için de kullanılabilir. Bu, metinlerin tek bir string olarak bir araya getirileceği anlamına gelir; örneğin:

firstName = "Théo"

introduction = "Hi, my name is " + firstName + "."

print(introduction)
Hi, my name is Théo.

Atama Operatörleri

Biraz programlama deneyiminiz varsa, atama operatörlerini mutlaka kullanmışsınızdır. Bunlar bir değişkene belirli bir değer atar. En çok kullanılanı =’dir. Kullanmak için, değer atamak istediğiniz değişkenin adını, ardından = ve atanacak değeri yazmanız yeterlidir. Örneğin, balance değişkenine 100 değerini atamak isterseniz şunu yapabilirsiniz:

balance = 100
print(balance)
100

balance değerini 10 artırmak isterseniz, balance += 10 kullanabilirsiniz. Bu, balance = balance + 10 ifadesinin eşdeğeridir ancak çok daha kısadır.

balance += 10
print(balance)
110

Aynısı -= için de geçerlidir; balance -= 10, balance = balance - 10 ile aynıdır:

print(balance)
balance -= 10
print(balance)
110
100

Diğer atama operatörleri de tam olarak aynı şekilde çalışır. Bunlar şunlardır:

  • *=
  • /=
  • **=
  • //=
  • %=

Karşılaştırma Operatörleri

Karşılaştırma operatörlerini, adından da tahmin edeceğiniz üzere, değişkenlerin değerlerini karşılaştırmak için kullanabilirsiniz. Her zaman True veya False olan bir boolean değer döndürürler. Altı tanedir:

  • Eşit: ==
  • Eşit değil: !=
  • Büyüktür: >
  • Küçüktür: <
  • Büyük eşittir: >=
  • Küçük eşittir: <=

İşte bazı örnek karşılaştırmalar:

a = 3
b = 5

print(a == b) # Equal
print(a != b) # Not equal
print(a > b) # Greater than
print(a < b) # Less than
print(a >= b) # Greater than or equal to
print(a <= b) # Less than or equal to
False
True
False
True
False
True

== ve != sayılar yerine string’leri karşılaştırmak için de kullanılabilir. Diğer operatörler string’lerle uyumlu değildir; çünkü bir string’in diğerinden “büyük” olması söz konusu değildir.

print("Hello" == "World")
print("Python" != "R")
False
True

Mantıksal Operatörler

Bunlara zaten aşina olabilirsiniz! Mantıkta bunlara mantıksal bağlaçlar denir. İnsan dilinde de yaygın şekilde kullanılırlar. Şunlardır: and, or ve not.

and, yalnızca her iki operand (karşılaştırdığınız iki boolean nesne) da True ise True döndürür. Örneğin:

print(True and True)
print(True and False)
print(False and False)
True
False
False

Bu mantıksal operatörün davranışını anlamak için bir doğruluk tablosundan yararlanabilirsiniz:

aba and b
TrueTrueTrue
TrueFalseFalse
FalseTrueFalse
FalseFalseFalse

or, operandlardan herhangi biri (bir veya daha fazlası) True olduğunda True olur.

print(True and True)
print(True and False)
True
False
aba or b
TrueTrueTrue
TrueFalseTrue
FalseTrueTrue
FalseFalseFalse

Dikkat: Bunlar iki operanddan fazlasıyla da çalışır; örneğin:

print(True and True and True and True)
print(True and True and True and False)
print(False or False or False or False)
print(False or False or False or True)
True
False
False
True

not, operandının tersini döndürür; yani False verildiğinde True, tersi durumda False.

print(not True)
False
anot a
TrueFalse
FalseTrue

Operatör aşırı yükleme

Daha önce, +’nın sayıları toplamak için kullanılabildiğini, ancak string’leri birleştirmek için de kullanılabildiğini görmüştünüz. Yani +, üzerinde kullandığınız nesnenin türüne bağlı olarak farklı çalışır. Ancak bu her zaman geçerli olmayacaktır. Bazen üzerinde çalıştığınız operatör, kullanmak istediğiniz nesne türünü desteklemez.

İşte bir örnek. Diyelim ki ozzy ve filou adında iki Dog nesneniz var. Bunlar aşağıdaki Dog sınıfına aittir. Sınıfı, nesnelerin nasıl görünmesi ve nasıl davranması gerektiğine dair bir plan olarak düşünebilirsiniz. Bu durumda Dog nesnelerinin bir adı, yaşı ve boyu vardır. Sınıf tanımlandıktan sonra nesneleri yaratabilirsiniz. Bunlardan biri 3 yaşında ve 30 santimetre boyunda olan Ozzy’dir. Diğeri ise 5 yaşında ve 65 santimetre boyunda olan Filou’dur.

Bu örnek Nesne Yönelimli Programlama kavramını kullanır. Bunun hakkında daha fazla bilgi edinmek isterseniz Python’da Nesne Yönelimli Programlama eğitimimizi mutlaka okuyun.

Diyelim ki iki köpeği büyüktür operatörüyle (>) karşılaştırmak istediniz. Bu çalışmayacaktır. '>' not supported between instances of 'Dog' and 'Dog' şeklinde bir hata alırsınız. Bu, > operatörünün Dog sınıfı nesnelerini nasıl karşılaştıracağını bilmediği anlamına gelir.

class Dog:

    def __init__(self, name, age, height):  
        self.name = name
        self.age = age
        self.height = height

ozzy = Dog("Ozzy", 3, 30)
filou = Dog("Filou", 5, 65)

print(filou > ozzy)
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-96-428069ab24cc> in <module>()
      9 filou = Dog("Filou", 5, 65)
     10
---> 11 print(filou > ozzy)


TypeError: '>' not supported between instances of 'Dog' and 'Dog'

Neyse ki operatör aşırı yükleme ile, operatörün Dog nesneleri üzerinde çağrıldığında nasıl davranacağını tanımlayabilirsiniz. Bu durumda, ‘greater than’ (büyüktür) anlamına gelen __gt__ adlı ve iki argüman alan bir yöntemin tanımlanması gerekir. Köpeklerimizi boylarına göre karşılaştırmak istediğimiz için yöntem self.height > other.height değerini döndürür.

class Dog:

    def __init__(self, name, age, height):  
        self.name = name
        self.age = age
        self.height = height

    def __gt__(self,other):
        return self.height > other.height

ozzy = Dog("Ozzy", 3, 30)
filou = Dog("Filou", 5, 65)

print(filou > ozzy)
print(ozzy > filou)
True
False

Öncelik

Birçok operatörü bir arada kullandığınızda işler kafa karıştırıcı olabilir. Aşağıdaki örneğe bir göz atın:

a = 2
b = 3
c = 9

a ** b > 5 and c - a // b >= 9 or b ** 2 == c
True

Hangisinin önce çalıştırılacağını nasıl bileceksiniz? Bu kadar çok sembolün olduğu bir kod satırını nasıl okumalısınız? Soldan sağa mı çalıştırılır, yoksa belirli bir sırası mı vardır?

İşte burada öncelik devreye girer. Python operatörleri çok belirli bir sırayla yürütülür ve bazıları diğerlerine göre önceliğe sahiptir.

Aşağıdaki tabloda, operatörler için öncelik sırasını yukarıdan aşağıya görebilirsiniz. Bu kurallar, bir formülde belirli hesaplamaların diğerlerinden önce yapılması gerektiği matematiktekiyle aynıdır.

ÖncelikOperatörAçıklama
1**üs alma
2*, /, %, //çarpma, bölme, modülüs, tam bölme
3+, -artı, eksi
4>, <, >=, <=karşılaştırma
5==, !=eşitlik
6= %= /= //= -= += *= **=atama
7and, or, notmantıksal

Birleşme Kuralları

Önceliğin önemli olduğunu gördünüz! Peki, çarpma ve bölme gibi aynı öncelik düzeyinde olanlar için ne geçerli? Aynı anda mı çalıştırılırlar? Hayır. *, \, % ve \\ soldan sağa, ** ise sağdan sola doğru yürütülür. Buna birleşme kuralları (associativity) denir.

Aşağıdaki örneğe bakın. Bu durumda operatörler soldan sağa yürütülür ve çıktı 3’tür.

print(5 * 2 // 3)
3

Ancak parantez ekleyerek operatörlerin yürütülme sırasını değiştirebilirsiniz. Bu da matematikteki birleşme kurallarıyla aynı şekilde çalışır. Parantez içindeki her şey önce hesaplanır. Bu durumda önce tam bölme, ardından çarpma yapılacaktır.

print(5 * (2 // 3))

Sonuç

Artık operatörlerin ne olduğunu, nasıl kullanmanız gerektiğini ve nasıl çalıştıklarını biliyorsunuz. Ayrıca aşırı yükleme, öncelik ve birleşme kurallarını da öğrendiniz. Python ustası olma yolunda iyi ilerliyorsunuz! Daha da fazlasını öğrenmek isterseniz, Intermediate Python for Data Science kursumuza göz atmaktan çekinmeyin.

Konular

İlgili