Python Programlama Diline Giriş III

 

Python Programlama Diline Giriş III

Merhaba Arkadaşlar. Bu haftadaki konularımız.

1 Python'da Deyimler

2 İfade sel Deyimler (Expression Statements)

3 Bileşik Deyimler

4 Bileşik Deyimlerin Genel Yazım Biçimi

5 if Deyimi

6 Döngü Deyimleri (Loop Statements)

7 while Döngüleri

8 for Döngüleri

9 break Deyimi

10 continue Deyimi

11 Pyton'da Switch-Case Deyimi Yoktur

12 pass Deyimi

13 Koşul Operatörü

14 Fonksiyonların Tanımlanması

15 Fonksiyonların Parametre Değişkenleri

16 Modüller ve Modüllerin Import Edilmesi

17 Bir Modülü Import Etmekle Çalıştırmak Arasındaki Fark

18 Python'da İsim Arama

19 Python'da Değişkenlerin Ömürleri

Python'da Deyimler

Deyim (statements) bir dildeki çalışma birimleridir. Yani bir program aslında deyimlerin çalıştırılmasıyla çalıştırılır. Bir Python programını deyimler topluluğu olarak düşünebiliriz. Python'da deyimler iki gruba ayrılmaktadır:

1 Basit deyimler

2 Bileşik deyimler

Python'da tek bir satıra yazılabilen deyimlere basit deyim denilmektedir. Deyimlerin bir grubu böyle tek satıra yazılabilen basit deyimlerden, bir grubu da bileşik deyimlerden oluşmaktadır.

 

İfadesel Deyimler (Expression Statements)

Anımsanacağı gibi operatörlerin, sabitlerin ve değişkenlerin her bir kombinasyonuna ifade (expression) deniliyordu. İşte ifadeler aynı zamanda bir deyim de belirtmektedir. İfadesel deyimler kategori olarak basit deyim durumundadır. Örneğin:

a = b

x = y + 10

z = foo(10) * 2

Bu satırların her biri birer ifadesel deyimdir.

Bileşik Deyimler

Bileşik deyimler kendi içerisinde başka deyimleri de içerebilen deyimlerdir. Bunların çoğu program akışını yönetmek için kullanılmaktadır. Bunlara pek çok programlama dilinde "kontrol deyimleri" de denilmektedir. Bileşik deyimlerin içindeki deyimler aynı girinti füzeyine sahip olacak biçimde "girintili olarak" yazılmak zorundadır. Her iç bileşik deyime geçildiğinde girinti düzeyi artırılır. Aynı girinti düzeyine sahip olan deyimler aynı bileşik deyimin içerisinde kabul edilmektedir.

 

 

Bileşik Deyimlerin Genel Yazım Biçimi

