Python’un Benzersiz Özellikleri Nelerdir? — Bölüm 1

Cahit Barkin Ozer
10 min readFeb 3, 2024

--

Bilmeniz gereken Python’ın benzersiz özelliklerinin üzerinden geçelim.

Created with Bing AI

For English:

TIOBE endeksine göre Python, Haziran 2020'den bu yana en popüler dil oldu. Guido van Rossum tarafından geliştirilen ve ilk olarak 1991 yılında piyasaya sürülen, üst düzey, yorumlanan, genel amaçlı bir programlama dilidir.

Python, Windows, Linus, Apple iOS ve Google OS işletim sistemleriyle uyumlu, nesne yönelimli bir programlama (OOP) dilidir. Sağlam bir çekirdek standart kütüphanesine, Python Ekosistemi’nin parçası olan birçok açık kaynak çerçeveye ve kütüphaneye sahiptir, basit bir genel amaçlı programlama dilidir ve birim testini destekler.

Python, verilerin çalışma zamanında değiştirilebilir bir nesne olarak saklanabildiği ve oluşturulduktan sonra değiştirilmesine olanak tanıyan, dinamik olarak yazılan bir dildir.

Python, şeyleri adlandırmak için tanımlayıcıları kullanır. Bir tanımlayıcı, A (veya a) ila Z (veya z) harfiyle veya bir alt çizgi (_) ve ardından bir sıfır, ek harfler, alt çizgiler veya herhangi bir rakamla (0 ila 9) başlar. Örnekler arasında soyadı, _soyadı, soyadı_1 vb. yer alır. 14. İlkel değişkenler için oldukça önemlidir. Bunlar en temel veri yapılarıdır, dolayısıyla “ilkel” adları vardır. Yalnızca bir değeri saklayabilirler. Python Kodu için PEP 8 Stil Kılavuzu’nda belirtilen Python adlandırma kurallarına uyun. Bu belge koleksiyonu Python standartlarını, kod organizasyonunu ve geliştirmedeki en iyi uygulamaları tartışmaktadır.

Python’daki İlkel Veri Yapıları

İlkel veri yapıları, dilin yalnızca bir değeri saklayabilen yerleşik veri yapılarıdır. Bunlara tamsayılar, kayan değerler, dizeler ve boolean’lar dahildir. Burada belirli türler sağlanmış olmasına rağmen bunları beyan etmiyorsunuz; Python yorumlayıcısı çalışma zamanında değişkenin türünü belirler.

Python’da İlkel Olmayan Veri Yapıları

Python’da, ilkel olmayan veri yapıları hem sıralanmış hem de sıralanmamış nesne dizilerini temsil eder. Bunlar listeleri, tuple’ları, sözlükleri, kümeleri ve dondurulmuş kümeleri içerir. Değiştirilebilir bir nesne oluşturulduktan sonra değiştirilebilir, ancak değişmez bir nesne değiştirilemez. Tamsayı, kayan nokta, Boolean, metin ve tuple gibi yerleşik nesneler değişmezdir. Liste, set ve sözlük gibi diğer yerleşik nesneler değiştirilebilir.

Dize (String) Manipülasyonu

Python dize nesneleri değişmezdir. Bir dizeden bir karakter elde edebilirsiniz ancak onu değiştiremezsiniz.

print(string_value[5]) # valid
string_value[5] = "m" # not valid

Fonksiyon

Fonksiyon, belirli bir görevi tamamlamak için tasarlanmış, yeniden kullanılabilen bir kod parçasıdır. Genel olarak bilgisayar programlamada fonksiyon yazmanın amacı, gerektiği kadar çağrılabilecek bir alt program oluşturmaktır. Bu, mümkün olan her yerde kod tekrarını azaltacaktır. Fonksiyonlar, sınıf nesnelerinin birincil bileşenleridir (bazı dillerin aksine, sınıflar olmasa bile var olabilirler) ve adlarının Python adlandırma standardına uygun olması gerekir.

Python üç tür fonksiyon kullanır:

  1. Python yorumlayıcıları yerleşik fonksiyonları içerir. Örneğin, “print()” herhangi bir nesneyi konsola yazdırır.
  2. Kullanıcı tanımlı fonksiyonlar, kullanıcılar tarafından özel yazılım gereksinimlerini karşılamak üzere oluşturulur.
  3. Anonim fonksiyonlar isimsiz tanımlanır. Anonim fonksiyonlar “lambda” anahtar sözcüğüyle tanımlanır. Genel olarak Python’da bu fonksiyolar daha hızlıdır.

