İdentiklik operatorları

   Bildiyiniz kimi, qiymət və dəyişənlərin bərabər olub-olmadığını yoxlamaq üçün bərabərlik (==!=) operatorlarından istifadə olunur. Bundan başqa Python dilində obyektlərin identikliyini yoxlayan identiklik (isis not) operatorları da nəzərdə tutulmuşdur. Burada xüsusilə qeyd etmək lazımdır ki, bu iki anlayış (bərabərlikidentiklik) bir-birindən ciddi mənada fərqlənir. 

Gəlin aşağıdakı misalları nəzərdən keçirək:

>>> L1 = [1, 2, 3]
>>> L2 = [1, 2, 3]
>>> L3 = L1
>>> L1 == L2
True
>>> L1 is L2
False
>>> L1 is L3
True
>>> L2 is not L3
True
>>>

   Yuxarıdakı proqramda L1, L2L3 dəyişənlərinə siyahı (list) tipində qiymətlər mənimsədilir. Burada L1L2 dəyişənləri eyni məzmunda olan, lakin fərqli siyahılara istinad edirlər. Başqa sözlə desək, istinad edilən siyahılar ayrı-ayrı obyektlərdir və yaddaşın müxtəlif ünvanlarında yerləşirlər. Və məhz buna görə də, onlar bərabər olsa da identik sayılmırlar. Proqramda həm də L3 dəyişəninə L1 siyahısı mənimsədilir. Bu zaman L3 dəyişəni də L1 dəyişəninin istinad etdiyi eyni obyektə istinad edəcək. Bu isə onların identik olması mənasına gələcək. Və sonda L2L3 siyahılarının da identik olmadığı göstərilir.

Daha bir neçə misalı nəzərdən keçirək:

>>> a = 123
>>> b = 123
>>> s1 = 'salam'
>>> s2 = 'salam'
>>> a is b
True
>>> s1 is s2
True
>>>

   Bu proqramda biz ab dəyişənlərinə tam ədəd tipində 123 qiymətini, s1s2 dəyişənlərinə də sətir tipində ‘salam’ qiymətini mənimsətdik. Məntiqlə ab, eləcə də s1s2 fərqli obyektlərə istinad etdiklərinə görə öz aralarında identik olmamalı idilər. Lakin bu dəyişənlərə identiklik operatorunu tətbiq etdiyimiz zaman bunun əksini görürük. Əcəba niyə? Məsələ burasındadır ki,  fərqli dəyişənlərə eyni kiçik ədədləri və qısa sətirləri mənimsətdiyimiz zaman Python dilinin interpretatoru optimallaşdırma məqsədilə keşləmə həyata keçirir və bu dəyişənləri eyni obyektə bağlayır. Lakin əgər daha böyük ədədlər və daha uzun sətirlər istifadə olunarsa, bu zaman vəziyyət dəyişər və dəyişənlər fərqli obyektlərə istinad etmiş olar:

>>> a = 12345
>>> b = 12345
>>> a is b
False
>>> s1= 'salam dostlar'
>>> s2= 'salam dostlar'
>>> s1 is s2
False
>>>

   Proqramdan da gördüyünüz kimi ab, eləcə də s1s2 dəyişənləri artıq öz aralarında identik deyillər.

Müqayisə operatorları

   Proqramlaşdırmada bir çox halda qiymətləri, eləcə də dəyişənləri bir-birilə müqayisə etmək lazım gəlir. Bunun üçün hər bir proqramlaşdırma dilində olduğu kimi Python dilində də müqayisə operatorları nəzərdə tutulmuşdur:

Operator Təyinatı
< kiçikdir (a<b) 
> böyükdür (a>b) 
 == bərabərdir (a==b)
