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.
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.