Python, modülleri, fonksiyonları ve sınıfları, yorumlarda olduğu gibi belgelemek için “docstring” terimini (üç tırnak içindeki metin) kullanır. Bir “docstring”, bir modül, fonksiyon veya sınıf içindeki ilk ifade olarak görünen bir dize değişmezidir.

Python Parametre Geçiş Türü: Varsayılan olarak Python, parametreleri referans olarak iletir ve diğer diller gibi çıktı parametrelerini desteklemez. Değere göre geçiş yapmak için, gerçek parametre değerinin bir kopyası bellekte oluşturulur. Bir geçiş referansı (adrese göre) oluştuğunda, orijinal parametrenin adresinin bir kopyası korunur.

Python’da if __name__ == ‘__main__’ ifadesi, modül adının yerleşik __main__ değişkeniyle eşleşip eşleşmediğini belirler. Modüle bu satırdan sonra başlaması talimatını verir. Herhangi bir Python programına olağan main ifadesini kullanarak başlamak iyi bir programlama uygulamasıdır.

Bazen varsayılan parametre değerinin ne olduğunu bilemezsiniz. Bazı durumlarda, “Hiçbiri” anahtar sözcüğü boş bir değer belirtmek veya hiçbir değer belirtmemek için kullanılabilir. Hiçbirinin 0, False, Null veya boş bir dizeyle eşanlamlı olmadığını unutmamak çok önemlidir. Hiçbiri ayrı bir veri türü değil.

Yöntemin aşırı yüklenmesi, iki veya daha fazla fonksiyonun aynı adı paylaşması ancak farklı girdi bağımsız değişkenlerine sahip olması durumunda meydana gelir. Python, fonksiyonun aşırı yüklenmesini destekler. Gerekli görevleri yerine getirmek için birden fazla fonksiyonu kullanmak yerine, her şeyi tek bir fonksiyonda toplayabilir, böylece kod miktarını önemli ölçüde azaltabilirsiniz.

Not: Sınıfa ait fonksiyonlara (function) yöntem (method) denir.

*args ve **kwargs: Bir fonksiyona aktarılacak girdi parametrelerinin tam sayısını bilemeyebiliriz. Bu örnekte aşağıdaki sözdizimini kullanın: tek yıldız işaretli parametreler *args veya çift yıldız işaretli **kwargs. *args değişken uzunluklu bir argüman listesini fonksiyona iletmek için kullanıldığından, çağıran fonksiyona gerektiği kadar parametre iletebiliriz. Çift yıldız seçeneği **kwargs bu fonksiyona değişken uzunluklu bir sözlük yapısını aktarmak için kullanılabilir.

Değişken Kapsamları

Programda bir adın (değişkenin) tanımlandığı yere kapsam denir. Python’un iki tür değişken kapsamı vardır.

  1. Yerel değişkenler, bir fonksiyon içinde tanımlanan herhangi bir değişkeni ifade eder.
  2. Global değişkenler, fonksiyonun dışında tanımlanan herhangi bir değişkeni ifade eder. Fonksiyon içinde global bir anahtar kelime kullanılırsa değişken programın tamamı için global hale gelir. Global değişken bildirimleri artık Python’da yaygın olarak kullanılmamaktadır.

İç İçe Fonksiyonlar (Nested Functions)

İç içe geçmiş bir fonksiyon başka bir fonksiyonun içinde tanımlanır. İç içe fonksiyon, çevreleyen fonksiyonun değişkenlerine salt okunur olarak erişebilir. Yuvalanmış fonksiyonda bu değişkenlerden herhangi birinin değerini değiştirmek için, bunların yerel olmayan anahtar sözcükle açıkça tanımlanması gerekir.

