Akademik Bilişim 2017 Gnu/Linux sistemler için Python - 1. Gün


        Bu yıl 'Bilişimin kalbi Aksaray'da atacak'. Aksaray Üniversitesi'nin ev sahipliği yaptığı Akademik Bilişim öncesindeki dört gün sürecek olan kurslardan; Gnu/Linux Sistemler için Python adlı kursa meslektaşım İrem Şendur ile birlikte dahil olduk. Bu kurs boyunca öğrendiğim bilgileri buradan paylaşmayı planlıyorum. Eksiklerim ve hatalarım muhakkak vardır, düzeltirseniz sevinirim.

        Bu kursun amacı; katılımcıların, uçbirimde çalışabilen, verimli bir şekilde; kullanıcı, işletim sistemi ve diğer işlemler ile iletişim kurabilen, standart linux arabirimleri ile entegre olan betikler ve uygulamalar yazabilmesiydi.

        İlk gün genel olarak, basit betikler ile başladık. Python ve Gnu/Linux bilgisi ön şart olsa bile temel birkaç konu anlatıldı. Daha sonra veri giriş çıkışları ile çalıştık, standart giriş çıkış ve dosya okuma, yazma işlemlerinden sonra öğrendiklerimizi deneyebildiğimiz bir uygulama ile günü sonlandırdık. Bundan sonraki kısım derste tuttuğum ve eksikleri istihza'dan tamamladığım notlarımdan oluşuyor.


        Python'da Veri Türleri:
  • String: Bir veya daha fazla karakterden oluşan öğelere karakter dizisi (string) adı verilir. Bir değişkene atamak istenilen string değeri ya çift tırnak(“) yada tek tırnak (‘) içinde yazılmalıdır. Hangisi tırnak türüyle başlandıysa onunla bitirilmelidir.
  • Integer: Tam sayılara integer adı verilir.
  • Float: Kayan noktalı gerçek sayıları ifade eder.
  • Complex: Kompleks sayıları ifade eden veri türüdür.

         Python'da Veri Depolama Türleri:
  • Listeler:
    • Listeler veri tipinden bağımsız verileri tutmaya yarayan depolama türüdür.
    • Listeleri tanımlamak için köşeli parantez kullanılır.
    • Birden fazla öğe virgülle ayrılır.
  • Demetler:
    • İçerisinde farklı veri tiplerini barındıran kapsayıcı bir veri tipidir.
    • Normal parantez '()' kullanarak veya hiç parantez kullanılmadan da tanımlanabilir.
    • Birden fazla öğe virgülle ayrılır.
    • Listelerden farkı; demetler değiştirilemezler yani ekleme ve çıkarma yapılamaz, bu yüzden hızlı çalışırlar.
    • Taşınma ve veriyi sabit tutma konusunda yararlıdır.
    • İki demet toplanabilir. Oluşan demet iki demetin toplam boyutu kadardır.
  • Sözlükler:
    • İçinde farklı veri tiplerini barındıran, kapsayıcı bir veri tipidir.
    • Küme parantezi ile tanımlanırlar.
    • Anahtar (key) ve değer (value) çifti olarak tutulur.
    • Sıralama yoktur. Her çağrılışta farklı sırada gelebilirler.
        Lambda:
  • Anonim fonksiyon olarak geçer.
  • İsimleri bulunmaz.
  • Kullanılmaları çok fazla önerilmez.