<= kiçik bərabərdir (a<=b) 
>= böyük bərabərdir (a>=b)
!=   <> bərabər deyil (a!=b və ya a<>b)

   Cədvəldə bərabərsizliyi müqayisə edən iki operator (!=<>) göstərilmişdir. Qeyd etmək lazımdır ki, yeni versiyada != operatorundan istifadə edilir. Sizin də bu variantdan istifadə etməyiniz tövsiyə olunur.

round() funksiyası

  round() funksiyası verilmiş ədədi onluq vergüldən sonra göstərilmiş mərtəbəyə qədər yuvarlaqlaşdıraraq qaytarır.

Funksiyanın sintaksisi aşağıdakı kimidir:

round(number, ndigits)

   Burada number verilmiş həqiqi ədəd, ndigits isə onluq vergüldən sonra göstərilən mərtəbələrin sayıdır. İkinci parametr olan ndigits istəyə bağlı olaraq istifadə edilir, boş buraxıldıqda, yuvarlaqlaşdırma ən yaxın tam ədədə qədər aparılır. Əgər round() funksiyasına number olaraq tam ədəd verilsə, funksiya tam ədəd qaytaracaq.

Aşağıda round() funksiyasının istifadəsi ilə bağlı nümunələr verilmişdir:

>>> print(round(10.7))
11
>>> print(round(5.3))
5
>>> print(round(-5.7))
-6
>>> print(round(8))
8
>>>
>>> print(round(1.5))
2
>>> print(round(2.5))
2
>>>

   Yuxarıdakı misallardan sonuncusunun nəticəsi Sizi çaşdıra bilər. Deyəcəksiniz ki, axı nəticə 3 olmalıydı. Çünki riyaziyyatdan da bildiyimiz kimi hansı mərtəbəyə qədər yuvarlaqlaşdırılma tələb edilirsə, həmin mərtəbədəki rəqəmdən sağdakı rəqəm 4-dən böyükdürsə, qeyd olunan rəqəm bir vahid artırılır, əks halda isə rəqəm dəyişmir, bu rəqəmin sağındakı bütün rəqəmlər isə sıfırlarla əvəz edilir. Amma məsələ burasındadır ki, Python dilinin round() funksiyası riyazi deyil, bank yuvarlaqlaşdırması edir, yəni yuvarlaqlaşma ən yaxın cüt ədədə qədər aparılır.

   Aşağıdakı misallarda ndigits parametri istifadə edilir:

>>> print(round(2.56, 1))
2.6
>>> print(round(3.874, 2))
3.87
>>> print(round(2.665, 2))
2.67
>>> print(round(2.675, 2))
2.67
>>>

   Yenə də sonuncu misaldakı nəticə sürpriz oldu. Gözləyirdiniz ki, round(2.675, 2) funksiyası 2.68 verəcək, amma 2.67 verdi. Funksiyanın bu davranışı xəta deyil. Məsələ burasındadır ki, bir çox onluq kəsrləri dəqiqliklə həqiqi ədədlər kimi təsvir etmək mümkün deyil. Məsələn 2.675 onluq ədədi ikili sürüşkən vergüllü ədədə çevirdikdə, o ikili yaxınlaşma ilə əvəz olunur və dəqiq qiyməti aşağıdakı kimi olur:

2.67499999999999982236431605997495353221893310546875

   Məhz buna görə də yuvarlaqlaşdırmanın nəticəsi 2.67 olur.

   Dəqiqlik tələb olunan hallarda isə sürüşkən ədədlərlə işləmək üçün nəzərdə tutulan decimal modulundan istifadə etmək olar:

>>> from decimal import Decimal
>>> num = Decimal('2.675')
>>> print(round(num, 2))
2.68
>>>

Bonus

   COVID-19 pandemiyası dövlət və özəl şirkətlərin də işini çətinləşdirmişdi. Böyük krizisə baxmayaraq MilliByte kompaniyası uğurlu fəaliyyət göstərərək xalis mənfəət və gəlirlərində artıma nail olmuşdu. Məhz buna görə də şirkətin rəhbəri bu uğurda rolu olan əməkdaşlarını mükafatlandırmaq qərarına gəlmişdi. Ay sonunda işçilər əmək haqqlarına əlavə olaraq bonus da alacaqdılar.