İç içe fonksiyonlar çok yaygın değildir ancak aşağıdaki amaçlarla kullanılırlar:

  1. Kapsülleme (Encapsulation): Bir fonksiyonun kapsamı, kapsadığı fonksiyonla sınırlandırılabilir. Bu, ilgili işlemleri gruplandırmak ve genel ad alanının kirlenmesini önlemek için kullanışlı olabilir.
  2. İç içe geçmiş fonksiyonlar , kodu mantıksal olarak düzenlemenize yardımcı olabilir. Bir fonksiyon diğeriyle yakından ilişkili olduğunda, onu daha büyük olan fonksiyonun içine yerleştirmek uygundur.
  3. Kapanış(closure): İç fonksiyonlar, dış fonksiyonun yürütülmesi bittikten sonra bile çevreleyen fonksiyonun değişkenlerine erişebilir. Bu, döndürüldüğünde kapsamlarının durumunu koruyan fonksiyonlar olan kapanışları yazmanıza olanak tanır.
  4. Okunabilirlik ve Bakım Yapılabilirlik: Yuvalama fonksiyonları , ilgili fonksiyonları bir arada tutmanıza olanak tanıyarak kodun okunmasını ve bakımını kolaylaştırır.

İç fonksiyonun kendisini döndürmesini ve dış fonksiyona bir referans oluşturmasını gerektirmediğiniz sürece iç fonksiyonu dışarıdan çağıramazsınız.

def outer_function():
def inner_function():
print("Inside inner function")
return inner_function

my_function = outer_function()

# Call the inner function from outside
my_function()

Lambda Functions (Lambda Fonksiyonları)

Lambda fonksiyonları bir isme sahip olmadıkları için anonim fonksiyonlar olarak bilinirler. Return ifadesi her zaman bir değer döndürdüğü için gerekli değildir. Bu fonksiyonları kullanmanın en etkili yolu başka bir standart def fonksiyonudur. Lambda fonksiyonları genellikle fonksiyonun çok basit olduğu ve tek satırda yazılabildiği durumlarda tercih edilir.

# Regular function
def square(x):
return x ** 2

# Equivalent lambda function
square_lambda = lambda x: x ** 2

# Using the functions
print(square(5)) # Output: 25
print(square_lambda(5)) # Output: 25

Lambda fonksiyonları genellikle kısa, anonim bir fonksiyon gerektiren durumlarda (map(), filter() veya sorted() gibi) kullanılır. İşte birkaç örnek:

numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x**2, numbers))
print(squared_numbers) # Output: [1, 4, 9, 16, 25]

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # Output: [2, 4, 6, 8, 10]

pairs = [(1, 5), (3, 2), (8, 6)]
sorted_pairs = sorted(pairs, key=lambda pair: pair[1])
print(sorted_pairs) # Output: [(3, 2), (8, 6), (1, 5)]

Akış Kontrolü

realpython.com

Bunlara zaten aşina olduğunuzu varsayarak while döngüleri, for döngüleri, if-else ifadeleri vb. gibi temel akış kontrol öğelerini atlayacağım. Python, diğer çeşitli dillerden (C ve Java gibi) farklı olarak yerleşik bir do-while döngüsü içermez. Sonunda koşullu bir kontrol bulunan bir while döngüsü kullanarak benzer fonksiyonellik elde edebilirsiniz. “Aralık(başlatma, durdurma, adım)” fonksiyonu , kaç yinelemenin gerçekleştirileceğini belirtmenize olanak tanır.

Döngülerinizin daha hızlı çalışmasını nasıl sağlayabilirsiniz?

  • Vektörleştirilmiş İşlemleri Kullanma

Element bazında dizi işlemleri yaparken mümkün olduğunca numpy veya pandas kullanın.

import numpy as np

# Example: Element-wise multiplication of two arrays
a = np.array([1, 2, 3, 4, 5])
b = np.array([6, 7, 8, 9, 10])

result = a * b # Vectorized operation

print(result)
  • Döngüler İçinde Fonksiyon Çağrılarını En Aza İndirme
def square(x):
return x ** 2

numbers = [1, 2, 3, 4, 5]
squared_numbers = [square(num) for num in numbers] # Function call inside loop

# Good practice: Compute outside loop
squared_numbers = [num ** 2 for num in numbers] # Avoids function call inside loop
  • Liste Kapsamlarını (List Comprehensions) Kullanma
# List comprehension for generating squares of numbers
numbers = [1, 2, 3, 4, 5]
squared_numbers = [num ** 2 for num in numbers] # List comprehension
  • Belleği Ön Tahsis Etme
# Preallocate memory for a large list
size = 1000000
result = [0] * size # Preallocate memory

# Use result in a loop
for i in range(size):
result[i] = i * 2
  • Yerleşik Fonksiyonları Kullanma
