logo

Python'da Sabit Türleri | Python'da Sabitin Önemi

Bu derste sabit türleri ve bunların kodun okunabilirliğini artırmaya nasıl yardımcı olduklarını öğreneceğiz. Eğer bilmiyorsanız sabitler, programın çalışması sırasında değişmeyen değerleri temsil eden adlardır. Programlamada en yaygın temel kavramdırlar. Ancak Python'un sabitleri tanımlamak için özel bir sözdizimi yoktur. Genel olarak Python sabitleri hiçbir zaman değişmeyen değişkenlerdir. Gelecek bölümde Python sabiti hakkında detaylı bir tartışma yapacağız.

Sabitler nedir?

Matematikte genellikle sabit bir terim, hiçbir zaman değişmeyen bir değer veya miktar kullanılır. Programlamada sabit, programlamanın yürütülmesi sırasında hiçbir zaman değişmeyen bir değerle ilişkili adı ifade eder. Programlama sabiti diğer sabitlerden farklıdır ve iki şeyden oluşur: bir ad ve ilişkili bir değer. Ad, sabitin neyle ilgili olduğunu açıklayacaktır ve değer, sabitin kendisinin somut ifadesidir.

Sabiti tanımladığımızda yalnızca değerine erişebiliriz ancak onu zaman içinde değiştiremeyiz. Ancak değişkenin değerini değiştirebiliriz. Gerçek hayattan bir örnek: Işık hızı, bir saatteki dakika sayısı ve projenin kök klasörünün adı.

Neden Sabit Kullanılmalı?

Programlama dillerinde Sabitler, hata ayıklaması zor hatalara neden olabilecek değerlerinin yanlışlıkla değiştirilmesini önlememizi sağlar. Kodu daha okunabilir ve bakımı kolay hale getirmek de faydalıdır. Sabitin bazı avantajlarını görelim.

    Geliştirilmiş Okunabilirlik -Kodun okunabilirliğini artırmaya yardımcı olur. Örneğin, MAX_SPEED adlı bir sabiti okumak ve anlamak, önemli hız değerinin kendisinden daha kolaydır.Niyetin açık bir şekilde iletilmesi -Çoğu geliştirici 3.14'ü pi sabiti olarak kabul eder. Ancak Pi, pi veya PI adı amacı daha net bir şekilde iletecektir. Bu uygulama başka bir geliştiricinin kodumuzu anlamasına olanak tanıyacaktır.Daha İyi Bakım Kolaylığı -Sabitler, kodunuz boyunca aynı değeri kullanmamıza olanak tanır. Sabitin değerini güncellemek istediğimizi varsayalım; her örneği değiştirmemize gerek yok.Düşük hata riski -Bir program boyunca belirli bir değeri temsil eden bir sabitin hata yapma olasılığı daha azdır. Hesaplamalardaki kesinliği değiştirmek istiyorsak değeri değiştirmek riskli olabilir. Bunu değiştirmek yerine farklı hassasiyet seviyeleri için farklı sabitler oluşturabilir ve kodu ihtiyacımız olan yerde değiştirebiliriz.İş parçacığı güvenli veri depolama -Sabitler iş parçacığı açısından güvenli nesnelerdir; bu, birden fazla iş parçacığının veri kaybı riski olmadan aynı anda bir sabit kullanabileceği anlamına gelir.

Kullanıcı Tanımlı Sabitler

Python'da sabiti tanımlamak için Python'daki adlandırma kuralını kullanmamız gerekir. İsmi büyük harflerle ve sözcükleri ayıran alt çizgiyle yazmalıyız.

Aşağıda kullanıcı tanımlı Python sabitlerinin örneği verilmiştir -

 PI = 3.14 MAX_SPEED = 300 DEFAULT_COLOR = '33[1;34m' WIDTH = 20 API_TOKEN = '567496396372' BASE_URL = 'https://api.example.com' DEFAULT_TIMEOUT = 5 BUILTINS_METHODS = ('sum', 'max', 'min', 'abs') INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', ... ] 

Python'da değişkenleri oluştururken aynı yöntemi kullandık. Dolayısıyla Python sabitlerinin yalnızca değişkenler olduğunu ve tek farkın, sabitin yalnızca büyük harfleri kullanması olduğunu varsayabiliriz.

Büyük harflerin kullanılması, sabitin değişkenlerimizden öne çıkmasını sağlar ve faydalı veya tercih edilen bir uygulamadır.

Yukarıda kullanıcı tanımlı kullanıcıları ele aldık; Python ayrıca sabit olarak kabul edilebilecek ve sabit olarak ele alınması gereken birkaç dahili ad da sağlar.