Working Notepad Bonus Salary Growth Success Promotion Concept

   Bu haqda elanlar lövhəsində məlumat da yerləşdirildi. Məlumatda həmçinin qeyd olundu ki, bir neçə günə kimin nə qədər bonus alacağı da elan olunacaq. Lakin rəhbərlik əməkdaşlarına veriləcək mükafatın məbləğinin hər kəs tərəfindən bilinməsini istəmirdi. Ona görə belə bir qərara gəldilər ki, bonus məbləğlərinin yerinə fərqli say sistemlərində verilmiş ədədlər yazsınlar. Əməkdaşların ad və soyadlarının yerinə isə onların yaşını qeyd etsinlər. Hər əməkdaş üçün say sistemi isə belə seçilirdi. Əməkdaşın yaşını götürərək onluq mövqedə duran rəqəmini silib üzərinə 2 gəlirdilər. Və beləcə alınan ədəd say sisteminin əsası qəbul edilirdi.

   İndi Sizdən tələb olunan MilliByte şirkətinin öz əməkdaşlarına nə qədər bonus verdiyini onluq say sistemində tapmaqdır.

   Əməkdaşların sayı 50-dən azdır, yaşları 100-dən çox deyil, aldıqları bonus onluq say sistemində 100000 manatdan çox deyil.

Giriş verilənlərinin formatı

   Birinci sətirdə bonus alacaq əməkdaşların sayı n (n < 50) verilir. Növbəti sətirlərdə isə  arada boşluq olmaqla əməkdaşın yaşı və hansısa say sistemində (rəqəm və böyük ingilis hərfləri ilə ifadə olunan) aldığı bonus miqdarı verilir.

Çıxış verilənlərinin formatı

   Hər əməkdaşın aldığı bonusun miqdarını onluq say sistemində ayrı-ayrı sətirlərdə çap etmək lazımdır.

Nümunə
Giriş verilənləri Çıxış verilənləri

2
28 2800
30 101

2800
5

   Proqramı özünüz tərtib etməyə çalışın. Əgər alınmasa, aşağıdakı həll ilə tanış olun.

Bonus

list() funksiyası

   list() funksiyası verilmiş ardıcıllıqdan/kolleksiyadan siyahı düzəldib qaytarır.

Funksiyanın sintaksisi aşağıdakı kimidir:

list(iterable)

   Burada iterable ardıcıllıq (sətir, siyahı və kortej) və ya kolleksiya (çoxluq və lüğət) tiplərində ola bilər. Funksiyada iterable parametrinin istifadəsi zəruri deyil, boş buraxıldığı təqdirdə funksiya boş siyahı qaytarır.

Aşağıda list() funksiyasının istifadəsi ilə bağlı nümunələr verilmişdir:

>>> m = list("PYTHON")
>>> print(m)
['P', 'Y', 'T', 'H', 'O', 'N']
>>>
>>> m = list([1,2,3,4,5])
>>> print(m)
[1, 2, 3, 4, 5]
>>>
>>> m = list(('a', 'e', 'i', 'o', 'u'))
>>> print(m)
['a', 'e', 'i', 'o', 'u']
>>>
>>> m = list({0,1,2,3,4,5,6,7,8,9})
>>> print(m)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
>>> m = list({'a': 1, 'e': 2, 'i': 3, 'o':4, 'u':5})
>>> print(m)
['a', 'e', 'i', 'o', 'u']
>>>
>>> m = list()
>>> print(m)
[]
>>>

Armud ağacı

   Mauqlinin böyüyüb başa çatdığı Seoni cəngəlliyində çox ləzzətli armudlar yetişirdi. Amma onların içərisində elə bir armud ağacı var idi ki, onun meyvələri tamam başqa aləm idi. Belə bir məsəl var, “meşədə armudun yaxşısını ayı yeyər”. Elə ona görə də bu armud ağacının yerini yalnız ayı Balu bilirdi.

