# 10. Standart Kütüphanenin Özeti

## 10.1. İşletim Sistemi Arayüzü

`os` modülü, işletim sistemiyle etkileşim kurmak için düzinelerce fonksiyon sağlar:

    >>> import os
    >>> os.getcwd()      # Return the current working directory
    'C:\\Python311'
    >>> os.chdir('/server/accesslogs')   # Change current working directory
    >>> os.system('mkdir today')   # Run the command mkdir in the system shell
    0

`from os import *` yerine `import os` stilini kullandığınızdan emin olun. Yanlış kullanım olan ilk stili tercih etmek, `os.open()` ‘ın çok daha farklı çalışan gömülü `open()` fonksiyonunu gölgelemesine neden olur.

Gömülü `dir()` ve `help()` fonksiyonları `os` gibi büyük modüllerle çalışma konusunda interaktif yardımcılar olarak kullanışlıdır:

    >>> import os
    >>> dir(os)
    <returns a list of all module functions>
    >>> help(os)
    <returns an extensive manual page created from the module's docstrings>

Günlük dosya ve dizin yönetimi görevleri için `shutil` modülü kullanımı daha kolay olan daha yüksek düzeyli (higher level) bir arayüz sağlar:

    >>> import shutil
    >>> shutil.copyfile('data.db', 'archive.db')
    'archive.db'
    >>> shutil.move('/build/executables', 'installdir')
    'installdir'

## 10.2. Dosya Joker Karakterleri

`glob` modülü , klasör joker karakter aramalarından dosya listeleri oluşturabilmek için bir fonsiyon sağlar:

    >>> import glob
    >>> glob.glob('*.py')
    ['primes.py', 'random.py', 'quote.py']

## 10.3. Komut Satırı Argümanları

Ortak yardımcı programların, çoğunlukla komut satırı argümanlarını işlemeleri gerekir. Bu argümanlar `sys` modülünün argv özelliğinin içinde liste olarak saklanır. Örneğin `python demo.py one two three` dosyasını çalıştırdığınız zaman vereceği çıktı:

    >>> import sys
    >>> print(sys.argv)
    ['demo.py', 'one', 'two', 'three']

`argparse` modülü, komut satırı argümanlarını işlemek için daha sofistike bir yöntem sağlar. Aşağıdaki program, bir veya birden fazla dosya adını ve isteğe bağlı görüntülenecek satır sayısını ayıklar:

    import argparse

    parser = argparse.ArgumentParser(
        prog='top',
        description='Show top lines from each file')
    parser.add_argument('filenames', nargs='+')
    parser.add_argument('-l', '--lines', type=int, default=10)
    args = parser.parse_args()
    print(args)

Komut satırında `python top.py --lines=5 alpha.txt beta.txt` çalıştırıldığı zaman program, `args.lines` ögesini `5` ve `args.filenames` ögesini `['alpha.txt', 'beta.txt']` olarak ayarlar.

## 10.4. Hata Çıktısının Yeniden Yönlendirilmesi ve Programın Sonlandırılması

`sys` modülü ayrıca stdin, stdout ve stderr özelliklerine sahiptir. İkincisi, stdout yeniden yönlendirilmiş olsa bile bunları görünür hale getirmek için uyarılar ve hata iletileri yayımlamak için yararlıdır:

    >>> sys.stderr.write('Warning, log file not found starting a new one\n')
    Warning, log file not found starting a new one

Bir programı sonlandırmak için, en kısa yol olan `sys.exit()` komutunu kullanın.

## 10.5. String Örüntü Eşlemesi

`re` modülü, gelişmiş string işleme için kurallı ifade araçları sağlar. Karmaşık eşleme ve manipülasyon için, kurallı ifadeler kısa ve optimize edilmiş çözümler sunar:

    >>> import re
    >>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
    ['foot', 'fell', 'fastest']
    >>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
    'cat in the hat'