# Example: Using map() for applying a function to a list
numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x ** 2, numbers))
  • Yineleyicileri (Iterators) Kullanma
# Example: Using range() as an iterator
for i in range(1000000): # Use iterator instead of list
pass
  • Cython veya Numba’yı kullanma
# Example using Numba for just-in-time compilation
from numba import jit

@jit
def square(x):
return x ** 2

result = square(5) # Just-in-time compiled function

Girdi/Çıktı

realpython.com

“input()” fonksiyonu, yazılımın kullanıcıyla etkileşime girmesini sağlar. Kullanıcının girdiği verileri görüntülemek için “print()” fonksiyonunu kullanılabilir.

Dosya GÇ

Verileri okumak ve yazmak için dosyaları Python’da açıyoruz. “open(mode, [buffering])” fonksiyonunda tanımlanan erişim modu, dosyayla ilgili eylemi belirler.

Modlar şunlardır:

  • “r” modu yalnızca dosyaları okumak için kullanılır.
  • “w” modu, bir dosyanın düzenlenmesine ve yeni bilgilerin eklenmesine olanak tanır, ancak aynı adla mevcut tüm dosyaları siler.
  • “a” ekleme modu, dosyanın sonuna yeni veriler ekler. Yeni bilgiler otomatik olarak sona eklenir.
  • “r+”, eş zamanlı dosya işlemlerine izin veren okuma ve yazma modunu ifade eder.

Bir dosyaya yazmak için “write()” fonksiyonunu kullanın.

file_test = open("test.txt", "w")
file_test.write( "Python is a great language.\nSure!\n")
file_test.close()

Uygulama, test.txt dosyasının yazıldığı yerden çalışır. Gördüğünüz gibi, oluşturulan dosya nesnesi “file_test”, bellek kaynaklarını boşaltmak için kapatılmalıdır.

Tüm materyalin bir dosyadan alınması:

file_test = open("test.txt", "r")
print(file_test.read())

Tüm malzemeleri satır satır alıyorum.

file_test = open("test.txt", "r")
for item in file_test:
print(item)

Bir dosyadan bir satır döndürmek istiyorsanız “readline()” yöntemini kullanın. Bu yöntemin standart sözdizimi “file.readline(size)” olup, “size” parametresi isteğe bağlıdır. Döndürülecek satırdaki bayt sayısını belirtir. Varsayılan sayı -1'dir ve satırın tamamını belirtir.

file_test = open("test.txt", "r")
lines = file_test.readline(6)

Python’da dosyalarla çalışmak, konum yollarının bilinmesini gerektirir. Python, dosyalar ve yollarla çalışmak için bir “pathlib” paketi sunar. Bu kitaplığı kullanmak için, yol veya dosya adının “Path()” nesnesine eğik çizgilerle sağlanması gerekir.

from pathlib import Path

# Define the file path
file_path = Path("path/to/your/file.txt")

# Check if the file exists
if file_path.exists():
print("File exists.")

# Read the contents of the file
with open(file_path, "r") as file:
content = file.read()
print("File content:")
print(content)
else:
print("File does not exist.")

Dosyanın amaçlanan arabellek boyutu, “open(mode, [buffering])” fonksiyonundaki isteğe bağlı “buffering” argümanı ile belirtilir. 0, ara belleğe alma olmadığını, 1 satır arabelleğe aldığını belirtir ve diğer herhangi bir pozitif değer, kabaca bu boyutta (bayt cinsinden) bir arabelleğin kullanılması gerektiğini belirtir. Negatif ara belleğe alma, sistem varsayılanının kullanılması gerektiğini gösterir. Belirtilmediği takdirde sistem varsayılanı kullanılacaktır.

Logging in Python

realpython.com

Print() üretim kodunda kullanılmamalıdır; bunun yerine günlüğe kaydetmeyi kullanın. Verilerin uygun yerlere kaydedilmesi, hataları kolayca teşhis etmenize ve gelecekteki iyileştirmeler için program performansını analiz etmenize olanak tanır. genel olarak veriler metin dosyaları ve/veya veritabanı tabloları olarak depolanır. Verileri Python’da günlüğe kaydetmek için yerleşik günlük modülünü yüklemek üzere “günlüğü içe aktar” ifadesini kullanın.

Günlük seviyeleri