armud_agaci

   Balu sevimli armud ağacının çiçəklənməsini və meyvə verməsini hər dəfə səbirsizliklə gözləyərdi. Ağac bar verməyə başlayanda ayı gəlib meyvələri sayar və onların n qədər olduğunu müəyyənləşdirərdi. O məhsulun bol olmasına sevinib Allaha şükr edərdi. Bu mövsüm də belə oldu, hər gün armud yeyəcəyini qət edən ayı mağarasına şad-xürrəm geri döndü. Seoni cəngəlliyinin torpaqları çox münbit olduğundan armudlar tez yetişirdi. Bir neçə gün sonra Balu yetişmiş armudları toplamağa gəldi. Bu onun məhsul yığımının ilk günü idi. Balu ağacda k sayda yetişmiş armud gördü və səliqəylə dərib səbətinə qoydu. Bu armudları o elə həmin gün yeyəcək və sabahısı gün yenidən gələcəkdi. Təcrübəsinə əsasən Balu bilirdi ki, hər yeni gün ağacdakı yetişmiş armudların sayı əvvəlki gündən m qədər çox olurdu.

Vitamins in Pear-02

   Balu həm də onu bilirdi ki, armudda çoxlu vitaminlər var. Odur ki, hər gün daha çox armud yemək onu qəti narahat etmirdi.

   İndi Sizdən tələb olunan ayı Balunun sonuncu gün, yəni n-ci armudun yetişdiyi gün neçə armud yeməsini tapmaqdır.

Giriş verilənlərinin formatı

  Tək sətirdə n, km (1000000000-ı aşmayan) tam ədədləri verilir.

Çıxış verilənlərinin formatı

  Məsələnin cavabı olan tam ədədi tək sətirdə çap etmək lazımdır.

Nümunə
Giriş verilənləri Çıxış verilənləri

10 1 1

4

100 20 10

10

Proqramı özünüz tərtib etməyə çalışın. Əgər alınmasa, aşağıdakı həll ilə tanış olun.

pear_tree

 

divmod() funksiyası

   divmod() funksiyası tam və ya həqiqi ədəd tipində iki parametr qəbul edir və birincini ikinciyə bölərək natamam qismətqalığı kortej şəklində qaytarır.

Funksiyanın sintaksisi aşağıdakı kimidir:

divmod(a, b)

   Burada a bölünən, b isə bölən ədəddir. Hər iki parametr tamhəqiqi ədəd tipində ola bilər, onların kompleks ədəd tipində verilməsi yolverilməzdir.

Aşağıda divmod() funksiyasının istifadəsi ilə bağlı nümunələr verilmişdir:

>>> x, y = divmod(5, 2)
>>> print(x, y)
2 1
>>>
>>> x, y = divmod(8.4, 3)
>>> print(x, y)
2.0 2.4000000000000004
>>>
>>> x, y = divmod(7.5, 2.5)
>>> print(x, y)
3.0 0.0
>>>
>>> print(divmod(0xa, 0x3))
(3, 1)
>>>

abs() funksiyası

   abs() funksiyası verilmiş ədədin modulunu qaytarır.

Funksiyanın sintaksisi aşağıdakı kimidir:

abs(x)

   Burada x int (tam), float (həqiqi) və complex (kompleks) ədəd tipində ola bilər.

Aşağıda abs() funksiyasının istifadəsi ilə bağlı nümunələr verilmişdir:

>>> print(abs(-5))
5
>>> print(abs(-1.25))
1.25
>>> print(abs(3 - 4j))
5.0
>>>

pow() funksiyası

   Bildiyiniz kimi ədədi qüvvətə yüksəltmək üçün x**y riyazi ifadəsindən istifadə etmək mümkündür. Bununla yanaşı Python dilində pow() funksiyası da nəzərdə tutulmuşdur.