Python'daki Önemli Sabitler

Bu bölümde Python kodunu daha okunabilir hale getirmek için kullanılan bazı dahili sabitleri öğreneceğiz. Bazı önemli sabitleri anlayalım.

Yerleşik Sabitler

Resmi belgelerde, Doğru Ve YANLIŞ ilk sabit olarak listelenir. Bunlar Python Boolean değerleridir ve int'in örneğidir. A Doğru 1 değerine sahiptir ve YANLIŞ 0 değeri vardır.

Örnek -

 >>> True True >>> False False >>> isinstance(True, int) True >>> isinstance(False, int) True >>> int(True) 1 >>> int(False) 0 >>> True = 42 ... SyntaxError: cannot assign to True >>> True is True True >>> False is False True 

Doğru ve Yanlış adlarının katı sabitler olduğunu unutmayın. Yani yeniden atayamayız ve yeniden atamaya çalıştığımızda sözdizimi hatası alırız. Bu iki değer Python'daki tekil nesnelerdir, yani yalnızca bir örnek mevcuttur.

Dahili Dunder Adları

Python'un ayrıca birçok dahili özelliği vardır. gök gürültüsü sabit sayabileceğimiz isimler. Bu benzersiz adlardan birkaçı var, bu bölümde __name__ ve __file__ hakkında bilgi edineceğiz.

__name__ niteliği belirli bir kod parçasının nasıl çalıştırılacağıyla ilgilidir. Bir modülü içe aktarırken Python dahili olarak __name__ değerini modülün adını içeren bir dizeye ayarlar.

yeni_dosya.py

 print(f'The type of __name__ is: {type(__name__)}') print(f'The value of __name__ is: {__name__}') 

Komut satırına aşağıdaki komutu yazın -

 python -c 'import new_file' 

-c, komut satırında küçük bir Python kodu parçasını yürütmek için kullanılır. Yukarıdaki örnekte, içe aktardık yeni dosya Ekranda bazı mesajları görüntüleyen modül.

Çıktı -

 The type of __name__ is: The value of __name__ is: timezone 

Gördüğümüz gibi __name__ __main__ dizesini saklıyor, bu çalıştırılabilir dosyaları doğrudan Python programı olarak çalıştırabileceğimizi gösteriyor.

Öte yandan, __file__ özelliği Python'un şu anda içe aktardığı veya çalıştırdığı dosyayı içerir. Dosyanın içinde __file__ niteliğini kullanırsak, modülün kendisine giden yolu elde ederiz.

Aşağıdaki örneğe bakalım -

dizeyi karaktere dönüştür

Örnek -

 print(f'The type of __file__ is: {type(__file__)}') print(f'The value of __file__ is: {__file__}') 

Çıktı:

 The type of __file__ is: The value of __file__ is: D:Python Project
ew_file.py 

Doğrudan da koşabiliriz ve aynı sonucu alırız.

Örnek -

 print(f'The type of __file__ is: {type(__file__)}') print(f'The value of __file__ is: {__file__}') 

Çıktı:

 python new_file.py The type of __file__ is: The value of __file__ is: timezone.py 

Yararlı Dize ve Matematik Sabitleri

Standart kütüphanede birçok değerli sabit vardır. Bazıları belirli modüllere, işlevlere ve sınıflara sıkı sıkıya bağlıdır; çoğu geneldir ve bunları çeşitli senaryolarda kullanabiliriz. Aşağıdaki örnekte sırasıyla math ve string ile ilgili modüller math ve string'i kullanacağız.

Aşağıdaki örneği anlayalım -

Örnek -

 >>> import math >>> math.pi 3.141592653589793 >>> math.tau 6.283185307179586 >>> math.nan nan >>> math.inf inf >>> math.sin(30) -0.9880316240928618 >>> math.cos(60) -0.9524129804151563 >>> math.pi 3.141592653589793 

Bu sabitler, matematikle ilgili kod yazdığımızda veya bazı özel hesaplamalar yaptığımızda hayati bir rol oynayacaktır.

Aşağıdaki örneği anlayalım -

Örnek -

 import math class Sphere: def __init__(self, radius): self.radius = radius def area(self): return math.pi * self.radius**2 def perimeter(self): return 2 * math.pi * self.radius def projected_volume(self): return 4/3 * math.pi * self.radius**3 def __repr__(self): return f'{self.__class__.__name__}(radius={self.radius})' 

