İşleçler(Operators)

İşleçler(operators)

Tanım

x and y Mantıksal “ve”
x or y Mantıksal “veya”
not x Mantıksal değilleme (1=>0, 0=>1)
x işleç y işleç: <,<=,>,>=,==,<>,!=,is is not, in, in not büyük/küçük,büyük/küçük eşit,eşitlik,eşitsizlik karşılaştırmaları
x&y bit boyutunda “ve”
x|y bit boyutunda “veya”
x^y bit boyutunda özel veya (XOR)
x>>y, x<<y bit boyutunda sağa ve sola kaydırma
x+y, x-y toplama/ekleme, çıkarma
x*y,x%y,x/y,x//y çarpma/tekrarlama, mod alma(kalan),bölme*
-x,+x,~x,x**y negatif,tanımlama,bit eşleniği alma,üs alma
x[i],x[i:j],x.attr, x(…) dizin,bölümleme,nitelik,fonksiyon çağırma
(1,2,3,..), [1,2,3,…],{},’abc’ tuple,dizin,kütüphane,diziye çevirme

>>> num = 1 / 3.0

>>> num # num degiskenini gorelim. Sondaki 1 de neyin nesi acaba ?? J

0.33333333333333331

>>> print num # num degiskenini basarak gorelim. Gorulecegi uzere yuvarlama yapildi

0.333333333333

>>> “%e” % num # Dizi formu

‘3.333333e-001’

>>> print “%2.2f” % num # Dizi formu

‘0.33’

Buradaki farklılık repr ve str yapısal yordamların(built-in functions) farklılığından meydana geliyor:

>>> repr(num) # normal basim =>yankı(echo) etkisi tarafindan kullanilan:echo:bakalim neymis bu olayi=> degiskeni yaz +return

‘0.33333333333333331’

>>> str(num) # yuvarlanmis basim=>print tarafindan kullanilan

‘0.333333333333’

Bölme işlemlerinde dikkat edilmesi gereken bir durum var :

X / Y bölmesi ile yuvarlamalı X//Y bölmesi. Örnek ile açıklayalım:

>>> a=1

>>> b=2

>>> a/b

0

>>> b=2.0

>>> a/b

0.5

>>> a//b

0.0

>>> b=-2.0

>>> a/b

-0.5

>>> a//b

-1.0

Anlaşılmıştır umarım “// ” bölmesinde yuvarlamaların küçük tamsayıya olduğuna,ayrıca 2 ile 2.0 (veya 1 il 1.0) arasındaki farka dikkat. Ek örnekler:

>>> (5 / 2), (5 / 2.0), (5 / -2.0), (5 / -2)

(2, 2.5, -2.5, -3)