Günlük mesajları beş düzeyde olay önem derecesi içerir:

  • DEBUG: Bu, geliştirme ve hata ayıklama sırasındaki mesajları günlüğe kaydeder. Genellikle değişkenlerin ve fonksiyonların dönüş değerlerini görüntülemek için kullanılır.
  • INFO komutu programla ilgili her türlü bilgiyi kaydeder.
  • WARNING: Uyarı mesajlarını kaydetmek için kullanılır. Genellikle programın yürütülmesi sırasında meydana gelebilecek önleyici bilgileri tanımlamak için kullanılır.
  • ERROR: Program çalışırken oluşan hataları bildirir. Genel olarak bu mesajlar, hata kod satırı, sorunun tarihi ve saati, sorunun oluştuğu fonksiyon ve modül dosya adları vb. gibi belirli hata bilgilerini içerir.
  • CRITICAL: Bu, kritik hataları günlüğe kaydeder. Genel uygulama çökmelerini tespit etmek için yaygın olarak kullanılır.

Temel Konfigürasyon

Bu düzeyler temel yapılandırma yöntemi basicConfig(**kwargs)’de belirtilir. Bu yöntemin argümanları aşağıdaki gibidir:

  • level: Olayın önem düzeyi (DEBUG, INFO, WARNING, ERROR, and CRITICAL).
  • file name: Bu dosya yolu ve adıdır.
  • filemode: Bir dosya adı belirtilirse dosya bu modda açılır. Varsayılan değer, eklemeyi temsil eden a’dır.
  • format: Mesaj formatıdır.

Örnek:

import logging

logging.basicConfig(filename="app.log", filemode="w", format="%(name)s
- %(levelname)s - %(message)s")
logging.warning("This message gets logged as warning.")

Modüller ve Paketler

Modül, fonksiyonları , sınıfları ve değişkenleri belirtebilen Python kodunu içeren bir dosyadır. Modüler programlama, büyük programlama görevlerini daha küçük, daha yönetilebilir alt birimlere veya modüllere ayırma tekniğidir. Bireysel modüller, büyük kurumsal iş sistemleri oluşturmak için yapı taşları olarak birleştirilebilir. Bu tür programlamanın aşağıdaki avantajları vardır:

  • Basitlik: Bir modül genellikle programın küçük bir alanına odaklanır. Bu, geliştirmeyi, hata ayıklamayı ve test etmeyi çok daha kolaylaştırır.
  • Bakım Kolaylığı: Programın tamamını etkilemeden modüller kolayca güncellenebilir ve yeni özellikler eklenebilir. Bu, ekip üyeleri arasında daha fazla işbirliğine olanak sağlayacaktır.
  • Yeniden kullanılabilirlik, bir modülde üretilen fonksiyonelliğin programın diğer alanlarında nasıl kolayca yeniden kullanılabileceği anlamına gelir. Bu, gereksiz kod ihtiyacını ortadan kaldırır.
  • Kapsam Belirleme Modülleri, programın farklı bölümlerindeki tanımlayıcılar arasındaki çakışmaları önlemek için genellikle ayrı ad alanları olarak tanımlanır.

Importlib.reload(), Python’u yeniden başlatmadan tek bir modülün kodunu yeniden yüklemenize olanak tanır. Mymodule’da değişiklik yaparsanız ve bu değişiklikleri Python betiğinizi veya yorumlayıcınızı yeniden başlatmadan uygulamak istiyorsanız, importlib.reload() fonksiyonunu aşağıdaki gibi kullanın:

import importlib
import mymodule

importlib.reload(mymodule)

Modül ve paket: Python’da modül,.py uzantılı bir kod dosyasıdır. Modüller, koddan harici aramalar yaparak kodu yeniden kullanmak için kullanılır. Paket, bir veya daha fazla Python modülünü içeren bir klasör olarak tanımlanır. Bir paket, modül ad alanlarını hiyerarşik olarak düzenlemek için bir modülde kullanılır veya nokta gösterimi kullanılarak kodun üst kısmına aktarılabilir.

--

--

Cahit Barkin Ozer
Cahit Barkin Ozer

Written by Cahit Barkin Ozer

Üretken YZ başta olmak üzere teknoloji alanındaki yenilikleri öğrenip sizlerle paylaşıyorum. Youtube Kanalım: https://www.youtube.com/@cbarkinozer

No responses yet