Yukarıdaki kodda şunu kullandık: matematik.pi özel yerine PI sabitler. Matematikle ilgili sabit, programa daha fazla bağlam sağlar. math.pi sabitini kullanmanın avantajı, eğer Python'un daha eski bir sürümünü kullanıyorsak, Pi'nin 32 bitlik bir sürümünü elde etmemizdir. Yukarıdaki programı Python'un modern versiyonunda kullanırsak pi'nin 64 bit versiyonunu elde edeceğiz. Böylece programımız somut yürütme ortamına kendi kendine uyum sağlayacaktır.

String modülü ayrıca bazı kullanışlı yerleşik string sabitleri de sağlar. Aşağıda her sabitin adının ve değerinin tablosu yer almaktadır.

İsim Değer
ascii_küçük harf Abcdefghijklmnopqrstuvwxyz
ascii_uppercase ABCDEFGHIJKLMNOPQRSTUVWXYZ
ascii_letters ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
rakamlar 0123456789
onaltılık sayılar 0123456789abcdefABCDEF
sekiz rakam 01234567

String ile ilgili bu sabitleri normal ifadelerde, doğal dilin işlenmesinde, birçok string işlemede ve daha fazlasında kullanabiliriz.

Tip Açıklamalı Sabitler

Python 3.8'den bu yana yazma modülü, sabitlere açıklama eklememize izin veren bir Final sınıfı içerir. Programdaki sabitleri tanımlamak için Final sınıfını kullanırsak, mypy checker'ın kontrol ettiği statik tip hatasını alırız ve bu, Final adını yeniden atayamayacağımızı gösterir. Aşağıdaki örneği anlayalım.

Örnek -

 from typing import Final MAX_Marks: Final[int] = 300 MAX_Students: Final[int] = 500 MAX_Marks = 450 # Cannot assign to final name 'MAX_SPEED' mypy(error) 

Bildirilen bir adın yeniden atanması durumunda hatayı bildirmek için tür hatasını belirten Final Class ile sabit değişkeni belirttik. Ancak, bir tür denetleyicinin hatasına ilişkin bir rapor alır; Python MAX_SPEED değerini değiştirir. Dolayısıyla Final, çalışma zamanında sürekli olarak yanlışlıkla yeniden atama yapılmasını engellemez.

Dize Sabitleri

Önceki bölümde tartışıldığı gibi Python katı sabitleri desteklemez; sadece asla değişmeyen değişkenler var. Bu nedenle Python topluluğu, sabit değişkenleri tanımlamak için büyük harf kullanma şeklindeki adlandırma kuralını izler.

Farklı seviyelerde birçok programcıyla büyük bir Python projesi üzerinde çalışıyorsak bu bir sorun olabilir. Dolayısıyla katı sabitleri kullanmamıza izin veren bir mekanizmaya sahip olmak iyi bir uygulama olacaktır. Bildiğimiz gibi Python dinamik bir dildir ve sabitleri değiştirilemez hale getirmenin birkaç yolu vardır. Bu bölümde bu yollardan bazılarını öğreneceğiz.

.__slots__ Nitelikleri

Python sınıfları __slots__ niteliklerini kullanma olanağı sağlar. Yuva nesnelerin boyutunu küçültecek özel mekanizmaya sahiptir. Nesneler üzerinde bellek optimizasyonu kavramıdır. Eğer sınıfta __slots__ niteliğini kullanırsak, __dict__ niteliklerini kullanmadığı için yeni örneği ekleyemeyiz. Ek olarak, sahip olmamak .__dict__ özelliği, bellek tüketimi açısından bir optimizasyon anlamına gelir. Aşağıdaki örneği anlayalım.

Örnek - __slots__ niteliklerini kullanmadan

 class NewClass(object): def __init__(self, *args, **kwargs): self.a = 1 self.b = 2 if __name__ == '__main__': instance = NewClass() print(instance.__dict__) 

Çıktı -

 {'a': 1, 'b': 2} 

Python'daki her nesne, niteliklerin eklenmesine izin veren dinamik bir sözlük içerir. Sözlükler çok fazla bellek tüketir ve __slots__ kullanmak alan ve bellek israfını azaltır. Başka bir örnek görelim.

Örnek -

 class ConstantsName: __slots__ = () PI = 3.141592653589793 EULER_NUMBER = 2.718281828459045 constant = ConstantsName() print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI) 

Çıktı -

 3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 10, in AttributeError: 'ConstantsName' object attribute 'PI' is read-only 

Yukarıdaki kodda sınıf niteliklerini slot nitelikleriyle başlattık. Değişkenin sabit bir değeri vardır, değişkeni yeniden atamaya çalışırsak hata alırız.

