2.3. Matematik işlemleri

Python kutudan çıktığı haliyle bir hesap makinesi gibi çalışır. Bu sayfa en sık kullanacağınız operatörleri kapsar: sayılar üzerinde aritmetik, boolean üreten karşılaştırmalar, koşulları birleştiren mantıksal operatörler ve donanım düzeyindeki işler için bit düzeyinde operatörler.

2.3.1. Aritmetik

int ve float değerleri üzerindeki standart aritmetik operatörler:

  • + – toplama

  • - – çıkarma (veya ön ek olarak negatif alma: -x)

  • * – çarpma

  • / – bölme. Her iki işlenen tam sayı olsa bile her zaman bir float döndürür.

  • // – taban bölme. Eksi sonsuza doğru yuvarlanmış tam sayı bölümünü döndürür.

  • % – mod (kalan).

  • ** – üs alma (2 ** 10 değeri 1024’tür).

>>> 7 / 2
3.5
>>> 7 // 2
3
>>> -7 // 2
-4
>>> 7 % 2
1
>>> 2 ** 16
65536

Karışık tipli aritmetik, tam sayıları otomatik olarak float’a yükseltir:

>>> 3 + 0.5
3.5

Bileşik atama, kompakt bir yerinde güncelleme için operatörü = ile birleştirir:

counter = 0
counter += 1                # equivalent to counter = counter + 1
counter *= 2                # works for *= /= //= %= **= too

Operatör önceliği geleneksel sırayı izler: önce **, sonra tekli -, sonra *, /, // ve %, ardından + ve -. Emin olmadığınızda parantez kullanın – çalışma zamanında hiçbir maliyetleri yoktur.

2.3.2. Karşılaştırma

Karşılaştırma operatörleri bir bool (True veya False) döndürür:

  • == ve != – eşit / eşit değil.

  • <, <=, >, >= – sıralama.

>>> 3 == 3
True
>>> 3 == 3.0
True
>>> 3 < 5 <= 5
True

Son örnek bir zincirleme karşılaştırmadır ve tam olarak 3 < 5 and 5 <= 5 ifadesine eşdeğerdir.

Uyarı

= atama yapar; == karşılaştırır. if x = 5: ifadesi tam olarak bir sözdizimi hatasıdır çünkü Python bu ikisini sessizce karıştırmayı reddeder.

2.3.3. Boolean mantığı

Üç operatör boolean değerleri birleştirir:

  • and – yalnızca her iki taraf da doğru olduğunda True.

  • or – taraflardan biri doğru olduğunda True.

  • not – tek bir boolean değeri tersine çevirir.

and ve or operatörleri kısa devre yapar: sonuç bilinir bilinmez değerlendirmeyi durdururlar. False and slow_check() ifadesi asla slow_check fonksiyonunu çağırmaz.

and ve or ayrıca düz bir True veya False yerine işlenenlerinden birini döndürür; bu da varsayılan değerleri kompakt biçimde yazmanıza olanak tanır:

name = user_name or "anonymous"   # "" / 0 / None are falsy

2.3.4. Bit düzeyinde operatörler

Donanım işleri için – yazmaç alanlarını paketleme, bitleri maskeleme, protokol başlıklarını ayrıştırma – bit düzeyinde operatörlere başvuracaksınız. Bunlar bir int değerinin ikili gösterimi üzerinde çalışır:

  • & – bit düzeyinde AND

  • | – bit düzeyinde OR

  • ^ – bit düzeyinde XOR

  • ~ – bit düzeyinde NOT (birin tümleyeni)

  • << – sola kaydırma

  • >> – sağa kaydırma

Bunları okurken ve yazarken onaltılık ve ikili sabit biçimleri uygundur:

>>> 0b1100 & 0b1010
8                              # 0b1000
>>> 0b1100 | 0b1010
14                             # 0b1110
>>> 0xFF ^ 0x0F
240                            # 0xF0
>>> 1 << 8
256
>>> (0xABCD >> 8) & 0xFF
171                            # extract the high byte

Her biri için bileşik biçimler vardır: |=, &=, ^=, <<=, >>=.

Not

and / or boolean değerler (veya doğruluk değerleri) üzerinde çalışır; & / | ise bitler üzerinde çalışır. Bunları karıştırmayın. 0b1100 and 0b1010 ifadesi 0b1010 olarak değerlendirilir çünkü her iki işlenen de doğrudur – bitleri işlerken genellikle istediğiniz şey bu değildir.

2.3.5. Kullanışlı sayı yerleşikleri

Bir avuç yerleşik fonksiyon, operatörlerin tek başına kapsamadığı yaygın sayısal işlemleri kapsar:

  • round() – en yakın tam sayı veya ikinci bir bağımsız değişken verildiğinde en yakın ndigits ondalık basamak. round(x) için bir int, round(x, n) için bir float döndürür. Eşitlikler (0.5, 1.5, …) her zaman yukarıya değil, en yakın çift sayıya yuvarlanır.

  • divmod() – tek bir çağrıda (quotient, remainder) döndürür. Bir niceliği birimlere bölmek için kullanışlıdır (saniyeleri dakika ve saniyeye, baytları sayfa ve ofsete).

  • pow() – iki bağımsız değişkenli biçimde ** ile aynıdır. Üç bağımsız değişkenli biçim pow(base, exp, mod), devasa ara değeri hiç gerçekleştirmeden (base ** exp) % mod hesaplar; bu da büyük üsler için modüler üs almanın tek pratik yoludur.

>>> round(3.7)
4
>>> round(3.14159, 2)
3.14
>>> round(0.5)               # ties go to even, not always up
0
>>> round(1.5)
2

>>> divmod(125, 60)          # 125 seconds = 2 min, 5 sec
(2, 5)
>>> minutes, seconds = divmod(125, 60)

>>> pow(3, 4)                # same as 3 ** 4
81
>>> pow(3, 100, 7)           # (3 ** 100) mod 7, efficient
4

Tam sayıdan dizgeye taban dönüşümleri (bin, oct, hex) String methods and formatting bölümünde ele alınmıştır.

2.3.6. math modülü

Yaygın matematiksel fonksiyonlar math modülünde bulunur. Onu bir kez içe aktarın ve fonksiyonlarını noktalı bir ad aracılığıyla çağırın:

import math

print(math.sqrt(2))              # 1.4142135
print(math.sin(math.pi / 2))     # 1.0
print(math.floor(3.7))           # 3
print(math.log(100, 10))         # 2.0

MicroPython math modülü her zamanki olağan adayları kapsar (sqrt, exp, log, sin, cos, tan, atan2, floor, ceil, pi, e, …). Rastgele sayılar için random modülüne bakın; sabit noktalı bit işlemleri için yukarıdaki operatörler genellikle yeterlidir.

2.3.7. Karmaşık sayılar

Sanal bileşenler gerektiren sayısal işler için Python’da j son ekli sabitlerle (1 + 2j) bir complex tipi bulunur. cmath modülü, karmaşık girdiler için math modülünü yansıtır. Her ikisi de çoğu MicroPython derlemesinde mevcuttur ancak kamera işleri için nadiren gerekir; bunları kullanan kodu taşırsanız sizi şaşırtmasınlar diye esasen değiniyoruz.