Basit işlemlerde “string” metodu önerilir çünkü okuması ve hata ayıklaması daha kolaydır:

    >>> 'tea for too'.replace('too', 'two')
    'tea for two'

## 10.6. Matematik

`math` modülünün içindeki C kütüphanesi ondalıklı matematik fonksiyonlarına erişim sağlar:

    >>> import math
    >>> math.cos(math.pi / 4)
    0.70710678118654757
    >>> math.log(1024, 2)
    10.0

`random` modülü rastgele seçimler yapmak için araçlar sağlar:

    >>> import random
    >>> random.choice(['apple', 'pear', 'banana'])
    'apple'
    >>> random.sample(range(100), 10)   # sampling without replacement
    [30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
    >>> random.random()    # random float
    0.17970987693706186
    >>> random.randrange(6)    # random integer chosen from range(6)
    4

`statistics` modülü sayı içeren veriler için temel istatistiksel özellikleri hesaplar (ortalama, ortanca, fark, vb.):

    >>> import statistics
    >>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
    >>> statistics.mean(data)
    1.6071428571428572
    >>> statistics.median(data)
    1.25
    >>> statistics.variance(data)
    1.3720238095238095

SciPy projesi <https://scipy.org> sayısal hesaplamalar için daha fazla modül içerir.

## 10.7. İnternet Erişimi

İnternete bağlanmak ve internet protokollerini işlemek için bazı modüller var. Bunlardan en basit ikisi; `urllib.request` URL’lerden veri çekmek, ve `smtplib` ise mail göndermek için:

    >>> from urllib.request import urlopen
    >>> with urlopen('http://worldtimeapi.org/api/timezone/etc/UTC.txt') as response:
    ...     for line in response:
    ...         line = line.decode()             # Convert bytes to a str
    ...         if line.startswith('datetime'):
    ...             print(line.rstrip())         # Remove trailing newline
    ...
    datetime: 2022-01-01T01:36:47.689215+00:00

    >>> import smtplib
    >>> server = smtplib.SMTP('localhost')
    >>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
    ... """To: jcaesar@example.org
    ... From: soothsayer@example.org
    ...
    ... Beware the Ides of March.
    ... """)
    >>> server.quit()

(İkinci örnek için bir mail sunucusunun localhost’ta çalışması gerektiğini unutmayın.)

## 10.8. Tarihler ve Saatler

`datetime` modülü, tarihleri ve saatleri hem basit hem de karmaşık şekillerde işlemek için sınıflar sağlar. Tarih ve saat aritmetiği desteklenirken, uygulamanın odak noktası çıktı biçimlendirmesi ve düzenlemesi için verimli üye ayıklamadır. Modül ayrıca saat dilimi farkında olan nesneleri de destekler.

    >>> # dates are easily constructed and formatted
    >>> from datetime import date
    >>> now = date.today()
    >>> now
    datetime.date(2003, 12, 2)
    >>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
    '12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

    >>> # dates support calendar arithmetic
    >>> birthday = date(1964, 7, 31)
    >>> age = now - birthday
    >>> age.days
    14368

## 10.9. Veri Sıkıştırma

Genel veri arşivleme ve sıkıştırma formatları şu modüller tarafından desteklenir: `zlib`, `gzip`, `bz2`, `lzma`, `zipfile` ve `tarfile`.

    >>> import zlib
    >>> s = b'witch which has which witches wrist watch'
    >>> len(s)
    41
    >>> t = zlib.compress(s)
    >>> len(t)
    37
    >>> zlib.decompress(t)
    b'witch which has which witches wrist watch'
    >>> zlib.crc32(s)
    226805979

## 10.10. Performans Ölçümü

Bazı Python kullanıcıları, aynı soruna farklı yaklaşımların göreli performansını bilmek konusunda derin bir ilgi geliştirir. Python, bu soruları hemen yanıtlayan bir ölçüm aracı sağlar.