@property Dekoratörü

Biz de kullanabiliriz @mülk sabitler için ad alanı olarak çalışan bir sınıf oluşturmak için dekoratör. Sadece sabitler özelliğini, onlara bir ayarlayıcı yöntemi sağlamadan tanımlamamız gerekiyor. Aşağıdaki örneği anlayalım.

Örnek -

 class ConstantsName: @property def PI(self): return 3.141592653589793 @property def EULER_NUMBER(self): return 2.718281828459045 constant = ConstantsName() print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI) 

Çıktı -

 3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 13, in AttributeError: can't set attribute 

Bunlar yalnızca salt okunur özelliklerdir, yeniden atamayı denersek Özellik Hatası.

Namedtuple() Fabrika İşlevi

Python'un toplama modülü, nametuple() adı verilen fabrika işleviyle birlikte gelir. Kullanmak isimlituple() işlevinde, öğelerine erişmek için adlandırılmış alanları ve nokta gösterimini kullanabiliriz. Demetlerin değişmez olduğunu biliyoruz, bu da mevcut adlandırılmış bir demet nesnesini yerinde değiştiremeyeceğimiz anlamına gelir.

Aşağıdaki örneği anlayalım.

Örnek -

 from collections import namedtuple ConstantsName = namedtuple( 'ConstantsName', ['PI', 'EULER_NUMBER'] ) constant = ConstantsName(3.141592653589793, 2.718281828459045) print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI) 

Çıktı -

 3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 17, in AttributeError: can't set attribute 

@dataclass Dekoratörü

Adından da anlaşılacağı gibi veri sınıfı verileri tutar, yöntemlerden oluşabilir, ancak birincil amaçları bu değildir. Veri sınıflarını oluşturmak için @dataclass dekoratörünü kullanmamız gerekiyor. Ayrıca katı sabitler de oluşturabiliriz. @dataclass dekoratörü, veri sınıfımızı değişmez olarak işaretlememize olanak tanıyan dondurulmuş bir argüman alır. @dataclass dekoratörünü kullanmanın avantajları, örnek niteliğini değiştiremeyiz.

Aşağıdaki örneği anlayalım.

Örnek -

 from dataclasses import dataclass @dataclass(frozen=True) class ConstantsName: PI = 3.141592653589793 EULER_NUMBER = 2.718281828459045 constant = ConstantsName() print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI) 

Çıktı -

 3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 19, in File '', line 4, in __setattr__ dataclasses.FrozenInstanceError: cannot assign to field 'PI' 

Açıklama -

Yukarıdaki kodda @dataclass dekoratörünü içe aktardık. Bu dekoratörü ConstantsName'e veri sınıfı yapmak için kullandık. Veri sınıfını değişmez kılmak için frozen argümanını True olarak ayarladık. Veri sınıfının örneğini oluşturduk ve tüm sabitlere erişebiliyoruz ancak bunları değiştiremiyoruz.

.__setattr__() Özel Yöntemi

Python .__setattr__() adı verilen özel bir yöntemi kullanmamıza izin verir. Bu yöntemi kullanarak nitelik atama sürecini özelleştirebiliriz çünkü Python her nitelik atamasında yöntemi otomatik olarak çağırır. Aşağıdaki örneği anlayalım -

Örnek -

 class ConstantsName: PI = 3.141592653589793 EULER_NUMBER = 2.718281828459045 def __setattr__(self, name, value): raise AttributeError(f'can't reassign constant '{name}'') constant = ConstantsName() print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI) 

Çıktı -

 3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 22, in File '', line 17, in __setattr__ AttributeError: can't reassign constant 'PI' 

__setattr__() yöntemi, sınıfın öznitelikleri üzerinde herhangi bir atama işleminin gerçekleştirilmesine izin vermez. Eğer yeniden atamayı denersek, bu sadece bir artışa neden olur. Özellik Hatası.

Çözüm

Sabitler en çok programlamada kavram olarak, özellikle matematiksel terim olarak kullanılır. Bu derste sabitlerin önemli kavramlarını ve tatlarını öğrendik. Python topluluğu, sabitleri tanımlamak için ad kuralı olarak büyük harf kullanır. Ancak Python'da sabitleri kullanmanın bazı gelişmiş yollarını tartıştık. Sabitlerle kodun okunabilirliğini, yeniden kullanılabilirliğini ve sürdürülebilirliğini nasıl geliştirebileceğimizi tartıştık. Python sabitlerimizi tam anlamıyla sabit hale getirmek için çeşitli teknikleri nasıl uygulayacağımızdan bahsettik.