Arcade Türü Oyun Programlamayı
ve Bilgisayar Bilimleri ÖğreninChapter 14: Kütüphaneler ve Modüller
Kütüphane, fonksiyon ve sınıfların toplanmış kodlarına denir. Çoğu kez, bu kütüphaneler farklı kişiler tarafından yazılır ve programcının "tekerleği yeniden icat etmemesi" için projeye dahil edilir. Python'da, kod kütüphanesini tarif etmek için kullanılan terim modül'dür.
import pygame ve import random'un kullanılmasıyla, programlar şu ana kadar zaten modülleri kullandı. Bir kütüphane import edilebilen birden çok modül içerebilir. Çoğu kez bir kütüphane sadece bir modüle sahiptir, yani bu kelimeler bazen birbirlerinin yerine kullanılabilir.
Modüller sık sık benzer işlevi olanlara göre gruplara yerleştirilirler. Bu derste, programlar zaten math modülünden, random modülünden ve pygame kütüphanesinden fonksiyonlar kullandılar. Modüller tek başlarına başka modülleri içerecek şekilde düzenlenebilirler. Örneğin, pygame modülü pygame.draw, pygame.image ve pygame.mouse alt modüllerini içerir.
Modüller program onlardan istemedikçe yüklenmezler. Bu, zaman ve bilgisayar hafızasından alan sağlar. Bu bölüm nasıl bir modül oluşturulacağını, ve bu modülün nasıl import edileceği ile kullanımını gösterecek.
14.1 Neden bir kütüphane oluşturulmalıdır?
Bir programcı için kendi kütüphanesini oluşturmasına neden olacak üç ana sebep vardır:
- Kodu küçük ve kullanımı kolay bölümlere ayırır.
- Aynı anda birden çok insanın bir program üzerinde çalışmasına izin verir.
- Yazılan kod kolayca diğer programcılarla paylaşılabilir.
Bu kitapta oluşturulan bazı programlar zaten oldukça uzun hale gelmeye başladılar. Geniş bir programı birkaç ufak programa bölerek kodun yönetimi kolaylaştırılabilir. Örneğin, önceki bölümde yer alan sprite örneğinde, programcı sprite sınıfını ayrı bir dosyaya aktarabilirdi. Karmaşık bir programda, her sprite kendi dosyasında barındırılabilir.
Birden çok programcı aynı proje üzerinde çalışıyorsa, tüm kodu tek bir dosyadayken bunu yapmak neredeyse imkansızdır. Ancak, programı birden çok parçaya bölerek, bu daha kolaylaşır. Bir programcı "Yaratık" sprite sınıfını geliştirir. Başka bir programcı "Gulyabani" sprite sınıfını geliştirir. Spritelar ayrı dosyalarda olduğu için, programcılar uyumsuzlukla karşılaşmazlar.
Modern programcılar programları nadiren başlangıçtan itibaren yaparlar. Çoğu kez programlar aynı işlevselliği paylaşan başka programların bölümlerinden yapılır. Bir programcı mortgage başvuru formuyla uğraşacak bir kod oluşturuyorsa, bu kod ideal olarak bir kütüphaneye gider. Daha sonra mortgage başvuru formunu yönetme ihtiyacı duyan herhangi bir başka program onu bu kütüphaneden çağırabilir.
14.2 Kendi modül/kütüphane dosyanızı oluşturun
Bazı programlar bir dosyada yönetilmek için çok uzun bir hal alabilir. Bu programları yönetilebilir tutmak için tek yol onları farklı dosyalara bölmektir. Alttaki örneğe bakın:
# Foo fonksiyonu def foo(): print ("foo!") # Foo'yu çağır foo()
Evet, bu program tek bir dosyada bulunmak için çok uzun değil. Fakat hem fonksiyon hem de ana program uzun olsaydı, durum farklı olurdu. Özellikle birkaç fonksiyon olsaydı. Bu örnek için, açık bir şekilde anlatabilmek için örneği kısa tutacağız.
foo fonksiyonunu bu dosyanın dışına taşıyabiliriz. Daha sonra bu dosya sadece ana program kodundan ibaret olacaktır. (Bu örnekte, nasıl yapılacağını öğrenmekten başka onları ayırmak için hiçbir sebep yoktur.)
Bunu yapabilmek için, yeni bir dosya oluşturun ve foo fonksiyonunu onun içine kopyalayın. Yeni dosyayı my_functions.py adıyla kaydedin.
# Foo fonksiyonu def foo(): print ("foo!")
# Çalışmayan foo fonksiyonu çağırılması foo()
Ne yazık ki olay bu kadar basit değil. Test.py dosyası my_functions.py dosyasına gidip bakacağını ve onu import edeceğini bilmiyor. Biz onu import etmeliyiz:
# my_functions.py dosyasını import et import my_functions # Foo fonksiyonunun çağırılması hala çalışmıyor foo()
Bu hala çalışmıyor. Kaçırdığımız şey ne? Tıpkı pygame'i import ederken yaptığımız gibi, fonksiyonun önüne paket adını koymak zorundayız. Şunun gibi:
# my_functions.py dosyasını import et import my_functions # Foo fonksiyonunun çağırılması çalışıyor my_functions.foo()
Bu my_functions fonksiyon çağırılmasının başına eklendiği için çalışır.
14.3 İsim Alanı (Namespace)
Bir program kullanımına ihtiyaç duyulacak iki kütüphane dosyasına sahip olabilir. Peki eğer kütüphaneler aynı isimde fonksiyonlara sahipse? Mesela:
def print_report(): print ("Öğrenci Not Raporu:" )
def print_report(): print ("Finansal Rapor:" )
Programa hangi fonksiyonu çağıracağını nasıl belirteceksiniz? Güzel, bu oldukça kolay. “namespace”i (isim alanını) belirteceksiniz. Namespace fonksiyon alttaki kodta fonksiyon isminden önce etkili olmuştur:
import student_functions import financial_functions student_functions.print_report() financial_functions.print_report()
Sonuç olarak şu an buna neden ihtiyaç duyulacağını görüyoruz. Fakat eğer siz isim çakışmaları yaşamayacaksanız ne olacak? Her namespace'i her seferinde yazmak yorucu olabilir. Kütüphaneyi "yerel isim alanına" (local namespace) import ederek bundan kurtulabilirsiniz. Yerel isim alanı bir isim alanı ile belirtmediğiniz fonksiyonların, değişkenlerin ve sınıfların listesidir. foo örneğine dönüo, orijinal import'u kaldıralım ve onu yeni import türüyle değiştirelim:
# import foo from my_functions import * foo()
Bu fonksiyon çağırmaların başına my_functions. eklenmeden bile çalışıyor. Bu yıldız my_functions'tan bütün fonksiyonları import edecek bir genel arama karakteridir. Programcı istese bunlardan istediklerini teker teker fonksiyon ismini belirterek import edebilirdi.
14.4 Üçüncü Parti Kütüphaneler
Python ile çalışırken, Python'a gömülü gelen çok sayıda kütüphaneyi kullanmak mümkündür.
Burda mevcut bütün kütüphaneler yer alıyor, biz göz atın:
http://docs.python.org/modindex.html
Başka kütüphaneleri indirmek ve yüklemek mümkündür. Web ile, karmaşık sayılarla, veritabanlarıyla ve daha fazlasıyla çalışan kütüphaneler vardır.
- Pygame: Oyun yapmak için kullanılan kütüphane. http://www.pygame.org/docs/
- wxPython: Pencereler, menüler ve daha fazlasıyla GUI programları oluşturmak için. http://www.wxpython.org/
- pydot: Karmaşık yönlü veya yönsüz grafikler oluşturur http://code.google.com/p/pydot/
- NumPy: Matrislerle çalışmak için gelişmiş modül. http://numpy.scipy.org/
14.5 Tekrar
Sınıflar, kütüphaneler ve modüller hakkındaki bu çalışma kağıdını doldurmaya çalışın:
classes_libraries_and_modules_worksheet.docx (MS Word 2007+)
classes_libraries_and_modules_worksheet.doc (MS Word before 2003)
classes_libraries_and_modules_worksheet.pdf (PDF)
- Python kütüphanesi nedir? Python modülü nedir?
- Programcının kendi kütüphane dosyasını oluşturması için olan sebeplerden birkaçı nelerdir?
- Kütüphane dosyalarını import etmek için Python'da iki yol vardır.
- Her birine birer örnek verin.
- Kütüphanenin import edilme şekline göre fonksiyonların ve sınıfların çağırılması nasıl değişir?
- Kütüphane dosyaları farklı kütüphane dosyalarını import edebilir mi?
- İlk olarak, kodu kağıda yazmayı deneyin. Daha sonra bilgisayara yazın.
- Tür ve vurma puanları niteliklerine sahip bir Canavar() sınıfı oluşturun. Canavarın türünü ve kaç kez vurduğunu ekrana yazdıran bir yazdir() metodu oluşturun.
- "Yaratik" ve "Gulyabani" isimli alt sınıfları oluşturun. "Yaratik" veya "Gulyabani" için tür değerini atayan __init__ bir fonksiyonu oluşturun. Ayrıca, Gulyabani için vurma sayısını 5-10 arası rastgele bir sayı ve Yaratik için 15-30 arasında rastgele bir sayı olarak belirleyin.
- Canavarların bir listesini oluşturun ve listeye birkaç yaratık ve gulyabani ekleyin. Daha sonra yazdir() metodunu listedeki her öğe için çağırın.
- Bir önceki labda yer alan programı alın. Onun bir kopyasını yapın. Sınıfları ve
fonksiyonları başka bir dosyaya ayırın.
You are not logged in. Log in here and track your progress.
Copyright © 2017
English version by Paul Vincent Craven
Spanish version by Antonio Rodríguez Verdugo
Russian version by Vladimir Slav
Turkish version by Güray Yildirim
Portuguese version by Armando Marques Sobrinho and Tati Carvalho
Dutch version by Frank Waegeman
Hungarian version by Nagy Attila
Finnish version by Jouko Järvenpää
French version by Franco Rossi
Korean version by Kim Zeung-Il
Chinese version by Kai Lin