Bileşik deyimlerin genel biçimleri birbirlerine benzemektedir. Bileşik deyimler bir anahtar sözcük ile başlatılır (if, for, while gibi) sonra bunların bir başlık kısmı olur. Ondan sonra da bu başlık kısmını ':' atomu izler. Sonra bu deyimlerin içerisindeki deyimler girintilenerek (yani indent'lenerek) yazılırlar. Bileşik deyimlerin içerisindeki deyimler aynı girinti düzeyine sahip olmalıdır. Yukarıda da belirtildiği gibi Python yorumlayıcısı aynı girinti düzeyine sahip olan deyimlerin aynı bileşik deyiminin içerisinde olduğunu düşünmektedir.

Bileşik deyimlerin yazımı "suite" kavramı ile daha kolay açıklanabilir. "suite" bileşik deyimin ':' atomundan sonraki kısmına ilişkin bir kavramdır. Bir suit aynı satır üzerine yazılmış olan birden fazla basit deyimi ya da aynı girinti düzeyine sahip farklı satırlarda yazılmış birden fazla deyimi belirtmektedir.

Bu bir suite belirtmektedir. Örneğin:

ifade1

ifade2

ifade3

İşte bileşik deyimler genellikle böyle suit'ler içermektedir. Örneğin while deyimi (ileride görülecek) ':' atomundan sonra bir suite almaktadır. Genel biçimi şöyledir:

while <ifade>: <suite>

Bu durumda aşağıdaki while deyimi geçerlidir:

while i < 10: ifade1; ifade2; ifade2

Aşağıdaki while deyimi de geçerlidir:

while i < 10:

ifade1

ifade2

ifade3

Ancak aşağıdaki while deyimi geçerli değildir:

while i < 10: ifade1

ifade2

ifade3

 

Çünkü burada hem aynı satıra hem de aşağıdaki satıra deyim yazılmıştır. Oysa suit ya aynı satıra yazılan birden fazla basit deyimi ya da aynı girinti düzeyine sahip birden fazla satıra yazılan deyimleri belirtmektedir.

 

if Deyimi

if deyimi bir koşulun doğru ya da yanlış olmasına göre birtakım deyimleri çalıştıran temel bir kontrol deyimidir. Genel biçimi şöyledir:

if <koşul ifadesi>: <suit>

[else: <suit>]

if anahtar sözcüğü ile else anahtar sözcüğünün aynı girinti düzeyine sahip olması gerekir. Ancak if deyiminin doğruysa ve yanlışsa kısmındaki suite'lerin aynı girinti düzeyine sahip olması gerekmez.

if deyimi şöyle çalışır: Önce if anahtar sözcüğünün yanındaki ifadenin değeri hesaplanır. Bu değer bool türüne dönüştürülür (Sıfır dışı değerler True olarak sıfır değeri False olarak) sonra bu ifade True ise if deyiminin doğruysa kısmındaki suite çalıştırılır, False ise yanlışsa kısmındaki suite çalıştırılır. Örneğin:


Burada son rint deyiminin if dışında olduğuna dikkat ediniz.

Örneğin:


Burada ikinci derece bir denklemin kökleri bulunmuştur.

Şimdi ise üç sayının en büyüğünü ekrana yazdıran bir Python programı yazalım:

Ayrık koşulları else-if biçiminde ele almak iyi tekniktir. Örneğin bir sayının pozitif negatif ya da sıfır olduğunu anlamaya çalışalım.



Döngü Deyimleri (Loop Statements)

Bir grup deyimin yinelemeli olarak çalıştırılmasını sağlayan kontrol deyimlerine döngü (loop) denilmektedir. Program aslında çalışma zamanının çoğunu döngülerde geçirir. Python'da iki çeşit döngü vardır: while döngüleri ve for döngüleri. Python’daki while döngülerinde kontrol başta yapılır. Ayrıca Pyton’da kontrolün sonda yapıldığı while döngüleri (dowhile döngüleri) yoktur.

 

 

while Döngüleri

while döngüleri bir koşul sağlandığı sürece yinelenmeye yol açar. Genel biçimi şöyledir:

while <koşul>: <suite >

[ else: <suit>]

while döngüsü şöyle çalışır: Her yinelemede while anahtar sözcüğünün yanındaki ifadenin değeri hesaplanır. Bu değer bool türüne dönüştürülür. Eğer ifadenin değeri True ise suit içerisindeki deyimler sırasıyla çalıştırılır, False ise döngü sonlandırılır. Döngü sonlandığında eğer döngüden break deyimi ile çıkılmamışsa döngünün else kısmındaki suit de çalıştırılır.


Biz bir listenin tüm elemanlarını while döngüsü ile tek tek ekrana yazdırabiliriz. Örneğin:

for Döngüleri

Python'da artırımlı for döngüleri yoktur. Python'daki for döngüleri diğer dillerdeki foreach döngüleri gibi çalışmaktadır. Python'da for döngüleri yalnızca dolaşılabilir (itrerable) nesnelerle kullanılabilir. Bu durumda her yinelenmede dolaşılabilir nesnenin sıradaki elemanı dönü değişkenine atanır sonra döngüyü oluşturan deyimler çalıştırılır. Dolaşma işlemi bittiğinde döngü de biter.

for döngülerinin genel biçimi şöyledir:

for <değişken> in <dizilim>: <suit>

[else:<suit>]

Daha açık bir anlatımla Python'daki for döngüleri şöyle çalışmaktadır: in anahtar sözcüğünün sağındaki dolaşılabilir nesnenin sıradaki elemanı döngü değişkenine atanır, sonra döngü deyimleri çalıştırılır. Bu böyle devam eder. Dolaşılabilir nesnenin elemanları bitince döngü de sonlanmış olur. Tıpkı while döngülerinde olduğu gibi for döngülerinin de else kısmı vardır. Bu else kısmı döngüden break deyimi ile çıkılmamışsa döngü bitince çalıştırılmaktadır.

Örneğin:


Tabii for döngüsüyle dolaştığımız nesnenin elemanlarının aynı türden olması zorunlu değildir. Python dinamik tür sistemine sahip olduğuna göre her dolaşımda döngü değişkeninin türü de nesnenin o elemanının türü ile aynı olacaktır.

Örneğin:


Python'da while ve for döngülerinin else kısımları eğer döngüden break deyimi ile çıkılmışsa çalıştırılmaz. Pekiyi neden break ile çıkıldığında döngülerin else kısımları çalıştırılmamaktadır? Bazen döngünün kendi kendine sonlanması ile break ile sonlandırılması arasında programcı açısından farklılık oluşalabilmektedir. İşte bu farklılıktan programcı lehine faydalanılmak istenmiştir. Örneğin bir liste içerisinde bir değeri sıralı olarak aradığımızı düşünelim (gerçi list sınıfının böyle bir metodu vardır). Eğer liste bittiği halde biz aradığımız değeri bulamamışsak başarısız olduğumuz sonıcunu çıkarabiliriz. Tabii aradığımız değeri bulursak break ile döngüden çıkarız:


Pyton'da Switch-Case Deyimi Yoktur

Pek çok programlama dilinde bir ifadenin çeşitli sayısal değerine göre değişik işlemleri yapabilmek için switch-case deyimleri vardır. Ancak Python'da böyle bir deyime gerek görülmemiştir. Python'da sözlükler zaten switch-case benzeri bir kullanım olanağı sunmaktadır. Her ne kadar daha fonksiyon tanımlaması yapmamış olsak da aşağıdaki örnek bir fikir verebilecektir:


pass Deyimi

C, C++, Java ve C# gibi dillerde yalnızca ';' boş deyim anlamına gelmektedir. Python'da girintili bir yazım biçimi olduğu için boş deyimler pass isimli anahtar sözcükle temsil edilmişlerdir. Örneğin biz bir fonksiyonun, for ya da while döngülerinin içerisinde hiçbir şey yapmak istemeyebiliriz. Bu durumda oraya bir deyim olarak pass yerleştirilmelidir.

Örneğin:

for k in range(10):

for i in range(10000000):

pass

print(k)

yalnızca döngülerde değil suit gereken her yerde (örneğin fonksiyon ve sınıf tanımlamalaında) pass deyimini kullanabiliriz.

 

Koşul Operatörü

Python'da da tıpkı C, C++, Java ve C#'ta olduğu gibi bir koşul operatörü vardır. Koşul operatörü if deyimi gibi çalışır fakat bir değer üretir. Genel biçimi şöyledir:

<ifade1> if <bool türden ifade> else <ifade2>

Koşul operatörü bir operatör olduğu için bir değer üretir. Önce if ile else anahtar sözcüklerinin arasındaki ifadenin değeri hesaplanır. Bu ifade Bool türüne dönüştürülür. Eğer bu ifade True ise if anahtar sözcüğünün solundaki ifade, False ise else anahtar sözcüğünün sağındaki ifade çalıştırılır.

Koşul operatörü düşük öncelikli bir operatördür. Dolayısıyla bunun sonucu üzerinde işlem yapabilmek için paranteze alınması gerekir. Örneğin:


Fonksiyonların Tanımlanması

Şimdiye kadar biz yalnızca var olan (yani başkaları tarafından yazılmış olan) fonksiyonları çağırdık. Şimdi biz de fonksiyon yazacağız. Bir fonksiyonun yazımına Python referans kitaplarında "fonksiyonun tanımlanması (function definitions)" denilmektedir. Fonksiyon tanımlama işleminin genel biçimi şöyledir:

def <fonksiyon ismi>([parametre listesi]): <suit>

Örneğin:

def foo():

   print('I am foo')

Burada fonksiyonun ismi foo olarak verilmiştir. Fonksiyonun herhangi bir parametresi yoktur.

Python'da fonksiyon tanımlamaları da birer deyim statüsündedir. Python yorumlayıcısı bir fonksiyonun tanımlandığını gördüğünde onun kodlarını saklar. Fonksiyon çağrıldığında o kodları çalıştırır. Yani bir fonksiyon tanımlandığında henüz onun kodları çalıştırılmamaktadır. Fonksiyon çağrıldığında onun kodları çalıştırılır.

 

Fonksiyonların Parametre Değişkenleri

Fonksiyonların parametreleri söz konusu olabilir. Python dinamik tür sistemine sahip olduğu için parametreler bildirilirken tür belirtilmez. Parametrelerin yalnızca isimleri parametre parantezinin içerisine aralarına ',' atomu yerleştirilerek yazılmaktadır. Örneğin:

def foo(a, b, c): print(a); print(b); print(c)

Tıpkı normal değişkenlerde olduğu gibi paremtre değişkenleri için de bir tür bildiriminin yapılmadığına dikkat ediniz. Parametrelerin türleri fonksiyonun hangi türden argümanlarla çağrıldığına bağlı olarak programın çalışma zamanı sırasında değişebilmektedir. Örneğin:

def foo(x):

   print(type(x))

 

foo(10)

foo(20.2)

foo('Mehmet')

 

 

Modüller ve Modüllerin Import Edilmesi

Python'da .py uzantılı Python kaynak dosyaları aynı zamanda bir modül (module) belirtmektedir. Yani her yazdığımız script dosyası aslında bir modüldür. Bir modül dosyasının içerisinde program kodları da olabilir, sınıflar, fonksiyonlar ve değişkenler de olabilir. Örneğin biz a.py isimli bir Python script dosyasını çalıştıracak olalım. Bu dosya da b.py isimli bir Python dosyasındaki fonksiyonları kullanacak olsun. İşte bunun için bizim a.py içerisinde b.py modülünü import etmemiz gerekir.

import etme sırasında bazı Python yorumlayıcıları bazı hazırlık işlemlerini de yapmaktadır. Örneğin CPython ve diğer bazı yorumlayıcılar import işlemi sırasında kaynak dosyadaki kodları daha hızlı ele almak için onalrı bir çeşit ara koda dönüştürmektedir.

import Pyton'da bir deyim statüsündedir. Genel biçimi şöyledir:

import <dosya ismi> [as <isim>] [, <dosya ismi> [as <isim>], <dosya ismi> [as <isim>] , ...>]

Örneğin:

import a

import b, c as d

import a as b, b as c

 

Bir Modülü Import Etmekle Çalıştırmak Arasındaki Fark

Bir Python modülü komut satırından ya da IDE'den çalıştırılabileceği gibi import işlemiyle de çalıştırılabilmektedir.

İşte bizim bazen bir modülün nasıl çalıştırıldığını bilmemiz gerekebilir. Çünkü biz doğrudan yorumlayıcı ile çalıştırmada bir şey import ile çalıştırmada başka bir şey yapmak isteyebiliriz. Bir modülün doğrudan yorumlayıcı ile mi çalıştırıldığı yoksa import deyimiyle mi çalıştırıldığı built-in __name__ isimli değişkene bakılarak belirlenir. Eğer bu değişken modülün ismini veriyorsa bu durumda ilgili modül import ile çalıştırılmıştır.

Eğer bu değişken "__main_" ismini veriyorsa bu durumda modül doğrudan yorumlayıcı tarafından çalıştırılmıştır. __name__ değişkeni her zaman str türündendir. Örneğin test.py dosyasının içeriği şöyle olsun:

print(__name__)

Şimdi biz bu modülü python yorumlayıcısı ile çalıştırırsak. Sonuç şöyle olacaktır:

__main__

 

Python'da İsim Arama

İsim araması (name lookup) bir değişkenin hangi noktada hangi faaliyet alanlarında aranacağını belirtmektedir.

Python dinamik tür sistemine sahip olduğu için ve çalışma yorumlayıcılarla yapıldığı için isim araması da dinamik bir biçimde yapılmaktadır. Kullanılan bir değişken isminin yaratılmış olup olmadığına diğer dillerde olduğu gibi işin başında derleme aşamasında bakılmaz. Arama program akışı o değişkenin kullanıldığı noktaya geldiğinde yapılmaktadır.

Böylece değişkenin kullanıldığı noktada, önce bulunulan fonksiyon içerisinde sonra kapsayan fonksiyonlar içerisinde sonra da global alanda arama yapılmaktadır. Comprehension'lar ve lambda ifadeleri kendi faaliyet alanlarına sahiptir. Bu konu ileride ele alınacaktır. Örneğin:

def foo():

    print(a)             #geçerlidir

a = 10

foo()

 

Burada her ne kadar foo fonksiyonu tanımlanırken henüz a değişkeni yoksa da foo fonksiyonu çağrılıp akış foo içerisindeki a'nın kullanıldığı yere geldiğinde artık a değişkeni isim aramasında bulunacaktır. Ancak çağırma işlemi aşağıdaki gibi a'nın yaratılmasından önce yapısaydı error oluşurdu:

def foo():

    print(a)

foo()                    # hatalı

a = 10

 

Python'da Değişkenlerin Ömürleri

Python'da değişken ile nesne arasında farklılık vardır. Anımsanacağı gibi Python'da tüm değişkenler aslında nesnelerin adreslerini tutmaktadır.

Değişkenlerin bellekte yer kapladığı zaman aralığına ömür denilmektedir. Değişkenler süreki bellekte yerkaplamazlar. Programın çalışmasının belli bir aşamasında yaratılıp belli bir aşamasında yok edilirler. Python'da birglobal değişken akış o değişkene ilk kez değer atandığı noktada yaratılır. Program sonlanana kadar bellekte kalır.

Yerel değişkenler ise fonksiyon ya da metot çağrılıp onlara ilk kez değer atandığında yaratılırlar akış fonksiyondan ya da metotttan çıktığında otomatik olarak yok edilirler. Yani yerel değişkenler sürekli bellekte kalmazlar. Fonksiyon ya da bittiğinde onlar bellekten boşaltılırlar. Parametre değişkenleri de Python'da fonksiyon ya da metot çağrıldığında yaratılırlar. Fonksiyon ya da metot sonlandığında yok edilirler.

Yorumlar

Bu blogdaki popüler yayınlar

Python Uygulamaları

HTML Giriş