Funksiyanın sintaksisi aşağıdakı kimidir:

pow(base, exp, mod)

   Burada base əsasdır; int (tam), float (həqiqi) və complex (kompleks) ədəd tipində ola bilər. İkinci parametr exp qüvvət üstüdür; o da həmçinin int (tam), float (həqiqi) və complex (kompleks) ədəd tipində ola bilər. İstifadəsi zəruri olmayan üçüncü parametr mod isə qüvvətə yüksəldilmiş ədədi qalıqlı bölmə ilə bölən ədəddir. Əgər pow() funksiyasında mod parametri istifadə edilirsə, base (əsas) və exp (qüvvət üstü) int (tam ədəd) tipində verilməli, və exp (qüvvət üstü) mənfi ədəd olmamalıdır.

Aşağıda pow() funksiyasının istifadəsi ilə bağlı nümunələr verilmişdir:

>>> print(pow(2, 3))
8
>>> print(pow(3.5, 4))
150.0625
>>> print(pow(-2, 2))
4
>>> print(pow(4, -2))
0.0625
>>> print(pow(3+4j, 5))
(-237-3116j)
>>> print(pow(3+4j, 2+3j))
(1.4260094753925756+0.6024346301905391j)
>>>

Aşağıdakı misalda isə mod parametrindən istifadə olunur:

>>> print(pow(3, 2, 4))
1
>>> print(pow(4, 3, 2))
0
>>>

pow() funksiyası ikilik, səkkizlik, və onaltılıq ədədlərlə də istifadə oluna bilər:

>>> print(pow(0b11, 2))
9
>>> print(pow(0o123, 3))
571787
>>> print(pow(0xFB, 4))
3969126001
>>>

   Sonda qeyd etmək yerinə düşərdi ki, math modulunun da math.pow(x, y) adlı oxşar funksiyası vardır.

sum() funksiyası

   sum() funksiyası verilmiş ardıcıllığın/kolleksiyanın elementlərini toplayır və cəmi qaytarır.

Funksiyanın sintaksisi aşağıdakı kimidir:

sum(iterable, start)

   Burada iterable ardıcıllıq (siyahı və kortej) və ya kolleksiya (çoxluq və lüğət) tiplərində ola bilər. İstifadəsi zəruri olmayan ikinci parametr start isə yekun cəmə əlavə olunan qiymətdir. Default qiyməti 0 olaraq təyin edilib. Funksiya yalnız ədədi qiymətləri toplamaq üçün nəzərdə tutulub. Odur ki, ardıcıllığın elementləri mütləq şəkildə ədədlərdən ibarət olmalı və start parametri sətir olmayan qiymətlə təyin edilməlidir. Əks halda xəta qeydə alınacaq.

Aşağıda sum() funksiyasının istifadəsi ilə bağlı nümunələr verilmişdir:

>>> # ardıcıllıq siyahıdır
>>> m = [1, 2.5, -3, 5]
>>> cem = sum(m)
>>> print(cem)
5.5
>>>
>>> # ardıcıllıq kortejdir
>>> m = (10, 30, 120)
>>> cem = sum(m)
>>> print(cem)
160
>>>
>>> # kolleksiya çoxluqdur
>>> m = {1, 2, 3, 4, 5}
>>> cem = sum(m)
>>> print(cem)
15
>>>
>>> # kolleksiya lüğətdir
>>> m = {1: "bir", 2: "iki", 3: "üç"}
>>> cem = sum(m)
>>> print(cem)
6
>>>

Son nümunədə sum() funksiyası verilmiş lüğətin açarlarını toplayır.

Aşağıdakı misalda isə start parametrindən istifadə olunur:

>>> m = [10, 20, 30]
>>> cem = sum(m, 100)
>>> print(cem)
160
>>>