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.