Örneğin, argümanları değiştirmek için geleneksel yaklaşım yerine dizi paketleme ve açma özelliğini kullanmak cazip olabilir. `timeit` modülü hızla sade bir performans avantajı gösterir:

    >>> from timeit import Timer
    >>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
    0.57535828626024577
    >>> Timer('a,b = b,a', 'a=1; b=2').timeit()
    0.54962537085770791

`timeit` ‘in ince ayrıntı düzeyinin aksine, `profile` ve `pstats` modülleri, daha büyük kod bloklarında zaman açısından kritik bölümleri tanımlamak için araçlar sağlar.

## 10.11. Kalite Kontrolü

Yüksek kalitede yazılımlar geliştirmek için her fonksiyon için testler yazılmalıdır ve bu testler geliştirirken sık sık çalıştırmalıdır.

`doctest` modülü, bir modülü taramak ve bir programın docstrings’ine gömülü testleri doğrulamak için bir araç sağlar. Test yapısı, sonuçlarıyla birlikte tipik bir çağrıyı docstring’e kesip yapıştırma kadar basittir. Bu, kullanıcıya bir örnek sunarak dokümantasyonu geliştirir ve doctest modülünün kodun dokümantasyona göre doğru olduğundan emin olmasını sağlar:

    def average(values):
        """Computes the arithmetic mean of a list of numbers.

        >>> print(average([20, 30, 70]))
        40.0
        """
        return sum(values) / len(values)

    import doctest
    doctest.testmod()   # automatically validate the embedded tests

`unittest` modülü, `doctest` modülü gibi çaba istemeyen bir modül değildir ama daha geniş kapsamlı test setlerinin ayrı dosyalarda sağlanmasına imkân verir:

    import unittest

    class TestStatisticalFunctions(unittest.TestCase):

        def test_average(self):
            self.assertEqual(average([20, 30, 70]), 40.0)
            self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
            with self.assertRaises(ZeroDivisionError):
                average([])
            with self.assertRaises(TypeError):
                average(20, 30, 70)

    unittest.main()  # Calling from the command line invokes all tests

## 10.12. Bataryalar Dahildir

Python’un “bataryalar dahil” felsefesi vardır. Bu , büyük paketlerin en iyi şekilde sofistike ve sağlam kapabiliteleriyle görülür. Mesela:

- `xmlrpc.client` ve `xmlrpc.server` modülleri, uzak işlem grubu çağrılarını uygulamayı neredeyse önemsiz bir görev haline getirir. Modül adlarına rağmen, XML’nin doğrudan bilgisine veya işlenmesine gerek yoktur.

- `email` paketi e-mail mesajlarını işlemek için bir kütüphanedir.MIME ve diğer RFC 2822-tabanlı mesajların dökümanlarını içerir. Mesaj gönderip alan `smtplib` ve `poplib` ‘in aksine, e-mail paketinin derleme işlemini, kompleks mesaj yapılarının (ekler dahil) decode edilebilmesini sağlayan, internet encode işlemini ve header protokollerini uygulamak için geniş kapsamlı bir toolkit’e sahiptir.

- `json` paketi, bu popüler veri değişim biçimini ayrıştırmak için sağlam destek sağlar. `csv` modülü, genellikle veritabanları ve elektronik tablolar tarafından desteklenen Virgülle-Ayrılmış Değer biçimindeki dosyaların doğrudan okunmasını ve yazılmasını destekler. XML işleme `xml.etree.ElementTree`, `xml.dom` ve `xml.sax` paketleri tarafından desteklenir. Birlikte, bu modüller ve paketler Python uygulamaları ve diğer araçlar arasındaki veri değişimini büyük ölçüde basitleştirir.

- `sqlite3` modülü , SQLite veritabanı kütüphanesi için bir wrapper’dır. Biraz standart dışı SQL syntax’ları kullanılarak güncellenebilen ve erişilebilen kalıcı bir veritabanı sağlanabilir.

- Uluslararasılaştırma `gettext`, `locale` ve `codecs` paketi dahil olmak üzere bir dizi modül tarafından desteklenir.