Python'a Giriş

Prelude

Google'ın Python online eğitimine hoş geldiniz. Bu kurs, şirket içinde sunulan giriş düzeyindeki Python kursuna dayanır. Kurulum sayfasında belirtildiği gibi, bu materyal Python 3'ü kapsar.

Tamamlayıcı bir MOOC kursu arıyorsanız Udacity ve Coursera’daki (programlamaya giriş [yeni başlayanlar] veya Python'a giriş) kurslarını deneyin. Son olarak, video izlemeden kendi hızınızda online eğitim almak istiyorsanız bu gönderinin sonundaki kaynakları deneyin. Bu kaynaklarda, öğrenme içeriğinin yanı sıra pratik yapabileceğiniz etkileşimli bir Python yorumlayıcısı da bulunur. Bahsettiğiniz "tercüman" nedir? Bunu bir sonraki bölümde öğreneceksiniz.

Dil Tanıtımı

Python dinamik, yorumlanan (bytecode derlenmiş) bir dildir. Kaynak kodunda değişken, parametre, işlev veya yöntem için tür bildirimleri bulunmuyor. Bu, kodu kısa ve esnek hale getirir ve kaynak kodunun derleme zamanındaki tür kontrolünü kaybedersiniz. Python, çalışma zamanında tüm değerlerin türlerini izler ve çalıştırıldığında anlamlı olmayan kodu işaretler.

Python kodunun nasıl çalıştığını öğrenmenin mükemmel bir yolu, Python yorumlayıcısını çalıştırıp doğrudan içine kod yazmaktır. "list değerine int eklersem ne olur?" gibi bir sorunuz varsa bunu Python yorumlayıcısına yazmanız, ne olacağını öğrenmenin hızlı ve muhtemelen en iyi yoludur. (Gerçekte ne olduğunu görmek için aşağıya bakın!)

$ python3        ## Run the Python interpreter
Python 3.X.X (XXX, XXX XX XXXX, XX:XX:XX) [XXX] on XXX
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 6       ## set a variable in this interpreter session
>>> a           ## entering an expression prints its value
6
>>> a + 2
8
>>> a = 'hi'    ## 'a' can hold a string just as well
>>> a
'hi'
>>> len(a)      ## call the len() function on a string
2
>>> a + len(a)  ## try something that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str
>>> a + str(len(a))  ## probably what you really wanted
'hi2'
>>> foo         ## try something else that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'foo' is not defined
>>> ^D          ## type CTRL-d to exit (CTRL-z in Windows/DOS terminal)

Python'u yazdıktan sonra ve >>> istemi gösterilmeden önce yazdırılan iki satır, kullandığınız Python sürümünü ve nerede derlendiği hakkında bilgi verir. Yazdırılan ilk şey "Python 3" olduğu sürece bu örnekler işinize yarayacaktır.

Yukarıda görebileceğiniz gibi, değişkenler ve operatörlerle deneme yapmak kolaydır. Ayrıca, kod bir değer atanmamış bir değişkeni okumaya çalışırsa yorumlayıcı bir çalışma zamanı hatası atar veya Python dilinde "yükseltir". C++ ve Java gibi Python da büyük/küçük harf duyarlı olduğundan "a" ve "A" farklı değişkenlerdir. Satırın sonu, bir ifadenin sonunu belirtir. Bu nedenle, C++ ve Java'dan farklı olarak Python'da her ifadenin sonuna noktalı virgül eklenmesi gerekmez. Yorumlar "#" ile başlar ve satırın sonuna kadar devam eder.

Python kaynak kodu

Python kaynak dosyaları ".py" uzantısını kullanır ve "modüller" olarak adlandırılır. hello.py adlı bir Python modülünü çalıştırmanın en kolay yolu, "python hello.py Alice" kabuk komutunu kullanmaktır. Bu komut, hello.py'teki kodu yürütmek için Python yorumlayıcısını çağırır ve "Alice" komut satırı bağımsız değişkenini iletir. Python'u komut satırından çalıştırırken kullanabileceğiniz tüm farklı seçenekleri öğrenmek için resmi dokümanlar sayfasına göz atın.

Çok basit bir hello.py programı aşağıda verilmiştir (Kod bloklarının, köşeli parantez yerine girinti kullanılarak sınırlandırıldığına dikkat edin. Bu konu hakkında daha fazla bilgiyi aşağıda bulabilirsiniz.):

#!/usr/bin/python3

# import modules used here -- sys is a very standard one
import sys

# Gather our code in a main() function
def main():
    print('Hello there', sys.argv[1])
    # Command line args are in sys.argv[1], sys.argv[2] ...
    # sys.argv[0] is the script name itself and can be ignored

# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
    main()

Bu programı komut satırından çalıştırmak aşağıdaki gibi görünür:

$ python3 hello.py Guido
Hello there Guido
$ ./hello.py Alice  ## without needing 'python3' first (Unix)
Hello there Alice

İçe aktarma işlemleri, komut satırı bağımsız değişkenleri ve len()

Bir Python dosyası veya "modül" içindeki en dıştaki ifadeler, bir defalık kurulumunu yapar. Bu ifadeler, modülün bir yere ilk aktarıldığında değişkenleri ve işlevleri ayarlanır. Bu ifadeler yukarıdan aşağıya doğru çalışır. Python modülü, python3 hello.py Bob yukarıda belirtildiği gibi doğrudan çalıştırılabilir veya başka bir modül tarafından içe aktarılıp kullanılabilir. Bir Python dosyası doğrudan çalıştırıldığında "__name__" özel değişkeni "__main__" olarak ayarlanır. Bu nedenle, modül doğrudan çalıştırıldığında bir main() işlevini çağırmak için yukarıda gösterilen şablon if __name__ ==...'ün kullanılması yaygındır ancak modül başka bir modül tarafından içe aktarıldığında bu şablon kullanılmaz.

Standart bir Python programında sys.argv listesi, komut satırı bağımsız değişkenlerini standart şekilde içerir. Bu listede sys.argv[0] programın kendisi, sys.argv[1] ilk bağımsız değişken vb. olur. argc veya bağımsız değişken sayısını biliyorsanız bu değeri Python'dan len(sys.argv) ile isteyebilirsiniz. Tıpkı yukarıdaki etkileşimli yorumlayıcı kodunda bir dizenin uzunluğunu istediğimizde yaptığımız gibi. Genel olarak len(), bir dizenin uzunluğunu, listelerdeki ve tuplalardaki (diziye benzer başka bir veri yapısı) öğe sayısını ve sözlükteki anahtar/değer çiftlerinin sayısını size söyleyebilir.

Kullanıcı Tanımlı İşlevler

Python'daki işlevler şu şekilde tanımlanır:

# Defines a "repeat" function that takes 2 arguments.
def repeat(s, exclaim):
    """
    Returns the string 's' repeated 3 times.
    If exclaim is true, add exclamation marks.
    """

    result = s + s + s # can also use "s * 3" which is faster (Why?)
    if exclaim:
        result = result + '!!!'
    return result

İşlevi veya if-ifadesini oluşturan satırların, aynı girinti düzeyine sahip olmalarına göre nasıl gruplandırıldığına da dikkat edin. Ayrıca, daha kullanıcı dostu olan + operatörünü kullanarak dizeleri tekrarlamanın 2 farklı yolunu sunduk. Ancak *, aynı zamanda Python'un "repeat" operatörü olduğundan işe yarar. '-' * 10, '----------' sayesinde ekranda "satır" oluşturmak için kullanışlı bir yöntem sunuyor. Kod yorumunda, * işlevinin + işlevinden daha hızlı çalıştığını belirtmiştik. Bunun nedeni, * işlevinin elde edilen nesnenin boyutunu bir kez hesaplamasıdır. + işlevinde ise bu hesaplama her çağrıldığında yapılır. Hem + hem de *, sayılar ve dizeler (ve diğer veri türleri) için farklı anlamlara sahip olduklarından "aşırı yüklenmiş" operatörler olarak adlandırılır.

def anahtar kelimesi, işlevi parantez içindeki parametreleriyle ve kodunun girintili olmasıyla tanımlar. Bir işlevin ilk satırı, işlevin ne yaptığını açıklayan bir doküman dizesi ("docstring") olabilir. Belge satırı tek satırlık veya yukarıdaki örnekte olduğu gibi çok satırlık bir açıklama olabilir. (Evet, bunlar Python'a özgü bir özellik olan "üçlü tırnaklardır".) İşlevde tanımlanan değişkenler o işleve özgüdür. Bu nedenle, yukarıdaki işlevdeki "sonuç", başka bir işlevdeki "sonuç" değişkeninden ayrıdır. return ifadesi bir bağımsız değişken alabilir. Bu durumda, bağımsız değişken arayana döndürülen değerdir.

Aşağıda, yukarıdaki repeat() işlevini çağıran ve döndürdüğü değeri yazdıran kod verilmiştir:

def main():
    print(repeat('Yay', False))      ## YayYayYay
    print(repeat('Woo Hoo', True))   ## Woo HooWoo HooWoo Hoo!!!

Çalışma zamanında, işlevler çağrılmadan önce "def" çalıştırılarak tanımlanmalıdır. main() işlevini, çağıracağı işlevlerle birlikte dosyanın alt kısmına tanımlamak yaygın bir uygulamadır.

Girinti

Python'un alışılmadık özelliklerinden biri, bir kod parçasının boşluk girintisinin anlamını etkilemesidir. Bir işlevi oluşturanlar gibi mantıksal bir ifade bloğunun tümü aynı girintiye sahip olmalıdır. Bu girinti, üst işlevin veya "if" ifadesinin girintisinden ayarlanır. Bir gruptaki satırlardan birinin girintisi farklıysa bu, söz dizimi hatası olarak işaretlenir.

Python'da boşluk kullanımı ilk başta biraz garip gelebilir ancak mantıklı bir kullanımdır ve çok çabuk alışırsınız. Girinti düzenini büyük ölçüde karmaşık hale getirdiğinden, SEKME'leri kullanmaktan kaçının (SEKME'ler farklı platformlarda farklı anlamlara gelebilir). Düzenleyicinizi, Python kodu için TAB yerine boşluk ekleyecek şekilde ayarlayın.

Yeni başlayanlar tarafından sıklıkla sorulan sorulardan biri "Kaç boşluk girsem gerekir?"dir. Resmi Python stil kılavuzuna (PEP 8) göre, girintiyi 4 boşlukla ayarlamanız gerekir. (Eğlenceli bilgi: Google'ın dahili stil yönergesine göre girintinin 2 boşluk olması gerekir.)

Çalışma Zamanında Kod Kontrol Edildi

Python, derleme sırasında çok az kontrol yapar ve her satırdaki neredeyse tüm tür, ad vb. kontrolleri satır çalıştırılana kadar erteler. Yukarıdaki main() işlevinin repeat() işlevini şu şekilde çağırdığını varsayalım:

def main():
    if name == 'Guido':
        print(repeeeet(name) + '!!!')
    else:
        print(repeat(name))

if ifadesi, repeat() işlevinin yanlışlıkla repeeeet() olarak yazıldığı açık bir hata içeriyor. Python'da komik olan şey, çalışma zamanındaki ad "Guido" olmadığı sürece bu kodun derlenip sorunsuz bir şekilde çalışmasıdır. Yalnızca çalıştırma gerçekten repeeeet() işlevini yürütmeye çalıştığında böyle bir işlev olmadığını fark edip hata verir. Bu snippet'te ikinci bir hata daha vardır. name, "Guido" ile karşılaştırılmadan önce bir değer atanmadı. Atanmamış bir değişkeni değerlendirmeye çalışırsanız Python, "NameError" hatası verir. Bu örnekler, bir Python programını ilk kez çalıştırdığınızda gördüğünüz ilk hatalardan bazılarının basit yazım hataları veya bu gibi başlatılmamış değişkenler olduğunu gösteren bazı örneklerdir. Bu, Java gibi daha ayrıntılı bir tür sistemine sahip dillerin avantajlı olduğu bir alandır. Bu tür hataları derleme zamanında yakalayabilirler (ancak elbette tüm bu tür bilgilerini korumanız gerekir. Bu bir değiş tokuştur).

Python 3, tür ipuçları özelliğini kullanıma sundu. Tür ipuçları, bir işlevdeki her bağımsız değişkenin türünü ve işlev tarafından döndürülen nesnenin türünü belirtmenize olanak tanır. Örneğin, def is_positive(n: int) -> bool: işlevinde n bağımsız değişkeni bir int ve dönüş değeri bir bool bağımsız değişkenidir. Bu türlerin ne anlama geldiğini daha sonra ele alacağız. Yine de tür ipuçları tamamen isteğe bağlıdır. Tür ipuçlarını kullanırsanız cider-v ve VS.code gibi bazı düzenleyiciler, işlevlerinizin doğru bağımsız değişken türleriyle çağrıldığını doğrulamak için kontroller çalıştırabilir. Bu nedenle, tür ipuçlarını kullanan kodların sayısının giderek arttığını göreceksiniz. Hatta siz kodu düzenlerken bağımsız değişkenler önerebilir ve doğrulayabilirler. Bu eğitim, tür ipuçlarını kapsamaz ancak bu ipuçlarından haberdar olursanız veya doğada gördüğünüzde bunları bildiğinizden emin olmak istiyoruz.

Değişken Adları

Python değişkenlerinin kaynak kodunda herhangi bir türü belirtilmediğinden, ne olduğunu hatırlatmak için değişkenlerinize anlamlı adlar vermeniz çok faydalıdır. Dolayısıyla, tek bir ad varsa "ad", ad listesi varsa "adlar" ve liste varsa "tuple" değerini kullanın. Birçok temel Python hatası, her değişkende ne tür bir değer olduğunun unutulmasından kaynaklanır. Bu nedenle, her şeyi doğru şekilde yapmak için değişken adlarınızı kullanın (sahip olduğunuz tek şey budur).

Gerçek adlandırmaya gelince, bazı diller "birden fazla kelimeden" oluşan değişken adları için underscored_parts'i tercih ederken diğer diller camelCasing'i tercih eder. Genel olarak Python, alt çizgi yöntemini tercih eder ancak geliştiricileri, bu stili zaten kullanan mevcut Python koduna entegre ettikleri zaman camelCasing'i erteleme konusunda yönlendirir. Okunabilirlik önemlidir. PEP 8'deki adlandırma kuralları bölümünde daha fazla bilgi edinebilirsiniz.

Tahmin edebileceğiniz gibi, "if" ve "while" gibi anahtar kelimeler değişken adı olarak kullanılamaz. Bunu yaparsanız söz dizimi hatası alırsınız. Bununla birlikte, yerleşik işlevleri değişken adı olarak kullanmamaya dikkat edin. Örneğin, "str", "list" ve "print" iyi adlar gibi görünse de bu sistem değişkenlerinin üzerine yazarsınız. Yerleşik öğeler anahtar kelime değildir ve bu nedenle, yeni Python geliştiricilerinin yanlışlıkla kullanmaya açıktır.

Modüller ve ad alanları hakkında daha fazla bilgi

"def foo()" içeren bir "binky.py" modülünüz olduğunu varsayalım. Bu foo işlevinin tam nitelikli adı "binky.foo" olur. Bu sayede, çeşitli Python modülleri işlevlerini ve değişkenlerini istedikleri gibi adlandırabilir ve değişken adları çakışmaz. module1.foo, module2.foo'dan farklıdır. Python'da, binky, module1 ve module2'nin her birinin kendi "alanı" olduğunu söyleriz. Tahmin edebileceğiniz gibi, bu alanlar değişken adı ile nesne bağlamalarıdır.

Örneğin, argv listesi ve exit() işlevi gibi bazı standart sistem olanaklarını içeren standart "sys" modülüne sahibiz. "import sys" ifadesiyle sys modülündeki tanımlara erişebilir ve bunları tam nitelikli adlarıyla (ör. sys.exit()) kullanılabilir hale getirebilirsiniz. (Evet, "sys"in de bir ad alanı vardır.)

  import sys

  # Now can refer to sys.xxx facilities
  sys.exit(0)

"from sys import argv, exit" şeklinde başka bir içe aktarma formu da vardır. Bu, argv ve exit() işlevlerini kısa adlarıyla kullanılabilir hale getirir; ancak, bir işlevin veya özelliğin nereden geldiğini belirlemek çok daha kolay olduğundan, tam nitelikli adlara sahip orijinal formu öneririz.

Python yorumlayıcının standart kurulumuyla birlikte gelen çok sayıda modül ve paket vardır. Bu nedenle, bunları kullanmak için fazladan bir şey yapmanız gerekmez. Bunlar topluca "Python Standart Kitaplığı" olarak bilinir. Sık kullanılan modüller/paketler şunlardır:

  • sys: exit(), argv, stdin, stdout vb. işlevlere erişim
  • re: normal ifadeler
  • os: işletim sistemi arayüzü, dosya sistemi

Standart Kitaplık'taki tüm modüllerin ve paketlerin dokümanlarını http://docs.python.org/library adresinde bulabilirsiniz.

Çevrimiçi yardım, help() ve dir()

Python ile ilgili yardım almak için çeşitli yöntemler vardır.

  • "python" kelimesiyle başlayan bir Google araması yapın (ör. "python list" veya "python string lowercase"). İlk isabet genellikle doğru yanıttır. Bu tekniğin Python'da diğer dillere göre daha iyi sonuç verdiği anlaşılıyor.
  • Resmi Python doküman sitesi olan docs.python.org'da yüksek kaliteli dokümanlar bulunur. Yine de genellikle birkaç kelimelik bir Google aramasının daha hızlı olduğunu düşünüyorum.
  • Ayrıca, Python ve/veya programlamaya yeni başlayanlar için özel olarak tasarlanmış bir resmi eğitmen posta listesi de mevcuttur.
  • Birçok soruyu (ve yanıtını) StackOverflow ve Quora'da bulabilirsiniz.
  • help() ve dir() işlevlerini kullanın (aşağıya bakın).

Python yorumlayıcısında help() işlevi, çeşitli modüller, işlevler ve yöntemler için doküman dizeleri getirir. Bu doküman dizeleri, Java'nın javadoc'una benzer. dir() işlevi, bir nesnenin özelliklerini belirtir. Yorumlayıcıdan help() ve dir() işlevlerini çağırmanın bazı yollarını aşağıda bulabilirsiniz:

  • help(len) — yerleşik len() işlevi için yardım dizesi. Bu dizenin "len()" değil, "len" olduğunu unutmayın. Bu, işleve bir çağrı olduğu için istemeyiz.
  • help(sys): sys modülü için yardım dizesi (önce bir import sys yapılmalıdır)
  • dir(sys): dir(), help() ile benzerdir ancak yalnızca tanımlanmış simgelerinin veya "özelliklerinin" hızlı bir listesini verir.
  • help(sys.exit): sys modülündeki exit() işlevi için yardım dizesi
  • help('xyz'.split): dize nesneleri için split() yönteminin yardım dizesi. help()'ü, ilgili nesnenin kendisi veya bu nesnenin bir örneği ile birlikte özelliğiyle birlikte çağırabilirsiniz. Örneğin, help('xyz'.split) çağrısı help(str.split) çağrısıyla aynıdır.
  • help(list): list nesneleri için yardım dizesi
  • dir(list): Yöntemleri dahil olmak üzere list nesne özelliklerini gösterir
  • help(list.append): list nesneleri için append() yönteminin yardım dizesi