>>> (5 // 2), (5 // 2.0), (5 // -2.0), (5 // -2)

(2, 2.0, -3.0, -3)

>>> (9 / 3), (9.0 / 3), (9 // 3), (9 // 3.0)

(3, 3.0, 3, 3.0)

Ancak yapısal bir kod parçası ile dikkatsizlik sonucu sorun yaratabilecek bu durumdan kurtulabilinir:

>>> from __future__ import division>>> (5 / 2), (5 / 2.0), (5 / -2.0), (5 / -2)

(2.5, 2.5, -2.5, -2.5)

>>> (5 // 2), (5 // 2.0), (5 // -2.0), (5 // -2)

(2, 2.0, -3.0, -3)

>>> (9 / 3), (9.0 / 3), (9 // 3), (9 // 3.0)

(3.0, 3.0, 3, 3.0)

BİT BİT İŞLEMLER

>>> x = 1 #x=0001

>>> x << 2 # x ‘i sola 2 bit kaydırdık bu durumda:x=0100

4

>>> x | 2 # x; 2=0010 ile VEYA işlemine tabi tutuldu sonuç: 0011

3

>>> x & 0 # x; 0 ile VE işlemine tabi tutuldu sonuç:: 0000

0

8‘li 16’lı işlemler

>>> oct(64), hex(64), hex(255)

(‘0100’, ‘0x40’, ‘0xff’)

oct=>10’lu tabandan 8’li tabana,

hex=>10’lu tabandan 16’lı tabana çevirme işlemi uygular

>>> int(‘0100’), int(‘0100’, 8), int(‘0x40’, 16)

(100, 64, 64)

int=>yukarıda görüldüğü üzere 8’li ve 16’lı tabandaki verileri 10’lu tabana çevirir.

Print formu ‘da ayarlanabilir elbette:

>>>print “%o %x %X” % (64, 64, 255)

‘100 40 FF’

 

 

MATEMATİKSEL İŞLEMLER

>>> abs(-42), 2**4, pow(2, 4) #tamsayi ve us islemleri

(42, 16, 16)

>>> int(2.567), round(2.567), round(2.567, 2)

(2, 3.0, 2.5699999999999998)

#evet kafa karıştırıcı. Yukarıdaki yuvarlama(round) işleminde ne oldu anlayalım:

>>> round(2.567, 1)

2.6000000000000001

>>> round(2.567, 2)

2.5699999999999998

>>> round(2.567,3)

2.5670000000000002

>>> round(2.567, 4)

2.5670000000000002

#bkz:kayar nokta sayılar

 

Daha gelismis formlar icin C kutuphanesine benzer math dosyasi(Bkz:module) cagrilmalidir:

>>> import math

>>> math.pi, math.e

(3.1415926535897931, 2.7182818284590451)

>>> math.sin(2 * math.pi / 180)

0.034899496702500969

 

 

Hatırlama:

>>> a = 3

Bu işlem yapılırken python neler yapıyor acaba? Görelim:

1. Bir nesne oluşturulur ve ona 3 değeri atanır.

2. a değişkeni halihazırda yoksa oluşturulur.

3. a değişkeni, 3 değerine sahip nesneye bağlanır(linked)

Başka bir örnek verelim:

>>> a = 3

>>> b = a

>>> a = 5

burada 3 ve 5 değerlerine sahip iki nesne var ve sırasıyla a ve b değişkenleri onlara bağlı durumda. Özetle oluşturulan değişkenler belirli bir bellek hücresine işaretçi olarak atanmazlar. Her değişkene atanan veri yapisi bellekte bir yerde oluşturulur(oluşturulan ‘şey’ bir “nesne” dir). Bu durumda bellek gözünde oluşturulan nesnenin sahip olduğu verinin üstüne yazılamamakta. Örneğin a=3 bellekte 0x000..A adresinde olsun. Şimdi biz 0x000..A adresine 5 yazamayız demek oluyor(bkz:immutability). Bu durumda hemen iki soru akla geliyor:

1. Eğer ben bir bellek gözüne işaret etmek istiyorsam ne yapacağım ?

2. Her değişken/sbt için bir nesne oluşturuluyorsa sonuçta bellek bir süre sonra şişmeyecek mi ?

Sırayla yanıtlayalım:

 

Referanslar ve Değişebilen Nesneler

Bellek gözünde herhangi bir yerde nesne oluşturduktan sonra tam o nesneyi değiştirmek istiyorsak dizin/liste biçimini yani işaretçileri kullanacağız bu durumu da örnekle açıklarsak:

>>> L1 = [1,2,3]

>>> L2 = L1

şimdi burada ne oldu ? yukarıdaki eşleştirmelerde L1[0]=1, L1[1]=2, L1[2]=3 değerlerini aldı(Bu ifade aslında yanlıştır. Doğrusu :…değerlerine sahip nesnelere bağlandı olacaktır Bkz:Dikkati toplamak için hata yapmak)

devam edelim:

>>> L1 = 24

>>> L2

[1,2,3]

>>> L1=[1,2,3]

>>> L2

[1, 2, 3]

>>> L1[0]=0

>>> L2

[1, 2, 3]

>>> L2=L1

>>> L2

[0, 2, 3]

>>> L1[0]=1

>>> L2

[1, 2, 3]

>>Ayrıntılar için<<

anlaşılmıştır umarım. Eğer ikinci L1=[1,2,3] eşitlemesi program icinde yapilmis olsaydi, iyi derlenmis bir programda ayni bellek gozundeki nesneye isaret edeceginden L2 ifadesini de degistirecekti(Bkz: Bellek eniyilemesi(optimizasyonu)). Ancak deneme asamasinda kodlari “shell” de yazdigimiz icin boyle bir islem gerceklestirilmedigi goruluyor. Ancak tekrar esitleme sonrasi isaretci ozelligi kazanabildi.

Yukarıdaki “Eğer ikinci…” ile başlayıp devam eden cümle yanlıştır. Neden olduğunu anladıysanız, python ve NYP mantığını anlamaya başlamışsınızdır demektir.

 

 

ÇÖP SÜPÜRME(GARBAGE COLLECTION)

İkinci soruya yanıt olarak cevap elbette hayir olacak. Örnekle aciklayalim:

>>> x = 1

>>> x = ‘python’ # ‘1′ degeri uctu

>>> x = 3.1415 # ‘python’ degeri uctu

uçmak ne demek ? şu demek; o bellek gözü yazılım tarafından artık dikkate alınmayacaktır. Belki hala oradadır(üzerine yazılmadıysa), ancak başka bir değişken veya işaretçi tarafından da kullanılmıyorsa ona ulaşmak mümkün olmayacaktır.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s