Buraya kadar olan kısım etkileşimli kabukta örneklendirildi:
Python 3.4.3 (default, Mar 26 2015, 22:03:40) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> s = "mirac"
>>> s1 = "kabatas"
>>> s + s1
'mirackabatas'
>>> s.split("r")
['mi', 'ac']
>>> s*5
'miracmiracmiracmiracmirac'
>>> s.join("mm")
'mmiracm'
>>> perimeter = "-"
>>> perimeter.join([s, s1])
'mirac-kabatas'
>>> ", ".join([s, s1])
'mirac, kabatas'
>>> "     test    "
'     test    '
>>> "     test    ".strip()
'test'
>>> t = ("ali", "veli", "ayse")
>>> t1 = ("13", 25, "mirac")
>>> t + t1
('ali', 'veli', 'ayse', '13', 25, 'mirac')
>>> _
('ali', 'veli', 'ayse', '13', 25, 'mirac')
>>> l = ["15", "a,", "ayse"]
>>> l1 = [4]
>>> l + l1
['15', 'a,', 'ayse', 4]
>>> l
['15', 'a,', 'ayse']
>>> l1
[4]
>>> l1.append("msi")
>>> l1
[4, 'msi']
>>> l1.pop(0)
4
>>> l1
['msi']
>>> l.index("ayse")
2
>>> l[0]
'15'
>>> l[-1]
'ayse'
>>> l[-2:] //-2. elemandan başla sonsuza kadar devam et
['a,', 'ayse']
>>> l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> l[3:7]
[4, 5, 6, 7]
>>> l[:2]
[1, 2]
>>> "".join(l1)
'msi'
>>> l[::]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> l[::-1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> d = {"akademik": "bilisim", "sedat": "ak", 3: "uc"}
>>> d.items()
dict_items([(3, 'uc'), ('sedat', 'ak'), ('akademik', 'bilisim')])
>>> d.keys()
dict_keys([3, 'sedat', 'akademik'])
>>> d.values()
dict_values(['uc', 'ak', 'bilisim'])
>>> d[5] ="bes"
>>> d
{3: 'uc', 'sedat': 'ak', 'akademik': 'bilisim', 5: 'bes'}
>>> d["self"] = d
>>> d
{3: 'uc', 'sedat': 'ak', 'self': {...}, 'akademik': 'bilisim', 5: 'bes'}
>>> del d[5]
>>> d
{3: 'uc', 'sedat': 'ak', 'self': {...}, 'akademik': 'bilisim'}

        Python'da Modüller:
Bazı işlevleri kolaylıkla yerine getirmeyi sağlayan birtakım fonksiyonları ve nitelikleri içinde barındıran araçlardır. İçerisinde __init__.py dosyası ve import edilebilirler.

        Okuma Yazma Standartları:
  • stdin: Programa veri girmeye yarar.
  • stdout: Çıktıların standart olarak verildiği konumdur. Python öntanımlı olarak, ürettiği çıktıları ekrana verir.
  • stderr: Standart hata konumudur. Hatalı çıktıları dosyaya yazdırmak için kullanılır.
import sys: Okuma yazma standartlarını kullanmak için sys modülü programa dahil edilmelidir.

Derste kullandığımız dizin yapısı:

ab2017/
    '-> gozcu/
        '-> __init__.py
    '-> run.py

run.py: Projenin başlangıç (giriş) noktasıdır.
gozcu/__init__.py: Modül oluşturuldu, import edilebilecek.

__init__.py:
import sys, os

def typed_input(typ, prompt = None, extra_tries = 3):
    for i in range(extra_tries + 1):
        veri = input(prompt)
        try:
            veri = typ(veri)
        except ValueError:
            print("Hatalı giriş")
        else:
            return veri
    else:
        raise TypeError("Girdi türü desteklenmiyor")

def ana_fonksiyon():
    #----------------------------------------------------------------------------
    #print("Bir karakter okuyacağız, bitince Ctrl-D kombinasyonu ya da enter tuşu ile stdin'i flushlayın")
    #veri = sys.stdin.read(1)
    #print("İşte o karakter: {}".format(veri))
    #----------------------------------------------------------------------------
    # temel_turleri_goster()
    #----------------------------------------------------------------------------
    #sys.stdout.write("Bir veri giriniz:")   #ekrana yazdırma
    #sys.stdout.flush()  # ekranı güncelle
    #veri = sys.stdin.readline()[:-len(os.linesep)]      #linesep: \n dir. Gelen veride aşağı satıra geç kaçış karakterini almak istemediğimiz için ekledik.
    #sys.stdout.write("Girdiğiniz veri: {}\n".format(veri))      # süslü parantez .format olmazsa sadece süslü parantez olarak kalır, birden fazla olduğunda süslü parantezlere isim verilmezse sırayla ekler
    #sys.stdout.write("Girdiğiniz verinin uzunluğu: {}\n".format(len(veri)))
    #sys.stdout.flush()
    #----------------------------------------------------------------------------
    #veri = input("Bir veri giriniz: ")
    #print("Girdiğiniz veri: {}".format(veri))
    #print("Girdiğiniz verinin uzunluğu: {}".format(len(veri)))
    #ty = str    # varsayılan olarak her şey string
    #for possible_ty in (int, float, complex):
    #    try:
    #        possible_ty(veri)
    #    except ValueError:
    #        continue
    #    else:
    #        ty = possible_ty
    #        break
    #print("Girdiğiniz verinin türü: {}".format(ty.__name__))
    #----------------------------------------------------------------------------
    veri = typed_input(int, "Bir sayı giriniz: ")
    print("Girdiğiniz veri: {}".format(veri))
    print("Girdiğiniz verinin türü: {}".format(int.__name__))

def temel_turleri_goster():gozcu/__init__.py: 
    s = "hello"
    i = 10
    f = 10.00000001
    t = (s, i, f)
    l = ["ali", 2.71, 3750000000, t, ana_fonksiyon]
    d = {"ismail": "ismhael",
         "gereksizler": l,
         "bin": 1000,
         55: "ellibeş"}
    la = lambda x, y: x ** y

        def calculate(self):
            return self.x ** self.y

    ins = c(2, 5)
    print(s, i, f, t, l, d, la, la(2,5), fn, fn(2, 5), c, ins, ins.calculate(),            sep="\n-----\n")
    def fn(x, y):
        return x ** y

    class c():
        def __init__(self, x, y):
            self.x = x
            self.y = y

        def calculate(self):
            return self.x ** self.y

    ins = c(2, 5)
    print(s, i, f, t, l, d, la, la(2,5), fn, fn(2, 5), c, ins, ins.calculate(), sep="\n-----\n")

run.py:
import sys
import gozcu

try:
    gozcu.ana_fonksiyon()
except Exception as e:    # Hata yakalandı ve e değişkenine atandı
    print("An error occured:", file=sys.stderr)     # stderr'e yazdırıldı
    print("{cls}({args})".format(cls=type(e).__name__, args=", ". join(e.args)), file=sys.stderr)    # hatanın ismi ve mesajı alındı ve stderr'e yazdırıldı
    exit(1)
else:
    exit(0)     #normal çıkış kodu