Python'a Giriş

Prelude

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

Eşlik eden bir MOOC kursu arıyorsanız Udacity ve Coursera'nın kurslarını (programlamaya giriş [başlangıç seviyesi] veya Python'a giriş) deneyin. Son olarak, videoları izlemeden kendi hızınızda ilerleyebileceğiniz online eğitimler arıyorsanız bu yayının sonuna doğru listelenenleri deneyin. Bu eğitimlerde hem öğrenme içerikleri hem de pratik yapabileceğiniz etkileşimli bir Python yorumlayıcısı bulunur. Bahsettiğimiz "yorumlayıcı" nedir? Bir sonraki bölümde öğreneceksiniz.

Dil Tanıtımı

Python, dinamik ve yorumlanan (bayt kodu derlenmiş) bir dildir. Kaynak kodda değişkenlerin, parametrelerin, işlevlerin veya yöntemlerin tür bildirimleri yoktur. Bu, kodu kısa ve esnek hale getirir ancak kaynak kodun derleme zamanı türü kontrolünü kaybedersiniz. Python, çalışma zamanında tüm değerlerin türlerini izler ve çalışırken mantıklı olmayan kodları işaretler.

Python kodunun nasıl çalıştığını görmek için Python yorumlayıcısını çalıştırmak ve kodu doğrudan yorumlayıcıya yazmak mükemmel bir yöntemdir. "list'ye int eklersem ne olur?" gibi bir sorunuz olursa ne olacağını görmek için bu soruyu Python yorumlayıcısına yazmanız hızlı ve muhtemelen en iyi yöntemdir. (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 yazdıktan sonra ve >>> isteminden önce python'ın yazdırdığı iki satır, kullandığınız python sürümü ve nerede oluşturulduğu hakkında bilgi verir. Yazdırılan ilk şey "Python 3." olduğu sürece bu örnekler sizin için çalışır.

Yukarıda görebileceğiniz gibi, değişkenler ve operatörlerle deneme yapmak kolaydır. Ayrıca, kod bir değere atanmamış bir değişkeni okumaya çalışırsa yorumlayıcı bir çalışma zamanı hatası oluşturur (Python dilinde "raise" olarak adlandırılır). C++ ve Java gibi Python da büyük/küçük harfe duyarlıdır. Bu nedenle "a" ve "A" farklı değişkenlerdir. Bir satırın sonu, bir ifadenin sonunu işaret eder. Bu nedenle Python, C++ ve Java'nın aksine her ifadenin sonunda noktalı virgül gerektirmez. 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ül" olarak adlandırılır. Python modülü hello.py ile kodu çalıştırmanın en kolay yolu, kabuk komutu "python hello.py Alice" kullanmaktır. Bu komut, hello.py içindeki kodu çalıştırmak için Python yorumlayıcısını çağırır ve komut satırı bağımsız değişkeni "Alice"i iletir. Python'u komut satırından çalıştırırken kullanabileceğiniz tüm farklı seçenekler hakkında bilgi edinmek için resmi dokümanlar sayfasını inceleyin.

İşte çok basit bir hello.py programı (kod bloklarının, küme parantezleri yerine girinti kullanılarak kesin bir şekilde sınırlandırıldığına dikkat edin. Bu konuyla ilgili daha fazla bilgiyi ilerleyen bölümlerde 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 şu şekilde görünür:

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

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

Bir Python dosyasındaki veya "modüldeki" en dıştaki ifadeler, tek seferlik kurulumunu yapar. Bu ifadeler, modül bir yere ilk kez içe aktarıldığında yukarıdan aşağıya doğru çalışarak değişkenlerini ve işlevlerini ayarlar. Bir Python modülü doğrudan (yukarıdaki gibi python3 hello.py Bob) ç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__" adlı özel değişken "__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 standart kodun if __name__ ==... kullanılması yaygındır. Ancak modül başka bir modül tarafından içe aktarıldığında bu standart kod kullanılmaz.

Standart bir Python programında sys.argv listesi, komut satırı bağımsız değişkenlerini standart şekilde içerir. sys.argv[0] programın kendisi, sys.argv[1] ise ilk bağımsız değişkendir. argv veya bağımsız değişken sayısı hakkında bilgi sahibiyseniz yukarıdaki etkileşimli yorumlayıcı kodunda bir dizenin uzunluğunu isterken yaptığımız gibi len(sys.argv) ile bu değeri Python'dan isteyebilirsiniz. Genel olarak len(), bir dizenin uzunluğunu, listelerdeki ve demetlerdeki (dizi benzeri başka bir veri yapısı) öğe sayısını ve bir sözlükteki anahtar/değer çiftlerinin sayısını 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

Ayrıca, işlevi veya if ifadesini oluşturan satırların, aynı girinti düzeyine sahip olarak nasıl gruplandırıldığına da dikkat edin. Ayrıca, dizeleri tekrarlamanın 2 farklı yolunu da gösterdik. Bunlardan biri, daha kullanıcı dostu olan + operatörünü kullanmaktır. Ancak * operatörü de Python'ın "tekrar" operatörü olduğundan çalışır. Yani '-' * 10, '----------' sonucunu verir. Bu da ekranda "çizgi" oluşturmanın kolay bir yoludur. Kod yorumunda, * işaretinin + işaretinden daha hızlı çalıştığını belirtmiştik. Bunun nedeni, * işaretinin sonuçtaki nesnenin boyutunu bir kez hesaplaması, + işaretinin ise her çağrıldığında bu hesaplamayı yapmasıdır. Hem + hem de * operatörleri, sayılar ve dizeler (ve diğer veri türleri) için farklı anlamlara geldiğinden "aşırı yüklenmiş" operatörler olarak adlandırılır.

def anahtar kelimesi, işlevi parantez içindeki parametreleriyle ve girintili koduyla tanımlar. Bir işlevin ilk satırı, işlevin ne yaptığını açıklayan bir doküman dizesi ("docstring") olabilir. Docstring, 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ırnak" işaretleridir.) İşlevde tanımlanan değişkenler, o işlev için yereldir. 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, arayana döndürülen değer bu bağımsız değişkendir.

Aşağıda, yukarıdaki repeat() işlevini çağıran ve döndürdüğü değeri yazdıran bir 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" yürütülerek tanımlanmalıdır. Çağırdığı işlevlerin üzerinde olduğu dosyanın alt kısmında bir main() işlevi tanımlamak yaygın bir uygulamadır.

Girinti

Python'daki alışılmadık özelliklerden biri, bir kod parçasının boşluk girintisinin anlamını etkilemesidir. Bir işlevi oluşturan ifadeler gibi mantıksal ifade bloklarının tümü, üst işlevlerinin veya "if" ifadesinin girintisiyle aynı girintiye sahip olmalıdır. Bir gruptaki satırlardan birinde farklı bir girinti varsa bu satır, söz dizimi hatası olarak işaretlenir.

Python'da boşluk kullanımı ilk başta biraz garip gelebilir ancak mantıklıdır ve çok hızlı bir şekilde alışırsınız. TAB tuşunu kullanmaktan kaçının. Bu tuş, girinti düzenini büyük ölçüde karmaşıklaştırır (TAB tuşunun farklı platformlarda farklı anlamlara gelebileceğini de unutmayın). Düzenleyicinizi, Python kodu için TAB yerine boşluk ekleyecek şekilde ayarlayın.

Yeni başlayanların sıkça sorduğu sorulardan biri "Kaç boşluk girerek girinti oluşturmalıyım?"dır. Resmi Python stil kılavuzuna (PEP 8) göre, 4 boşlukla girinti oluşturmanız gerekir. (İlginç bilgi: Google'ın dahili stil kılavuzunda 2 boşluk girintileme yapılması gerektiği belirtilir.)

Çalışma Zamanında Kontrol Edilen Kod

Python, derleme sırasında çok az kontrol yapar ve her satırdaki tür, ad vb. kontrollerinin neredeyse tamamını 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'daki komik durum ise çalışma zamanındaki ad "Guido" olmadığı sürece bu kodun derlenip sorunsuz bir şekilde çalışmasıdır. Yalnızca bir çalıştırma gerçekten repeeeet() işlevini yürütmeye çalıştığında böyle bir işlevin olmadığını fark eder ve hata verir. Bu snippet'te ikinci bir hata da var. Ad, "Guido" ile karşılaştırılmadan önce bir değer atanmamış. Python, atanmamış bir değişkeni değerlendirmeye çalışırsanız "NameError" hatası verir. Bunlar, bir Python programını ilk kez çalıştırdığınızda göreceğiniz ilk hatalardan bazılarının basit yazım hataları veya başlatılmamış değişkenler olacağını gösteren ö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 ödünleşmedir).

Python 3'te tür ipuçları kullanıma sunuldu. 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, açıklamalı işlev def is_positive(n: int) -> bool: içinde, bağımsız değişken n bir int ve dönüş değeri bir bool'dir. Bu türlerin ne anlama geldiğine daha sonra değineceğiz. Ancak 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ı giderek artacaktır. Hatta kodu düzenlerken argümanlar önerebilir ve doğrulayabilir. Bu eğitimde tür ipuçları ele alınmayacak ancak bu ipuçlarını duyarsanız veya görürseniz farkında olmanızı istiyoruz.

Değişken Adları

Python değişkenlerinin kaynak kodunda herhangi bir türü belirtilmediğinden, neler olduğunu hatırlamak için değişkenlerinize anlamlı adlar vermek çok faydalıdır. Bu nedenle, tek bir ad varsa "name", ad listesi varsa "names", demet listesi varsa "tuples" kullanın. Birçok temel Python hatası, her değişkende hangi tür değerin olduğunu unutmaktan kaynaklanır. Bu nedenle, değişken adlarınızı (gerçekten sahip olduğunuz tek şey) işleri düzgün tutmanıza yardımcı olması için kullanın.

Gerçek adlandırma konusunda bazı diller, "birden fazla kelimeden" oluşan değişken adları için alt çizgiyle_ayrılmış_bölümleri tercih ederken diğer diller camelCase'i tercih eder. Genel olarak Python, alt çizgi yöntemini tercih eder ancak geliştiricileri, bu stili zaten kullanan mevcut Python koduna entegre ederken camelCase'i kullanmaya yönlendirir. Okunabilirlik önemlidir. Daha fazla bilgi için PEP 8'deki adlandırma kuralları bölümünü inceleyin.

Tahmin edebileceğiniz gibi "if" ve "while" gibi anahtar kelimeler değişken adı olarak kullanılamaz. Bu anahtar kelimeleri kullanırsanı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şkenlerini geçersiz kılarsınız. Yerleşik işlevler anahtar kelime olmadığından yeni Python geliştiricileri tarafından yanlışlıkla kullanılabilir.

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

"def foo()" işlevini içeren "binky.py" adlı bir modülünüz olduğunu varsayalım. Bu foo işlevinin tam nitelikli adı "binky.foo" olur. Bu şekilde, çeşitli Python modülleri işlevlerini ve değişkenlerini istedikleri gibi adlandırabilir ve değişken adları çakışmaz. Örneğin, module1.foo, module2.foo'dan farklıdır. Python sözlüğünde, binky, module1 ve module2'nin her birinin kendi "ad alanları" olduğunu söyleriz. Ad alanları, tahmin edebileceğiniz gibi değişken adı-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ümüz vardır. "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" de bir ad alanına sahiptir.)

  import sys

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

Şuna benzeyen başka bir içe aktarma formu var: "from sys import argv, exit". Bu, argv ve exit() işlevlerinin kısa adlarıyla kullanılabilmesini sağlar. Ancak, bir işlevin veya özelliğin nereden geldiğini belirlemek çok daha kolay olduğundan tam nitelikli adlara sahip orijinal biçimi kullanmanızı öneririz.

Python yorumlayıcısının standart kurulumuyla birlikte gelen birçok modül ve paket vardır. Bu nedenle, bunları kullanmak için ek bir işlem yapmanız gerekmez. Bunlara toplu olarak "Python Standart Kitaplığı" adı verilir. Sık kullanılan modüller/paketler şunlardır:

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

Tüm Standart Kitaplık modüllerinin ve paketlerinin dokümanlarını http://docs.python.org/library adresinde bulabilirsiniz.

Online yardım, help() ve dir()

Python ile ilgili yardım alabileceğiniz çeşitli yöntemler vardır.

  • "python listesi" veya "python dizesi küçük harf" gibi "python" kelimesiyle başlayan bir Google araması yapın. İlk sonuç genellikle cevaptır. Bu teknik, Python'da diğer dillerden daha iyi çalışıyor gibi görünüyor.
  • Resmi Python belgeleri sitesi olan docs.python.org'da yüksek kaliteli belgeler bulunur. Bununla birlikte, birkaç kelimelik bir Google aramasının genellikle daha hızlı olduğunu düşünüyorum.
  • Ayrıca, özellikle Python ve/veya programlama konusunda yeni olanlar için tasarlanmış bir resmi Tutor posta listesi de vardır.
  • 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öntemlerle ilgili doküman dizelerini getirir. Bu doküman dizeleri, Java'daki javadoc'a benzer. dir() işlevi, bir nesnenin özelliklerinin neler olduğunu gösterir. Aşağıda, yorumlayıcıdan help() ve dir() işlevlerini çağırmanın bazı yolları verilmiştir:

  • help(len): Yerleşik len() işlevi için yardım dizesi. İşlevin çağrılması olan "len()" değil, "len" olduğunu unutmayın. Bu, istemediğimiz bir durumdur.
  • help(sys): sys modülü için yardım dizesi (önce import sys yapılmalıdır)
  • dir(sys): dir(), help()'ye benzer ancak tanımlanmış sembollerinin veya "özelliklerinin" kısa 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() işlevini, söz konusu nesnenin kendisiyle veya nesnenin bir örneğiyle ve özelliğiyle birlikte çağırabilirsiniz. Örneğin, help('xyz'.split) numarasına yapılan arama, help(str.split) numarasına yapılan aramayla aynıdır.
  • help(list): list nesneleri için yardım dizesi
  • dir(list): Yöntemleri de dahil olmak üzere list nesne özelliklerini gösterir.
  • help(list.append): list nesneleri için append() yöntemiyle ilgili yardım dizesi