Pythonni mustaqil o'rganamiz PDF
Document Details
![RealizableRadiance9112](https://quizgecko.com/images/avatars/avatar-20.webp)
Uploaded by RealizableRadiance9112
2020
Tags
Summary
Ushbu Python qo'llanmasi 9-sinf o'quvchilari uchun Python dasturlash tilini mustaqil o'rganishga mo'ljallangan. Qo'llanmada Pythonning asosiy tushunchalari, kodlash misollari va amaliy topshiriqlar keltirilgan. Ushbu qo'llanma yordamida dasturlashni o'rganing.
Full Transcript
Pythonni mustaqil O‘RGANAMIZ 9-sinf informatika o‘quvchilari uchun maxsus qo‘llanma Python Coding Club, 2020 Mundarija 1-bob 4 Python tili imkoniyatlari...
Pythonni mustaqil O‘RGANAMIZ 9-sinf informatika o‘quvchilari uchun maxsus qo‘llanma Python Coding Club, 2020 Mundarija 1-bob 4 Python tili imkoniyatlari 4 2-bob: Pythonni ko‘chirib olish 5 Windowsda Pythonni o‘rnatish 5 Pythonni Linux tizimlar (Ubuntu, Linux Mint va boshqalar) da o‘rnatish 7 3-bob: Birinchi dastur. IDLE dasturlash muhiti 9 4-bob: Python tili sintaksisi 12 Sintaksis 12 Ba’zi maxsus hollar 12 5-bob: Dastur ishlamayapti. Nima qilish kerak? 13 Muammolar 13 6-bob: if-elif-else konstruksiyasi. Rostlikka tekshirish. if/else uch bo‘ginli qurilishi 18 if instruksiyasining sintaksisi 18 Pythonda rostlikka tekshirish 18 if/else uch bo‘ginli iborasi 19 7-bob: for va while sikllari. break va continue operatorlari. else sehrli so‘zi 20 while sikl operatori 20 continue operatori 20 break operatori 21 else sehrli so‘zi 21 8-bob: Kalit so‘zlar. keyword moduli 22 Kalit so‘zlar 22 keyword moduli 23 9-bob: Tarkibiy funksiyalar 24 Tiplarni o‘zaro almashtiruvchi tarkibiy tiplar 24 Boshqa tarkibiy funksiyalari 24 10-bob: Sonlar: butun, haqiqiy hamda kompleks sonlar 27 Butun sonlar (int) 27 Haqiqiy sonlar (float) 30 Kompleks sonlar (complex) 31 11-bob: Pythonda satrlar bilan ishlash: literallar 33 Satr literallari 33 12-bob: Satrlar. Satrlar funksiya va metodlari 35 Asosiy operatsiyalar 35 Satrlarning boshqa funksiya va metodlari 36 “Satrlarning funksiya va metodlari” jadvali 37 13-bob: Satrlarni formatlash. format metodi 40 format metodi yordamida satrlarni formatlash. 40 14-bob: Ro‘yxatlar (list). Ro‘yxatlarning funksiya va metodlari 44 Ro‘yxatlar nima? 44 Ro‘yxatlarning funksiya va metodlari 45 “Ro‘yxatlar metodlari” jadvali 45 15-bob: Indekslar va kesimlar 47 Indeksi bo‘yicha elementni olish 47 Kesimlar 47 16-bob: Kortejlar (tuple) 49 Ro‘yxatlar turganda, kortejlar nima uchun kerak? 49 Kortejlar bilan qanday ishlanadi? 49 Kortejlar bilan bajariladigan operatsiyalar 50 17-bob: Lug‘atlar (dict) va ular bilan ishlash. Lug‘atlarning metodlari 51 Lug‘atlarning metodlari 52 18-bob: To‘plamlar (set va frozenset) 53 To‘plamlar nima? 53 frozenset 54 19-bob: Funksiyalar va ularning argumentlari 55 Nomlangan funksiyalar. def instruksiyasi 55 Funksiyalarning argumentlari 56 Anonim funksiyalar, lambda instruksiyasi 57 20-bob: Pythonda noodatiy holatlar. Noodatiy holatlarni qayta ishlash uchun try – except konstruksiyasi 58 21-bob: Baytlar (bytes va bytearray) 62 bytearray 62 22-bob: Biroz None (null) yoki NoneType tipi haqida 64 Pythondagi null ning ekvivalenti: None 64 None ekanlikka tekshirish 65 23-bob: Fayllar. Fayllar bilan ishlash 67 Fayldan o‘qish 67 Faylga yozish 68 24-bob: with…as – kontekst menejeri 70 25-bob: PEP8 – Pythonda kod yozish bo‘yicha qo‘llanma 72 Mundarija 72 Kodning tashqi ko‘rinishi 73 Ibora va instuksiyalarda bo‘sh joylarning ahamiyati 78 Izoh (kommentariy)lar 81 Versiyalar nazorati 82 Nomlash bo‘yicha kelishuv 82 Ko‘rsatmalar: nomlash bo‘yicha kelishuv 84 Umumiy tavsiyalar 87 26-bob: Pythonda kodni rasmiylashtirish. PEP 257 92 Rasmiylashtirish satrlari deb nimaga aytiladi? 92 Rasmiylashtirishning bitta satrli ko‘rinishlari 92 Rasmiylashtirishning ko‘p satrli ko‘rinishlari 93 27-bob: Modullar bilan ishlash: yaratish, import hamda from instruksiyalari bilan bog‘lash 95 Standart kutubxonadagi modulni bog‘lash 95 Belgilash (psevdonim)larni qo‘llash 96 from instruksiyasi 96 Pythonda shaxsiy modulni yaratish 97 28-bob: Obyektga mo‘ljallangan dasturlash. Umumiy tushunchalar 99 29-bob: Inkapsulyatsiya, vorislik, polimorfizm 101 Inkapsulyatsiya 101 Vorislik 102 Polimorfizm 102 30-bob: Operatorlarni yuklash 103 31-bob: Dekoratorlar 109 Dekorator tomonidan funksiya argumentlarining uzatilishi 111 Metodlarni dekoratsiyalash 112 Argumentli dekoratorlar 113 Dekoratorlar bilan ishlashning ayrim xususiy hollari 116 Dekoratorlarning qo‘llanilishiga oid misollar 117 32-bob: pip yordamida python-paketlarni o‘rnatish 119 pipni o‘rnatish 119 Ishni boshlash 119 pip yordamida yana nimalar qilish mumkin? 120 33-bob: Ko‘p beriladigan savollar 121 Nega menda o‘zgaruvchi qiymatga ega bo‘lsa ham, UnboundLocalError noodatiy holat xabari paydo bo‘lmoqda? 121 Pyhtonning global va lokal o‘zgaruvchilari uchun qanday qoidalar mavjud? 122 Nega takrorlanish siklida turli qiymatlar bilan aniqlangan lambda funksiyalar bir xil qiymat qaytarmoqda? 123 Bir nechta modul uchun global o‘zgaruvchilardan birgalikda foydalanishni qanday tashkil etish mumkin? 124 Importlashdan qanday unumliroq foydalanish mumkin? 124 Nega boshlang‘ich odatiy qiymat obyektlar orasida taqsimlanadi? 125 Bitta funksiyadan boshqasiga opsional va nomlangan parametrlarni qanday uzatish mumkin? 126 Nima uchun y ro‘yxatning ozgartirilishi x ro‘yxatning ham o‘zgarishiga olib keladi? 127 Nisbatan yuqoriroq darajali funksiyalarni qanday yaratish mumkin? 128 Pythonda obyektni qanday nusxalash mumkin? 129 Obyektning metod va atributlarini qanday bilish mumkin? 129 Obyektning nomini qanday bilish mumkin? 129 “vergul” operatorining ustunligi (prioriteti) nimada? 130 Pythonda “C” tilidagi “?:” ternal operatorining ekvivalenti mavjudmi? 130 Obfussirlangan bir satrlilarni yozish mumkinmi? 131 Nima uchun –22 // 10 ning natijasi –3 ga teng? 131 Satrni qanday o‘zgartirish mumkin? 131 Funksiya/metodlarni chaqirishda satrlardan qanday foydalanish mumkin? 132 Satr oxiridagi yangi satr belgilarini qanday o‘chirish mumkin? 133 Ro‘yxatdagi takrorlanuvchi elementlarni qanday o‘chirish mumkin? 133 Ko‘p o‘lchovli ro‘yxatni qanday yaratish mumkin? 133 Nega a_tuple[i] += ['item'] ishlamayapti, qo‘shish esa ishlamoqda? 134 34-bob: Python bo‘yicha topshiriqlar 136 Oddiy arifmetik operatsiyalar (1) 136 Kabisa yili (2) 136 Kvadrat (3) 136 Yil fasllari (4) 136 Bank omonati (5) 136 Oddiy sonlar (6) 136 To‘g‘ri sana (7) 136 XOR-shifrlash (8) 137 4 1-bob Python tili imkoniyatlari Mendan juda ko‘p Python tilining afzalliklari haqida so‘rashganlari uchun, men shu mavzuda un- cha katta bo‘lmagan tahliliy maqola yozishga qaror qildim. Quyida Python yordamida bajarish mumkin bo‘lgan ba’zi amallar keltirilgan: xml/html fayllar bilan ishlash; http so‘rovlar bilan ishlash; GUI (grafik interfeys); Veb-ssenariylar yaratish; FTP bilan ishlash; tasvirlar, audio va videofayllar bilan ishlash; robototexnika; ilmiy va matematik hisoblashlarni dasturlash va yana ko‘plab boshqa ishlar. Shunday qilib, Python tili zaxirali nusxalash, elektron pochtani o‘qish yoki birorta o‘yin yaratish kabi kundalik vazifalarning juda katta qismini bajarishda qo‘l kelishi mumkin. Python dasturlash tili deyarli hech qanday cheklanmagan, shuning uchun u yirik loyihalarda ham qo‘llanilishi mum- kin. Masalan, Python Google va Yandex kabi IT gigantlar tomonidan muntazam qo‘llanilib kelin- moqda. Bundan tashqari, Python tilining oddiyligi va universalligi uni eng kuchli tillardan biriga aylantirgan. 5 2-bob: Pythonni ko‘chirib olish Bugun biz Python 3 ni shaxsiy kompyuterimizga tekinga ko‘chirib olish, ro‘yxatdan o‘tish va SMSlarsiz o‘rnatib olishni o‘rganamiz :) Windowsda Pythonni o‘rnatish Pythonni biz rasmiy saytidan yuklab olamiz. Men sizlarga Pythonni boshqa sayt yoki torrentlar- dan ko‘chirmaslikni taklif qilaman, chunki ularda viruslar bo‘lishi mumkin. Dasturning o‘zi esa tekin. https://python.org/downloads/windows/ manziliga kiramiz hamda “Latest Python release” va Python 3 ni tanlaymiz. Kitobdagi ayrim misollarim Python 2 da ishlamasligi mumkin. Kitob yozilayotgan vaqtda saytdan Python 3.8.6 versiyasi joy olib ulgurgan. Pythonning joriy versiyasi tavsiflangan (ingliz tilida) sahifa hosil bo‘ladi. Sahifaning oxiriga o‘tib, Download / Скачать tanlanganda, eng oxirgi versiyani yuklash sahifasi hosil bo‘ladi: Bundan tashqari, siz yuklab olishingiz mumkin bo‘lgan fayllar ro‘yxatini ham ko‘rishingiz mumkin. Bizga (agar sistemamiz 32 bitli bo‘lsa) Windows x86 MSI installer yoki (agar sistemamiz 64 bitli bo‘lsa) Windows x86-64 MSI installerlaridan biri kerak. Shu fayylarni o‘zi kifoya. Shundan keyin yuklangan faylni ochamiz. Fayl Python Software Foundation tomonidan imzolan- gan bo‘lsa, demak, hammasi joyida. O‘rni kelganda eslatib o‘tmoqchiman, tasdiqlanmagan yoki ishonchsiz tasdiqlangan.exe kengaytmali fayllarni ochishdan saqlanish kerak! 6 Install Now yoki Установить сейчас degan buyruqni tanlaymiz. Barcha foydalanuvchilar uchun yoki faqat bir kishi uchun o‘rnatishni tanlaymiz (qaysi birini tanlash sizning ixtiyoringizda): O‘rnatish uchun papka manzilini tanlaymiz. Men bu yerda ko‘rsatilgan papkani o‘zgarishsiz qoldi- raman. Siz esa o‘z diskingizdagi ixtiyoriy papkani tanlashingiz mumkin. Pythonni o‘rnatish yakuniga yetishini kutamiz… Finish. Tabriklayman. Siz shaxsiy kompyuteringizga Pythonni o‘rnatdingiz! Bundan tashqari, Win- 7 dows uchun mo‘ljallangan Python o‘rnatuvchisining tarkibida IDLE ham mavjud. Siz birdan o‘zin- gizning birinchi dasturingizni yozishngiz mumkin. Pythonni Linux tizimlar (Ubuntu, Linux Mint va boshqalar) da o‘rnatish Konsolni oching (odatda, Ctrl+Alt+T). Konsolga quyidagi buyruqni kiriting: python3 Sizning ekraningizda Python 3 qutlovi hosil bo‘ladi. Python 3.8.6 (default, Oct 6 2020, 13:05:11) [GCC 4.8.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>> Agar shunday bo‘lsa, u holda sizni tabriklasak bo‘ladi. Kompyuteringizga Python 3 o‘rnatilibdi. Aks holda, *Python 3* paketini o‘rnatish kerak bo‘ladi: sudo apt-get install python3 Bu ishni, sizning xohishingizga ko‘ra, ubuntu/ ilovalar markazi orqali miniinstaller/synaptic orqali ham amalga oshirish mumkin. Linux uchun Pythonning tarkibida oldindan o‘rnatilgan IDLE mavjud emas. Agar istasangiz, uni alohida o‘rnatish mumkin. Paket *idle3* deb nomlanadi (oldinroq chiqarilgan versiyalarda u Py- thon 3-idle deb nomlanishi ham mumkin). 8 Lekin uni o‘rnatish shart ham emas. Siz o‘zingizga yoqadigan matn muharriringizda (gedit, vim, emacs) dasturlarni yozishingiz va ularni konsol orqali ishga tushirishingiz ham mumkin. python3 path_to_file.py Endi siz o‘zingizning birinchi dasturingizni yozishingiz mumkin. Bu ishni o‘z xohishingizga ko‘ra IDLEda yoki yoqtirgan matn muharriringizda bajarishingiz mumkin. 9 3-bob: Birinchi dastur. IDLE dasturlash muhiti Bugun biz siz bilan IDLE dasturlash muhitida o‘zimizning birinchi dasturimizni yaratamiz. Python- ni ko‘chirib olib o‘rnatganimizdan keyin IDLEni ishga tushiramiz (Distributiv bilan birga beriladigan Pythton dasturlash muhiti). Bu yerda va bundan keyin, menda Windows o‘rnatilganligi sababli, shu tizim uchun misollarni keltiraman. IDLEni ishga tushiramiz (odatda, interfaol rejimda ishga tushadi), endi o‘zimizning ilk dasturim- izni yozishni boshlashimiz mumkin. Har doimgidek, bizning birinchi dasturimiz – “Hello world!” dasturi bo‘ladi. Pythonda “Hello world!”ni chiqarish uchun bittagina satr yetarlidir: >>> print("Hello, World!") Bu satrni IDLEda kiritamiz va Enter tugmachasini bosamiz. Natijani esa siz quyidagi tasvirda ko‘rishingiz mumkin: Python 3.9.0 Shell File Edit Shell Debug Opons Window Help Python 3.9.0 (tags/v3.9.0:9cf6752, Oct 5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license()" for more information. >>> print("Hello, World!") Hello world! >>> Tabriklayman, Siz Pythonda o‘zingizning ilk dasturingizni yozdingiz! Interfaol rejim bilan biz tanishib chiqdik. Bir necha tajriba o‘tkazib, siz uni batafsilroq o‘rganishin- giz mumkin. Masalan, quyidagilarni kiritib ko‘ring: 10 >>> print("Assalomu alaykum!") >>> print("Mening ismim Anvar.") >>> print("Diqqatingiz uchun rahmat!") Lekin interfaol rejim biz uchun asosiy rejim hisoblanmaydi. Siz, asosan, o‘z dasturlaringizni faylli rejimda saqlab, ularning fayl ko‘rinishini ishga tushirasiz. IDLE interfaol rejimida yangi fayl yarat- ish uchun File — New File buyruqlarini tanlang (yoki Ctrl+N kombinatsiyasini bosing). Python 3.9.0 Shell File Edit Shell Debug Opons Window Help Python New File 3.9.0 (tags/v3.9.0:9cf6752, Ctrl + N Oct 5 2020, 15:34:40) [MSC v.1927 64 bit Open... (AMD64)] Ctrl + O on win32 Open Module... Type Ctrl + M "help", "copyright", "credits" or "license()" for more information. Recent Files Module BrowserAlt + C >>> print("Hello, World!") Hello world! Save Ctrl + S >>> Save As... Ctrl + Shi + S Save Copy As... Alt + Shi + S Print Window Ctrl + P Close Alt + F4 Exit Ctrl + Q Hosil bo‘lgan oynada quyidagi kodni kiriting: name = input("Ismingiz nima?") print("Assalomu alaykum,", name) Birinchi satr Ismingiz nima? savolini chiqaradi hamda sizning biror narsa yozib, Enter tugmach- asini bosishingizni kutadi hamda kiritilgan matnni name o‘zgaruvchisida saqlaydi. Ikkinchi satrda biz matnni ekranga chiqarish uchun print() funksiyasidan foydalanamiz. Bu yerda Assalomu alaykum, matni hamda name o‘zgaruvchisidagi matnni chiqarish amalga oshirilm- oqda. Endi esa F5 ni bosamiz (yoki IDLEning Run menyusidagi Run Module buyrug‘ini tanlaymiz) va biz yozgan dasturimizning ishlayotganiga ishonch hosil qilamiz. Dasturimizni ishga tushirish- dan oldin IDLE bizga uni saqlashni taklif qiladi. Sizga qulay bo‘lgan joyda saqlaymiz va dasturimiz ishga tushganini ko‘ramiz. Natija taxminan mana shunday bo‘lishi lozim (chapda natija, o‘ngda siz tuzgan dastur matni): 11 Python 3.9.0 Shell File Edit Shell Debug Opons Window Help Python 3.9.0 (tags/v3.9.0:9cf6752, Oct 5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license()" for more information. >>> ============= RESTART: C:/Users/Programs/Python/Python39/name.py ============= Ismingiz nima? Muhammadsaid Assalomu alaykum, Muhammadsaid >>> name.py File Edit Shell Debug Opons Window Help # name.py # Foydalanuvchining ismini so'raydigan dastur. name = input("Ismingiz nima?") print("Assalomu alaykum,", name) Tabriklayman! Siz IDLE interfaol rejimi bilan tanishdingiz va oddiy dasturlarni yozishni o‘rgandin- giz. Endi ozroq dam olib, so‘ngra Pythonni o‘rganishda davom etish mumkin. Bundan buyog‘iga biz Python sintaksisi, takrorlash sikllari va tarmoqlanishni o‘rganamiz. 12 4-bob: Python tili sintaksisi Python tilining sintaksisi ham tilning o‘zi kabi juda sodda. Sintaksis Satrning yakuni ifodaning ham yakuni hisoblanadi (nuqtali vergul talab etilmaydi). Ichki ko‘rsatmalar qoldirilgan bo‘sh joylarga qarab bloklarga birlashtiriladi. Bosh joylar soni ixtiyoriy bo‘lishi mumkin; asosiysi, bitta ichki blok chegarasida bo‘sh joylar soni bir xil bo‘li- shi lozim. Bu yerda kodning oson o‘qilishiga ham e’tibor qaratish kerak. Masalan, 1 ta bo‘sh joy tashlash – mumkin emas. Yaxshisi, 4 ta bo‘sh joy tashlang (yoki, hech bo‘lmaganda, tabulyatsiyadan Tab foydalaning). Pythonda ichki ko‘rsatmalar bitta shablon asosida yoziladi: asosiy ko‘rsatma ikkita nuqta bilan yakunlanganda, undan keyin, odatda, kod bloki bir xil bo‘sh joy tashlagan holda yozila- di. asosiy ko‘rsatma: ichki ko‘rsatmalar bloki Ba’zi maxsus hollar Bitta ko‘rsatmani bir nechta satrda ham yozish mumkin. Buning uchun ifodani oddiy yum- aloq, kvadrat yoki figurali qavslardan birining ichiga olish kifoya: if (a == 1 and b == 2 and c == 3 and d == 4): # Ikki nuqtani ham esdan chiqarmaymiz print('spam' * 3) Tarkibiy ko‘rsatma asosiy ko‘rsatma bilan bir satrda ham joylashishi mumkin, lekin bunda tarkibiy ko‘rsatma ham, o‘z navbatida, tarkibiy ko‘rsatmalardan iborat bo‘lmasigi kerak. Umid qilamanki, siz buni yaxshi tushundingiz :D. Keling, yaxshisi, bunga bir misol keltiray: if x > y: print(x) Sintaksisni to‘liq tushunish, albatta, tajriba ortishi bilan amalga oshadi, shuning uchun ham “Dasturlarga misollar” bo‘limiga nazar tashlashni maslahat beraman. Bundan tashqari, PEP8 – Pythonda kod yozish bo‘yicha qo‘llanma hamda “Pythonda kodni rasmiylashtirish” PEP 257 bilan ham tanishishni maslahat beraman. 13 5-bob: Dastur ishlamayapti. Nima qilish kerak? Maqsadlar Mening dasturim ishlamayapti. Nima qilish kerak? Bu bobda men Python 3 da dasturlashni bosh- layotganlarda eng ko‘p uchraydigan xato va kamchiliklarni ko‘rib chiqib, ularni bartaraf etish haqi- da so‘z yuritaman. Ushbu bobda xar-xil muammolarga yechimlar keltirilgan. Ayrim muammolarni siz bilmasligingiz mumkin. Muammolar Muammo: Dastur ishga tushmayapti. Bir sekundga qora oyna hosil bo‘lib, keyin yo‘qolmoqda. Sabab: Dastur ishini yakunlagach (butun kod bajarib bo‘lingach yoki noodatiy holat yuzaga kel- ganda), dastur yakunlanadi. Agar dasturni uning ikonkasidagi chap tugmachani ikki marta bosish orqali ishga tushurgan bo‘lsangiz (o‘ylaymanki, siz aynan shunday qilgan bo‘lishingiz mumkin), bu dastur xabari bo‘lgan oyna bilan birga yopiladi. Yechim: Dasturni IDLE yoki konsol orqali ishga tushirish lozim. Muammo: input() funksiyasi ishlamayapti. SyntaxError yozuvi chiqib qolmoqda. >>> a = input() hello world File "", line 1 hello world ^ SyntaxError: unexpected EOF while parsing Sabab: Siz Python 2 ni ishga tushirgansiz. Yechim: Python 3 ni o‘rnatish lozim. Muammo: Qayerdadir oddiy bir dasturni ko‘rib qoldim, u esa ishlamayapti. name = raw_input() print name Va natijada: File "a.py", line 3 print name ^ SyntaxError: invalid syntax 14 Sabab: Sizga Python 2 da tuzilgan dasturni berishgan. Yechim: Python 2 bilan Python 3 farqlari haqida o‘qib chiqishingiz kerak. Dasturni Python 3 ga moslashtirib, yozib chiqish lozim. Masalan, yuqoridagi dastur Python 3 da quyidagicha ko‘rinish- da bo‘ladi: name = raw_input() print name Muammo: TypeError: Can't convert 'int' onject to str implicitly. >>> a = input() + 5 8 Traceback (most recent call last): File "", line 1, in TypeError: Can't convert 'int' object to str implicitly Sabab: Satr bilan sonni o‘zaro qo‘shib bo‘lmaydi. Yechim: Satrni int() funksiyasi yordamida songa aylantirish lozim. Bu yerda input() funksiyasi har doim satrni qaytarishiga e’tibor qiling. >>> a = int(input()) + 5 8 >>> a 13 Muammo: SyntaxError: invalid syntax. a = 5 if a == 5 print('Ura!') Va natijada: File "a.py", line 3 if a == 5 ^ SyntaxError: invalid syntax Sabab: Ikki nuqta esdan chiqib qolgan. Yechim: a = 5 if a == 5: print('Ura!') 15 Muammo: NameError: name 'a' is not defined print(a) Sabab: a o‘zgaruvchisi mavjud emas. Siz o‘zgaruvchini yozishda xato qilgansiz yoki bu o‘zgaru- vchini hali e’lon qilmagansiz. Yechim: Yozuvdagi xatoni to‘g‘rilash lozim. a = 10 print(a) Muammo: IndentationError: expected an indented block. a = 10 if a > 0: print(a) Sabab: Bo‘sh joy tashlash kerak. Yechim: a = 10 if a > 0: print(a) Muammo: TabError: inconsistent use of tabs and spaces in indentation. a = 10 if a > 0: print(a) print('Ura!') Natijada quyidagi xatolik: File "a.py", line 5 print('Ura!') ^ TabError: inconsistent use of tabs and spaces in indentation Sabab: Joy tashlanganda bo‘sh joylar va tabulyatsiyadan aralash tarzda foydalanilgan. Yechim: Bo‘sh joylarni to‘g‘ri tashkil qilish lozim: 16 a = 10 if a > 0: print(a) print('Ura!') Muammo: UnboundLocalError: local variable 'a' referenced before assignment. def f(): a += 1 print(a) a = 10 f() Natijada quyidagi xatolik: Traceback (most recent call last): File "a.py", line 7, in f() File "a.py", line 3, in f a += 1 UnboundLocalError: local variable 'a' referenced before assignment Sabab: Hali yaratilmagan lokal o‘zgaruvchiga murojaat qilingan. Yechim: def f(): global a a += 1 print(a) a = 10 f() Muammo: Dastur ishladi, lekin faylga hech narsa yozilmadi/hammasi yozilmadi. >>> f = open('output.txt', 'w', encoding='utf-8') >>> f.write('bla') 3 >>> Sabab: Fayl yopilmagan. Ma’lumotlarning bir qismi buferda qolib ketgan bo‘lishi mumkin. Yechim: Bo‘sh joylarni to‘g‘ri tashkil qilish lozim: 17 >>> f = open('output.txt', 'w', encoding='utf-8') >>> f.write('bla') 3 >>> f.close() >>> Muammo: Bu yerda muammoni o‘zingiz keltirib chqargan bo‘lishingiz ham mumkin. Izohi esa pastroqda :D 18 6-bob: if-elif-else konstruksiyasi. Rostlikka tekshirish. if/else uch bo‘ginli qurilishi if-elif-else shartli konstruksiyasi (uni ba’zan tarmoqlanish operatori deb ham atashadi) – Pythondagi asosiy tanlash qurilishidir. Boshqacha aytganda, u qaysi amalni bajarish kerakligini shartni tekshirish vaqtidagi o‘zgaruvchilar qiymatlaridan keyin chiqqan holda tanlaydi. if instruksiyasining sintaksisi Dastlab if ning shartli iborali qismi yoziladi, so‘ngra bitta yoki bir nechta majburiy bo‘lmagan elif qismlari va oxirida majburiy bo‘lmagan else qismi yoziladi. if shartli ko‘rsatmasining umumiy ko‘rinishi quyidagicha bo‘ladi: if test1: blok1 elif test2: blok2 else: blok3 Oddiy misol (true ni chiqaradi, chunki 1 – rost): >>> if 1:... print('true')... else:... print('false')... true Ozgina qiyinroq misol (uning natijasi foydalanuvchi nimani kiritishiga bog‘liq bo‘ladi): a = int(input()) if a < -5: print('Low') elif -5 > A = 't' if 'spam' else 'f' >>> A t 20 7-bob: for va while sikllari. break va continue operatorlari. else sehrli so‘zi Ushbu bo‘limda biz for va while takrorlash sikllari, break va continue operatorlari haqida, bundan tashqari, sikllar bilan birga qo‘llanilganda dasturni tushunishni yanada osonlashtiradigan else so‘zi haqida gaplashamiz. while sikl operatori while — Pythondagi eng universal takrorlanish operatorlaridan biri bo‘lib, va shu sababli sekin ishlaydi. U shart rost qiymat qabul qilgan holatlar uchun sikl tanasini bajaraveradi. >>> i = 5 >>> while i < 15: print(i) i = i + 2 5 7 9 11 13 for sikl operatori for takrorlash operatori biroz murakkabroq bo‘lib, juda ham universal emas, ammo while oper- atoriga nisbatan tezkor hisoblanadi. Bu operator har qanday iteratsiyalanuvchi obyekt (masalan, satr yoki ro‘yxat)ni bir-bir ko‘rib chiqib, har bir takrorlanish vaqtida takrorlanishlar tanasini bajara- di. >>> for i in 'hello world': print(i * 2, end='') hheelllloo wwoorrlldd continue operatori continue operatori takrorlanishlar tanasining (for yoki while) qolgan qismini bajarmasdan, uni tashlab o‘tib, keyingi takrorlanishni boshlaydi. >>> for i in 'hello world': if i == 'o': continue print(i * 2, end='') hheellll wwrrlldd 21 break operatori break operatori takrorlanishlarni muddatidan oldin yakunlaydi. >>> for i in 'hello world': if i == 'o': break print(i * 2, end='') hheellll else sehrli so‘zi for yoki while operatorlari tarkibida qo‘llanilganda, else so‘zi takrorlanishlardan odatiy holda yoki break yordamida chiqilganligini tekshirish uchun ishlatiladi. else ning tarkibidagi ko‘rsat- malar bloki takrorlanishlar tanasidan chiqish faqat break operatorisiz amalga oshirilgandagina bajariladi. >>> for i in 'hello world': if i == 'a': break else: print('Satr tarkibida a harfi yo‘q.') Satr tarkibida a harfi yo‘q. 22 8-bob: Kalit so‘zlar. keyword moduli Bu bo‘limda Pythondagi kalit so‘zlar haqida qisqacha so‘z yuritish bilan birga keyword moduli haqida ham tushuncha berib o‘taman. Kalit so‘zlar False — yolg'on. True — rost. None — “bo‘sh” obyekt. and – mantiqiy va. with/as – kontekst menejeri. assert – agar shart yolg‘on bo‘lsa, noodatiy holni ishga tushiradi. break – takrorlanish tanasidan chiqish. class – turli metod va atributlardan iborat foydalanuvchi tipi. continue – takrorlanish tanasining keyingi takrorlanishiga o‘tish. def – funksiyani e’lon qilish. del – obyektni o‘chirish. elif – aks holda, agar. else – qarang: for/else va if/else. except – noodatiy holatga o‘tish. finally – try instruksiyasi bilan birgalikda, noodatiy holat yuzaga kelishi yoki kelmasligidan qat’iy nazar ko‘rsatmani bajaradi. for – for takrorlanish operatori. from – modul tarkibidan bir necha funksiyani import qilish. global – funksiyaning tarkibida e’lon qilingan o‘zgaruvchini shu funksiyadan tashqarida ham qo‘llash imkonini beradi. if – agar. import – modulni import qilish. in – tarkibida ekanligini tekshirish. is – 2 ta obyekt xotiradagi bitta manzilga ko‘rsatmaga ega ekanligini tekshirish. lambda – anonim (nomsiz) funksiyani e’lon qilish. nonlocal – funksiya tarkibida e’lon qilingan o‘zgaruvchiga shu funksiyani o‘z ichiga olgan boshqa funksiyadan murojaat qilish imkonini beradi. not – mantiqiy emas. 23 or – mantiqiy yoki. pass – hech qanday amal bajarmaydigan ko‘rsatma. raise – noodatiy holatni faollashtirish. return – natijani qaytarish. try – noodatiy holatlarni aniqlab, ko‘rsatmalarni bajarish. while – while takrorlash operatori. yield – funksiya-generatorni aniqlash. keyword moduli Umuman olganda, keywordni modul hisoblamaslik ham mumkin, ammo u: keyword.kwlist – barcha mavjud kalit so‘zlar ro‘yxatini o‘zida mujassam etadi; keyword.iskeyword(satr) – satrning kalit so‘z ekanligini tekshiradi. 24 9-bob: Tarkibiy funksiyalar Python 3 tarkibidagi funksiyalarning qisqa tavsifi quyidagilardan iborat. Tiplarni o‘zaro almashtiruvchi tarkibiy tiplar bool(x) – rostlikka tekshirish orqali bool tipiga almashtirish. x yolg‘on yoki yozilmagan bo‘lsa, False qiymatni, aks holda True qiymatni qaytaradi. bytearray([manba[kodi[xatoliklar]]]) – bytearrayga almashtirish. bytearray – 0' obyektni o'ng tomonga tekislash. '=' to'ldiruvchi belgidan keyin, lekin raqamlardan oldinda joylashadi. Faqat sonli tiplar bilan qo'llanilganda ishlaydi. '^' markaziy tekislash. Belgi opsiyasi faqatgina sonlar uchun qo'llanilib, quyidagi qiymatlarni qabul qilishi mumkin: Belgi Vazifasi '+' belgi barcha sonlar uchun qo'llanilishi kerak. '-' '-' manfiylar uchun, hech narsa musbatlar uchun. 'Bosh joy' '-' manfiylar uchun, bo'sh joy musbatlar uchun. Tip maydoni quyidagicha qiymatlarni qabul qilishi mumkin: Belgi Vazifasi 'd', 'i', 'u' o'nlik son. 'o' sakkizlik sanoq tizimidagi son. 'x' o'n oltilik sanoq tizimidagi son (harflar quyi registrda). 42 'X' o'n oltilik sanoq tizimidagi son (harflar yuqori registrda). 'e' eksponentali va siljuvchi nuqtali son (ekspo- nenta quyi registrda). 'E' eksponentali va siljuvchi nuqtali so n(ekspo- nenta yuqori registrda). 'f', 'F' siljuvchi nuqtali son (odatiy format). 'g' eksponentali va siljuvchi nuqtali son (ekspo- nenta quyi registrda) agar u –4 dan kichik yoki aniqlikda bo'lsa, aks holda odatiy format. 'G' eksponentali va siljuvchi nuqtali son (ekspo- nenta yuqori registrda) agar u –4 dan kichik yoki aniqlikda bo'lsa, aks holda odatiy format. 'c' Simvol (bir simvolli satr yoki simvol kodi bo'lgan son). 's' satr. '%' son 100 ga ko'paytiriladi, siljuvchi nuqtali son ko'rsatiladi va undan keyin % belgisi qo'yiladi. Yakunida esa bir nechta misol: >>> coord = (3, 5) >>> 'X: {0} ; Y: {0} '.format(coord) 'X: 3; Y: 5' >>> "repr() shows quotes: {!r} ; str() doesn't: {!s} ". format('test1', 'test2') "repr() shows quotes: 'test1'; str() doesn't: test2" >>> '{:30} '.format('right aligned') ' right aligned' >>> '{:^30} '.format('centered') ' centered ' >>> '{:*^30} '.format('centered') # use '*' as a fill char '***********centered***********' >>> '{:+f} ; {:+f} '.format(3.14, -3.14) # show it always '+3.140000; -3.140000' >>> '{: f} ; {: f} '. format(3.14, -3.14) # show a space for positive numbers ' 3.140000; -3.140000' >>> '{:-f} ; {:-f} '. format(3.14, -3.14) # show only the minus -- same as '{:f}; {:f}' '3.140000; -3.140000' >>> # format also supports binary numbers 43 >>> "int: {0:d} ; hex: {0:x} ; oct: {0:o} ; bin: {0:b} ".format(42) 'int: 42; hex: 2a; oct: 52; bin: 101010' >>> # with 0x, 0o, or 0b as prefix: >>> "int: {0:d} ; hex: {0:#x} ; oct: {0:#o} ; bin: {0:#b} ".format(42) 'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010' >>> points = 19.5 >>> total = 22 >>> 'Correct answers: {:.2%} '.format(points/total) 'Correct answers: 88.64%' 44 14-bob: Ro‘yxatlar (list). Ro‘yxatlarning funksiya va metodlari Bu bobda biz ro‘yxatlar (list) deb nomlangan yana bir ma’lumotlar tipi, ular ustida bajariladigan amallar, ularning metodlari, ro‘yxatlar generatorlari hamda ro‘yxatlarning amaliyotda qo‘llanilishi haqida gaplashamiz. Ro‘yxatlar nima? Python tilida ro‘yxatlar deb, tartiblangan, o‘zgartirish mumkin bo‘lgan ixtiyoriy tipdagi obyektlar jamlanmasiga aytiladi. Ro‘yxatlardan foydalanish uchun, eng avvalo, ularni yaratish kerak. Ro‘yxatlarni bir necha metod- dan biri orqali yaratish mumkin. Masalan, har qanday iteratsiyalanuvchi obyektlarni list() funksi- yasi yordamida qayta ishlash mumkin. >>> list('Ro'yxat') ['R', 'o', ''', 'y', 'a', 't'] Ro‘yxatni literallar yordamida ham yaratish mumkin. >>> s = [] # Bo'sh ro'yxat >>> l = ['r', 'o', [''yxat'], 2] >>> s [] >>> l ['r', 'o', [''yxat'], 2] Misolda ko‘rinib turibdiki, ro‘yxat har qanday obyektlarning (shu jumladan, ichki ro‘yxatlarning ham) ixtiyoriy sondagi to‘plamidan iborat bo‘lishi yoki umuman bo‘sh bo‘lishi ham mumkin ekan. Ro‘yxatlar yaratishning yana bir metodi bu – ro‘yxatlar generatoridir. Ketma-ketlikning har bir elementiga nisbatan biror amalni qo‘llash orqali yangi ro‘yxat yaratish metodi ro‘yxatlar generatori deb ataladi. Ro‘yxatlar generatorlari for takrorlash operatoriga juda ham o‘xshab ketadi: >>> c = [c * 3 for c in 'ro`yxat'] >>> c ['rrr', 'ooo', '```', 'yyy', 'xxx', 'aaa', 'ttt'] Ro‘yxatlar generatorining yanada murakkabroq konstruksiyalari ham mavjud: >>> c = [c * 3 for c in 'ro`yxat' if c != '`'] >>> c ['rrr', 'ooo', 'yyy', 'xxx', 'aaa', 'ttt'] >>> c = [c + d for c in 'list' if c != 'i' for d in 'spam' if d != 'a'] >>> c ['ls', 'lp', 'lm', 'ss', 'sp', 'sm', 'ts', 'tp', 'tm'] 45 Lekin murakkab vaziyatlarda ro‘yxatlar yaratish uchun oddiy for takrorlash operatoridan foydalan- gan afzalroq. Ro‘yxatlarning funksiya va metodlari Ro‘yxatni yaratishga-ku yaratib qo‘ydik, endi ular bilan ishlash metodlarini ham batafsilroq ko‘rib chiqaylik. “Ro‘yxatlar metodlari” jadvali Metod Vazifasi list.append(x) Ro‘yxat oxirida element qo‘shadi. list.extend(L) List ro‘yxatining oxiriga L ro‘yxatining barcha elementlrini qo‘shish orqali list ro‘yxatini ken- gaytiradi. list.insert(i, x) x qiymatini ro‘yxatning i-pozitsiyasiga qo‘yadi. list.remove(x) Ro‘yxatdagi x qiymatga ega bo‘lgan birinchi ele- mentni o‘chiradi. Agar bunday element mavjud bo‘lmasa, ValueError yuzaga keladi. list.pop([i]) i-elementni o‘chiradi va uni qaytaradi. Agar indeks ko‘rsatilmagan bo‘lsa, u holda oxirgi elementni o‘chiradi. list.index(x,[start [, end]]) x qiymatli birinchi elementning pozitsiyasini qaytaradi (bunda izlash startdan boshlanib, endgacha davom ettiriladi). list.count(x) x qiymatli elementlarning sonini qaytaradi. list.sort([key=funksiya) funksiya asosida ro‘yxatni tartibga soladi. list.reverse() Ro‘yxatni teskari tartibga o‘tkazadi. list.copy() Ro‘yxatning yuzaki nusxasi. list.clear() Ro‘yxatni tozalaydi. Ta’kidlash joizki, satrlar metodlaridan farqli ravishda (ro‘yxatlar o‘zgartirish mumkin bo‘lgan obyektlar bo‘lganligi sababli) ro‘yxatlarning metodlari shu ro‘yxatlarning o‘zlariga o‘zgartirishlar kiritadi. Shuning uchun ham o‘zgartirish natijasini shu o‘zgaruvchiga qayta yozish talab etilmaydi. >>> l = [1, 2, 3, 5, 7] >>> l.sort() >>> l [1, 2, 3, 5, 7] >>> l = l.sort() >>> print(l) None Yakunida ro‘yxatlar bilan ishlashga oid ba’zi misollarni keltirib o‘tamiz: 46 >>> a = [66.25, 333, 333, 1, 1234.5] >>> print(a.count(333), a.count(66.25), a.count('x')) 2 1 0 >>> a.insert(2, -1) >>> a.append(333) >>> a [66.25, 333, -1, 333, 1, 1234.5, 333] >>> a.index(333) 1 >>> a.remove(333) >>> a [66.25, -1, 333, 1, 1234.5, 333] >>> a.reverse() >>> a [333, 1234.5, 1, 333, -1, 66.25] >>> a.sort() >>> a [-1, 1, 66.25, 333, 333, 1234.5] Kamdan-kam holatlarda samaradorlikni oshirish maqsadida ro‘yxatlarning o‘rnida ularga nisbatan imkoniyatlari ozroq bo‘lgan massivlardan foydalaniladi. (Odatda, bunday holatlarda NumPy kabi chetki kutubxonalardan foydalaniladi.) 47 15-bob: Indekslar va kesimlar Bu bobda biz indeks va kesimlar bilan ishlash amallarini ko‘rib chiqamiz. Indeksi bo‘yicha elementni olish Boshqa dasturlash tillaridagi kabi indeks bo‘yicha olish: >>> a = [1, 3, 8, 7] >>> a 1 >>> a 7 >>> a Traceback (most recent call last): File "", line 1, in IndexError: list index out of range Ko‘plab boshqa tillar kabi bu yerda ham raqamlash noldan boshlanadi. Mavjud bo‘lmagan indeks- ga murojaat qilishga urinish natijasida IndexError xatoligi yuzaga keladi. Yuqoridagi misolimizda a o‘zgaruvchisi ro‘yxat edi. Bundan tashqari, boshqa tipdagi, masalan, satr va kortejlarda ham indeksi bo‘yicha elementiga murojaat qilish mumkin. Pythonda, bundan tashqari, manfiy indekslardan ham foydalanish mukin, bunday holda tartiblash ro‘yxat oxiridan boshlab amalga oshiriladi. >>> a = [1, 3, 8, 7] >>> a[-1] 7 >>> a[-4] 1 >>> a[-5] Traceback (most recent call last): File "", line 1, in IndexError: list index out of range Kesimlar Pythonda indekslardan tashqari yana kesimlar ham mavjud. item[START:STOP:STEP] – START nomeridan STOP gacha (uning o‘zi kirmaydi), STEP qadam bi- lan elementlarni oladi. Boshqa qiymat ko‘rsatilmasa, odatda, START=0, STOP=obyekt uzunligiga, STEP=1. Demak, qaysidir (hatto barcha) parametrlar tushirib qoldirilishi mumkin 48 >>> a = [1, 3, 8, 7] >>> a[:] [1, 3, 8, 7] >>> a[1:] [3, 8, 7] >>> a[:3] [1, 3, 8] >>> a[::2] [1, 8] Bundan tashqari, bu parametrlar manfiy qiymatlarni ham qabul qilishi mumkin: >>> a = [1, 3, 8, 7] >>> a[::-1] [7, 8, 3, 1] >>> a[:-2] [1, 3] >>> a[-2::-1] [8, 3, 1] >>> a[1:4:-1] [] Oxirgi misolimizda bo‘sh ro‘yxat hosil bo‘ldi, chunki START < STOP va STEP manfiy. Xuddi shunday holat qiymatlar diapazoni obyektdan tashqarini ko‘rsatganda yuz beradi. >>> a = [1, 3, 8, 7] >>> a[10:20] [] Bundan tashqari, kesimlar yordamida nafaqat elementlarni olish, balki ularni qo‘shish yoki o‘chir- ish ham mumkin (albatta, faqat o‘zgartirish mumkin bo‘lgan ketma-ketliklar uchun). >>> a = [1, 3, 8, 7] >>> a[1:3] = [0, 0, 0] >>> a [1, 0, 0, 0, 7] >>> del a[:-3] >>> a [0, 0, 7] 49 16-bob: Kortejlar (tuple) Bu bobda biz kortejlar va ularning qollanilishi haqida so‘z yuritamiz. Kortej, o‘zining xususiyatlariga ko‘ra, o‘zgarmaydigan ro‘yxatdir. Ro‘yxatlar turganda, kortejlar nima uchun kerak? Xatoliklardan himoya. Ya’ni kortejlar bilib turgan holda (bu yomon) va bilmasdan (bu, albat- ta, yaxshi) o‘zgarishlardan himoyalangan. Kichikroq hajm. Mana bir misol: >>> a = (1, 2, 3, 4, 5, 6) >>> b = [1, 2, 3, 4, 5, 6] >>> a.__sizeof__() 36 >>> b.__sizeof__() 44 Kortejlardan lug‘atlarning kalitlari sifatida foydalanish mumkinligi: >>> d = {(1, 1, 1) : 1} >>> d {(1, 1, 1): 1} >>> d = {[1, 1, 1] : 1} Traceback (most recent call last): File "", line 1, in d = {[1, 1, 1] : 1} TypeError: unhashable type: 'list' Kortejlar bilan qanday ishlanadi? Kortejlarning afzalliklari bilan tanishib chiqdik. Endi, ular bilan qanday ishlash mumkin, degan savol yuzaga keladi. Bu obyektlar bilan ishlash ro‘yxatlar bilan ishlashdan deyarli farq qilmaydi. Keling, bitta bosh kortej yaratamiz: >>> a = tuple() # tuple() tarkibiy funksiyasi yordamida >>> a () >>> a = () # kortej literali yordamida >>> a () >>> 50 1 ta elementli kortej yaratamiz: >>> a = ('s') >>> a 's' Lekin bu misolimiz natijasida satr hosil bo‘ldi. Biz esa kortej yaratmoqchi edik. Kortejni qanday yaratishimiz mumkin? >>> a = ('s', ) >>> a ('s',) Mana, kerakli natijaga ega bo‘ldik. Hamma gap vergulda ekan. Qavslarning o‘zi hech narsani bildirmaydi. Aniqrog‘I, bildiradi-yu, ularning ichida bitta bosh joy, satr ko‘chishi yoki boshqa ele- mentlar bilan ajratilishi mumkin bo‘lgan element joylashishini bildiradi. Bundan tashqari, kortejni mana bu metodda ham yaratish mumkin: >>> a = 's', >>> a ('s',) Lekin, baribir, chalg‘imang va qavslarni har doim qo‘yishga odatlaning, chunki ba’zi hollarda ularni qo‘ymaslikning iloji bo‘lmaydi. Iteratsiyalanadigan obyektlardan kortej yaratish uchun esa avval ko‘rganimiz – tuple() funksiyasi qo‘llaniladi. >>> a = tuple('hello, world!') >>> a ('h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!') Kortejlar bilan bajariladigan operatsiyalar Ro‘yxatlarni o‘zgartirmaydigan barcha amallarni kortejlarga nisbatan ham qo‘llash mumkin (chun- ki kortejlar o‘zgarmaydigan ro‘yxatlardir). Bundan tashqari, elementlar o‘rinlarini turli metodlar yordamida almashtirish ham mumkin. Masalan, Python tili dasturchilarining faxri bo‘lgan ikkita o‘zgaruvchining qiymatlarini o‘zaro al- mashtirish kabi: a, b = b, a 51 17-bob: Lug‘atlar (dict) va ular bilan ishlash. Lug‘atlarning metodlari Bu bobda biz lug‘atlar (dict) deb nomlangan yana bir obyektlar tipi haqida gaplashamiz. Bu yerda lug‘atlar bilan ishlash, ular ustida bajariladigan amallar, metodlari va lug‘atlar generatorlari borasi- da so‘z yuritamiz. Pythonda lug‘atlar – kalit bo‘yicha murojaat qilish mumkin bo‘lgan ixtiyoriy obyektlarning tarti- blanmagan to‘plami. Ba’zan ularni assotsiativ massivlar yoki xesh-jadvallar deb ham atashadi. Lug‘at bilan ishlash uchun, dastlab uni yaratib olishimiz kerak. Ularni bir necha metodda yaratish mumkin. Birinchi metodimiz – literallar yordamida yaratish: >>> d = {} >>> d {} >>> d = {'dict': 1, 'dictionary': 2} >>> d {'dict': 1, 'dictionary': 2} Ikkinchi metod esa dict() funksiyasidan foydalanish metodidir: >>> d = dict(short='dict', long='dictionary') >>> d {'short': 'dict', 'long': 'dictionary'} >>> d = dict([(1, 1), (2, 4)]) >>> d {1: 1, 2: 4} Uchinchi metod – fromkeys metodidan foydalanish: >>> d = dict.fromkeys(['a', 'b']) >>> d {'a': None, 'b': None} >>> d = dict.fromkeys(['a', 'b'], 100) >>> d {'a': 100, 'b': 100} To‘rtinchi metod – ro‘yxatlar generatoriga juda o‘xshab ketadigan lug‘atlar generatorlaridan foyda- lanish: >>> d = {a: a ** 2 for a in range(7)} >>> d {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36} 52 Endi bu lug‘atlarimizga birorta yozuvni qo‘shishga hamda kalitlar bo‘yicha qiymatlarga murojaat qilishga harakat qilib ko‘ramiz: >>> d = {1: 2, 2: 4, 3: 9} >>> d 2 >>> d = 4 ** 2 >>> d {1: 2, 2: 4, 3: 9, 4: 16} >>> d['1'] Traceback (most recent call last): File "", line 1, in d['1'] KeyError: '1' Misoldan ko‘rinib turibdiki, yangi kalit bo‘yicha qiymat berish – lug‘atni kengaytiradi, mavjud kalit bo‘yicha qiymat berish – uni qaytadan yozib qo‘yadi, mavjud bo‘lmagan kalit bo‘yicha qiymatni olishga urinish esa xatolikni yuzaga keltiradi. Xatoliklar yuzaga kelishiga yo‘l qo‘ymaslik uchun maxsus metodlardan foydalanish yoki xatoliklarni qamrab olish lozim. Lug‘atlar bilan yana nima- lar qilish mumkin? Boshqa metodlar bilan bajarilishi mumkin bo‘lgan deyarli barcha amallarni: tarkibiy funksiyalar, kalit so‘zlar (masalan, for va while takrorlashlar kabi) hamda lug‘atlarning maxsus metodlaridan foydalanish mumkin. Lug‘atlarning metodlari dict.clear() – lug‘atni tozalaydi. dict.copy() – lug‘at nusxasini qaytaradi. classmethod dict.fromkeys(seq[, value]) – seqdan iborat kalitli va value qiymatli (ko‘rsatilma- sa None) lug‘at yaratadi. dict.get(key[, default]) – kalitning qiymatini qaytaradi, lekin uni topa olmasa, xatolikni yuza- ga keltirmaydi, buning o‘rniga defaultni qaytaradi (ko‘rsatilmasa None). dict.items() – juftliklarni qaytaradi (kalit-qiymat). dict.keys() – lug‘atlardagi kalitni qaytaradi. dict.pop(key[, default]) – kalitni o‘chiradi va uning qiymatini qaytaradi. Agar kalit topilmasa, defaultni qaytaradi (ko‘rsatilmasa, xatolikni yuzaga keltiradi). dict.popitem() – kalit-qiymat judtligini lug‘atdan o‘chiradi va qaytaradi. Agat lug‘at bo‘sh bo‘lsa, KeyError xatoligini qaytaradi. Lug‘atlar tartiblanmaganligini esda saqlang. dict.setdefault(key[, default]) – kalitning qiymatini qaytaradi, agar u bo‘lmasa, xatolikni yuzaga keltirmasdan, default qiymatli (ko‘rsatilmasa None) kalitni yaratadi. dict.update([other]) – otherning tarkibidan kalit-qiymat juftligini qo‘shish orqali lug‘atni yangi- laydi. Mavjud kalitlar qaytadan yoziladi. Noneni qaytaradi (yangi lug‘at emas!) dict.values() – lug‘atdagi qiymatlarni qaytaradi. 53 18-bob: To‘plamlar (set va frozenset) Bu bobda Python dasturlash tilidagi to‘plamlar, ya’ni to‘plam nima ekanligi, ular ustida bajariladi- gan amallar, ularning qo‘llanilishiga oid misollar haqida gaplashamiz. To‘plamlar nima? Pythonda to‘plam – takrorlanmaydigan elementlarning tasodifiy tarzda joylashgan konteyneri. To‘plam yaratamiz: >>> a = set() >>> a set() >>> a = set('hello') >>> a {'h', 'o', 'l', 'e'} >>> a = {'a', 'b', 'c', 'd'} >>> a {'b', 'c', 'a', 'd'} >>> a = {i ** 2 for i in range(10)} # to`plamlar generatori >>> a {0, 1, 4, 81, 64, 9, 16, 49, 25, 36} >>> a = {} # bunday mumkin emas >>> type(a) Misoldan ko‘rinib turibdiki, to‘plamlar xuddi lug‘atlar kabi literallarga ega, lekin bosh to‘plamni liter- al yordamida yaratib bo‘lmaydi. To‘plamlardan takrorlanadigan elementlarni o‘chirish uchun foydalanish qulay. >>> words = ['hello', 'daddy', 'hello', 'mum'] >>> set(words) {'hello', 'daddy', 'mum'} To‘plamlar bilan qator amallarni bajarish mumkin. Masalan, birlashtirish, kesishish va h. k. len(s) – to‘plamdagi elementlar soni (to‘plam o‘lchami). x in s – x ning s to‘plamga tegishliligini aniqlash. set.isdisjoint(other) – agar set va otherlar umumiy elementlarga ega bo‘lmasa, rost qiymatga ega bo‘ladi. set == other – setning barcha elementlari otherga tegishli, otherning barcha elementlari esa setga tegishli. set.issubset(other) yoki set = other – setning barcha elementlari otherga tegishli. 54 set.union(other,...) yoki set | other |... – bir necha to‘plamni birlashtirish. set.intersection(other,...) yoki set & other &... – kesishma. set.difference(other,...) yoki set - other -... – otherga tegishli bo‘lmagan othern- ing barcha elementlaridan iborat to‘plam. set.symmetric_difference(other) yoki set ^ other – ikkala to‘plamda ham uchramay- digan, lekin to‘plamlarning bittasida mavjud elementlardan iborat to‘plam. set.copy() – to‘plamning nusxasi. Bevosita to‘plamlarning o‘zini o‘zgartiruvchi amallar: set.update(other,...); set |= other |... – birlashma. set.intersection_update(other,...); set &= other &... – kesishma. set.difference_update(other,...); set -= other |... – ayirma. set.symmetric_difference_update(other); set ^= other – ikkala to‘plamda ham uchra- maydigan, lekin to‘plamlarning bittasida mavjud elementlardan iborat to‘plam. set.add(elem) – to‘plamga element qo‘shadi. set.remove(elem) – to‘plamdan elementni o‘chiradi. Agar bunday element bo‘lmasa, Key- Error xatoligi yuzaga keladi. set.discard(elem) – agar element to‘plamda mavjud bo‘lsa, uni o‘chiradi. set.pop() – to‘plamning birinchi elementini o‘chiradi. To‘plamlar tartiblanmagan bo‘lganligi sababli, qaysi element birinchi bo‘lishini aytib bo‘lmaydi. set.clear() – to‘plamni tozalash. frozenset frozensetning setdan yagona farqi – setni o‘zgartirish mumkin, ammo frozensetni o‘zgartirib bo‘lmaydi. Taxminan shunday vaziyatni biz ro‘yxatlar va kortejlarda kuzatgan edik. >>> a = set('qwerty') >>> b = frozenset('qwerty') >>> a == b True >>> True True >>> type(a - b) >>> type(a | b) >>> a.add(1) >>> b.add(1) Traceback (most recent call last): File "", line 1, in AttributeError: 'frozenset' object has no attribute 'add' 55 19-bob: Funksiyalar va ularning argumentlari Bu bobda biz funksiyalar haqida so‘z yuritamiz. Sizga nomlangan va anonim funksiyalar, def, re- turn va lambda ko‘rsatmalari, funksiyaning majburiy va majburiy bo‘lmagan argumentlari, ixtiyoriy sondagi argumentli funksiyalar haqida tushuncha berishga harakat qilamiz. Nomlangan funksiyalar. def instruksiyasi Pythonda funksiya bu – argumentlarni qabul qilib, qiymatlarni qaytaruvchi obyekt. Odatda, funksi- yalar def xizmatchi so‘zi yordamida aniqlanadi. Keling, oddiy bir funksiyani aniqlaylik: def add(x, y): return x + y return ko‘rsatmasi qiymatni qaytarish kerakligini anglatadi. Bizning misolimizdagi funksiya x va y lar yig‘indisini qaytaradi. Endi biz unga murojaat qilishimiz mumkin: >>> add(1, 10) 11 >>> add('abc', 'def') 'abcdef' Funksiya ixtiyoriy murakkablikda bo‘lishi hamda ixtiyoriy tipdagi obyektlar (ro‘yxat, kortej va hatto funksiya!)ni qaytarishi mumkin: >>> def newfunc(n): def myfunc(x): return x + n return myfunc >>> new = newfunc(100) # new – bu funksiya >>> new(200) 300 Funksiya return ko‘rsatmasi bilan yakunlanmasligi ham mumkin. Bunday holda funksiya None qiymatni qaytaradi: >>> def func(): pass >>> print(func()) None 56 Funksiyalarning argumentlari Funksiyalar ixtiyoriy sondagi argumentlarni qabul qilishi yoki umuman birorta ham argument qabul qilmasligi mumkin. Bundan tashqari, ixtiyoriy sonli argumentli, pozitsiyali va nomlangan argumentli hamda majburiy va majburiy bo‘lmagan argumentli funksiyalar ham mavjud. >>> def func(a, b, c=2): # c – bu majburiy bo`lmagan argumentdir return a + b + c >>> func(1, 2) # a = 1, b = 2, c = 2 (odatiy qiymat) 5 >>> func(1, 2, 3) # a = 1, b = 2, c = 3 6 >>> func(a=1, b=3) # a = 1, b = 3, c = 2 6 >>> func(a=3, c=6) # a = 3, c = 6, b aniqlanmagan Traceback (most recent call last): File "", line 1, in func(a=3, c=6) TypeError: func() takes at least 2 arguments (2 given) Funksiya, bundan tashqari, pozitsiyali argumentlarning o‘zgarib turuvchi sonini qabul qilishi ham mumkin. U holda nomdan avval * belgisi qo‘yiladi. >>> def func(*args): return args >>> func(1, 2, 3, 'abc') (1, 2, 3, 'abc') >>> func() () >>> func(1) (1,) Misolda ko‘rinib turibdiki, args – funksiyaning barcha uzatilgan argumentlaridan iborat kortej. Bu o‘zgaruvchi bilan xuddi kortej kabi ishlash mumkin ekan. Funksiya nomlangan argumentlarning ham ixtiyoriy sonini qabul qilishi mumkin. Bu holda o‘zga- ruvchidan avval ** belgisi qo‘yiladi. >>> def func(**kwargs): return kwargs >>> func(a=1, b=2, c=3) {'a': 1, 'c': 3, 'b': 2} >>> func() {} >>> func(a='python') {'a': 'python'} 57 kwargs o‘zgaruvchisida biz o‘z xohishimizga ko‘ra istagan amallarni qo‘llashimiz mumkin bo‘lgan lug‘at joylashgan. Anonim funksiyalar, lambda instruksiyasi Anonim funksiyalar faqat bittagina ko‘rsatmadan iborat bo‘lishi mumkin, lekin ular shunga mos ravishda juda tez bajariladi ham. Anonim funksiyalar lambda ko‘rsatmasi yordamida yaratiladi. Bundan tashqari, ularni biz def func() da bajarganimiz kabi o‘zgaruvchilarga moslashtirish ham shart emas. >>> func = lambda x, y: x + y >>> func(1, 2) 3 >>> func('a', 'b') 'ab' >>> (lambda x, y: x + y)(1, 2) 3 >>> (lambda x, y: x + y)('a', 'b') 'ab' lambda funksiyasiga, odatiy funksiyadan farqli ravishda, return ko‘rsatmasi talab etilmaydi, bosh- qa barcha jihatlari bo‘yicha u oddiy funksiyalardan farq qilmaydi: >>> func = lambda *args: args >>> func(1, 2, 3, 4) (1, 2, 3, 4) 58 20-bob: Pythonda noodatiy holatlar. Noodatiy holatlarni qayta ishlash uchun try – except kon- struksiyasi Noodatiy holatlar (exceptions) — Pythondagi yana bir ma’lumotlar tiplaridan biri. Noodatiy holat- lar dasturchiga xatoliklar haqida xabar berish uchun ishlatiladi. Noodatiy holatlarning eng oddiylaridan biri — nolga bo‘lish. >>> 100 / 0 Traceback (most recent call last): File "", line 1, in 100 / 0 ZeroDivisionError: division by zero Bu yerda interpretator bizga ZeroDivisionError noodatiy holati haqida xabar berdi, ya’ni nolga bo‘lishga harakat qilinganligini bildirdi. Bundan tashqari yana boshqa noodatiy holatlar ham mav- jud. >>> 2 + '1' Traceback (most recent call last): File "", line 1, in 2 + '1' TypeError: unsupported operand type(s) for +: 'int' and 'str' >>> int('qwerty') Traceback (most recent call last): File "", line 1, in int('qwerty') ValueError: invalid literal for int() with base 10: 'qwerty' Bu ikkita misolda, mos ravishda, TypeError va ValueError noodatiy holatlari yuzaga kelmoqda. Chiqarilgan xabar bizga bu holatlar qayerda yuzaga kelganligi va nima bilan bog‘ilqligi haqida to‘la ma’lumot bermoqda. Python tarkibidan o‘rin olgan noodatiy holatlar bilan tanishib chiqamiz, lekin ta’kidlash joizki, siz ish jarayonida boshqacha noodatiy holatlarga ham duch kelisingiz mumkin, chunki dasturchilar o‘zlarining shaxsiy noodatiy holatlarini ham yaratib qo‘yishlari mumkin. Ushbu ro‘yxat Python 3.3 uchun o‘rinli bo‘lib, boshqa versiyalarda ma’lum bir o‘zgarishlar kuzatilishi mumkin. BaseException – barcha boshqa noodatiy holatlarning asosi bo‘lgan bazaviy noodatiy holat. —— SystemExit – dasturdan chiqish paytida sys.exit funksiyasi tomonidan yuzaga keltiril- adigan noodatiy holat. —— KeyboardInterrupt – foydalanuvchi tomonidan dastur ishi to‘xtatilganda (odatda, Ctrl+C kombinatsiyasi orqali) yuzaga keladi. 59 —— GeneratorExit – generator obyektining close metodiga murojaat qilinganda yuzaga keladi. —— Exception – mana bu yerda esa sistemaning noodatiy holatlari yakuniga yetdi (ularga yaxshisi tegmagan ma’qul) hamda ular bilan ishlash mumkin bo‘lgan oddiylari boshla- nadi. * StopIteration – agar iteratorda boshqa element qolmagan bo‘lsa, u holda next ichki funksiyasi tomonidan yuzaga keltiriladi. * ArithmeticError – arifmetik xatolik FloatingPointError – suzivchi vergul ustida xato amal bajarilganda yuzaga keladi. Amaliyotda juda kam uchraydi. OverflowError – arifmetik amalning natijasini ko‘rsatish uchun haddan tash- qari katta bo‘lib ketganda yuzaga keladi. Butun sonlar bilan ishlash kabi oddiy holatlarda yuzaga kelmaydi, chunki Python uzun sonlar bilan ishlash imkoniyatiga ega. Ammo ba’zi boshqa holatlarda yuzaga kelishi mumkin. ZeroDivisionError – nolga bo‘lish. * AssertionError – assert funksiyasidagi iborat yolg‘on. * AttributeError – obyekt ko‘rsatilgan atribut (qiymat yoki metod)ga ega emas. * BufferError – bufer bilan bog‘liq operatsiyani bajarishning imkoni yo‘q. * EOFError – funksiya faylning oxiriga taqalib qoldi va izlagan ma’lumotini o‘qiy olmadi. * ImportError – modul yoki uning atributini import qilib bo‘lmadi. * LookupError – noto‘g‘ri indeks yoki kalit. IndexError – index elementlar diapazoniga kirmaydi. KeyError – mavjud bo‘lmagan kalit (lug‘at, obyekt yoki boshqa to‘plamda). * MemoryError – xotira yetishmovchiligi. * NameError – ko‘rsatilgan nomdagi o‘zgaruvchi topilmadi. UnboundLocalError – funksiyadagi lokal o‘zgaruvchiga murojaat qilingan, ammo bu o‘zgaruvchi oldindan e’lon qilinmagan. * OSError – sistema bilan bog‘liq xatolik. BlockingIOError – kiritish-chiqarish bilan bog‘liq xatolik. ChildProcessError – quyi darajadagi jarayon bilan bog‘liq xatolik. ConnectionError – aloqa bilan bog‘liq noodatiy holatlar uchun bazaviy klass. BrokenPipeError – kanalga yozishga urinish vaqtida kanalning ikkinchi uchi yopiq bo‘lgan hollarda yuzaga keladi. ConnectionAbortedError – aloqa tuguni tomonidan yakunlanish vaqtida yuzaga keladi. 60 ConnectionRefusedError – tugunning aloqani rad etishi natijasida yuzaga keladi. ConnectionResetError – tugun tomonidan ulanish uzib qo‘yilganda yuzaga keladi. FileExistsError – oldindan mavjud bo‘lgan fayl yoki papkani yaratishga urinish davrida yuzaga keladi. FileNotFoundError – fayl yoki papka mavjud emas. InterruptedError – tizim so‘rovi kiruvchi signal tomonidan uzib qo‘yilgan. IsADirectoryError – fayl kutilayotganda, papka kelganda yuzaga keladi. NotADirectoryError – papka kutilayotganda, fayl kelganda yuzaga keladi. PermissionError – boshqarish huquqlari yetishmaydi. ProcessLookupError – ko‘rsatilgan jarayon mavjud emas.. TimeoutError – kutish vaqti nihoyasiga yetdi. * ReferenceError – kuchsiz havolali atributga murojaat qilishga urinish. * RuntimeError – noodatiy holat boshqa birorta ham shunday holatlarga mos kel- maganda yuzaga keladi. * NotImplementedError – klassning abstrakt metodlar o‘z bo‘ysinuvidagi boshqa klasslarda qayta aniqlashni talab qilganda yuzaga keladi. * SyntaxError – sintaktik xatolik. IndentationError – xato bo‘sh joy tashlashdan iborat (siljishlar). TabError – siljishlarda bo‘sh joy tashlash hamda tabulyatsiya belgilarining aralashtirilishi. * SystemError – ichki xatolik. * TypeError – amal mos kelmaydigan tipli obyektga nisbatan qo‘llanilgan. * ValueError – funksiya to‘g‘ri tipli, lekin xato qiymatli argument olganda yuzaga keladi. * UnicodeError – unikod satrlarning xato kodlanishi/dekodlanisi bilan bog‘liq xato- lik. UnicodeEncodeError – unikod kodlash bilan bog‘liq xatolik. UnicodeDecodeError – inikod dekodlash bilan bog‘liq xatolik. UnicodeTranslateError – unikod tarjimasi bilan bog‘liq xatolik. * Warning – ogohlantirish. Endi qachon va qanday vaziyatlarda noodatiy holatlar yuzaga kelishini bilgan holda, biz ularni qay- ta ishlashimiz mumkin bo‘ladi. Noodatiy holatlarni qayta ishlash uchun try/except konstruksiyasi qo‘llaniladi. 61 Ushbu konstruksiyadan foydalanishga birinchi misol: >>> try: k = 1 / 0 except ZeroDivisionError: k = 0 >>> print(k) 0 try blokida biz noodatiy holatni yuzaga keltirishi mumkin bo‘lgan amallarni bajaramiz, except blokida esa biz ularni qayta ishlaymiz. Bunda noodatiy holatning o‘zi bilan birgalikda uning avlod- lari ham tutib qolinadi. Masalan, ArithmeticErrorni ushlab qolish oqibatida biz FloatingPoint- Error, OverflowError va ZeroDivisionErrorlarni ham ushlab qolamiz. >>> try: k = 1 / 0 except ArithmeticError: k = 0 >>> print(k) 0 Bundan tashqari yuzaga kelishi mumkin bo‘lgan har qanday noodatiy holatlarni (klaviatura orqali uzilish, tizimli chiqish va h. k.) ushlab qolishi mumkin bo‘lgan argumentsiz except ko‘rsatmasi ham mavjud. Shuning uchun bunday formada except ko‘rsatmasi deyarli qo‘llanilmaydi, uning o‘rniga except Exceptiondan foydalaniladi. Lekin, aksariyat hollarda noodatiy holatlarni bitta holat uchun qayta ishlashga harakat qilinadi, chunki, aks holda siz kutgan noodatiy holat o‘rniga bosh- qasi yuzaga kelishi mumkin bo‘lgan noodatiy holatning ushlab olinishi va u xato sifatida qayta ishlanishi mumkin. >>> f = open('1.txt') >>> ints = [] >>> try: for line in f: ints.append(int(line)) except ValueError: print(Bu son emas, chiqamiz.') except Exception: print(‘Bu yana nima edi?’) else: print('Hammasi joyida') finally: f.close() print('Men faylni yopdim') # Aynan shunday ketma- ketlikda: try, except guruhi, undan keyin else va eng oxirida finally. Bu son emas, chiqamiz. Men faylni yopdim. 62 21-bob: Baytlar (bytes va bytearray) Pythonda baytli satrlar nima va ular qanday maqsadlarda qo‘llaniladi? Baytli satrlar oddiy satrlar- ga juda o‘xshab ketsa-da, ayrim farqlari ham mavjud. Keling, shu farqlar haqida gaplashamiz. Bayt o‘zi nima? Bayt – raqamli axborotni saqlash va qayta ishlashda qo‘llaniladigan eng kichik, minimal o‘lchov birligi. Baytlar ketma-ketligi o‘zida ma’lum bir axborotni saqlaydi (matn, tasvir, musiqa va boshqalar). Baytli satr yaratamiz: >>> b'bytes' b'bytes' >>> 'Байтлар'.encode('utf-8') b'\xd0\x91\xd0\xb0\xd0\xb9\xd1\x82\xd0\xbb\xd0\xb0\xd1\x80' >>> bytes('bytes', encoding = 'utf-8') b'bytes' >>> bytes([50, 100, 76, 72, 41]) b'2dLH)' Bu yerda birinchi turgan uchta metod bilan biz tanishmiz. Oxirgisini esa tushuntirishimiz kerak bo‘ladi. Bytes funksiyasi 0 dan 255 gacha bo‘lgan sonlardan iborat ro‘yxatni qabul qiladi va chr funksiyasini qo‘llash oqibatida hosil bo‘ladigan baytlarni qaytaradi. >>> chr(50) '2' >>> chr(100) 'd' >>> chr(76) 'L' Baytlarni nima qilish kerak? Baytli satrlar deyarli barcha satrli ma’lumotlarning metodlarini qo‘lla- sa-da, ular amalga oshirish kerak bo‘lgan ishlar unchalik ham ko‘p emas. Odatda, ularni faylga yozish/fayldan o‘qish yoki nimadir bir boshqa narsaga (ko‘rinishga) o‘tkazish mumkin. (Albatta, istagingiz qat’iy bo‘lsa, ularni chop etishingiz ham mumkin.) Ularni satrga aylantirish uchun de- code metodi qo‘llaniladi. >>> b'\xd0\x91\xd0\xb0\xd0\xb9\xd1\x82\xd0\xbb\xd0\xb0\xd1\x80'. decode('utf-8') 'Байтлар' bytearray Pythonda bytearray – massiv bayt. Bytes tipidan faqat uni o‘zgartirish mumkinligi bilan farq qila- di. U haqida boshqa aytadigan muhim gap ham yo‘q. 63 >>> b = bytearray(b'hello world!') >>> b bytearray(b'hello world!') >>> b 104 >>> b = b'h' Traceback (most recent call last): File "", line 1, in b = b'h' TypeError: an integer is required >>> b = 105 >>> b bytearray(b'iello world!') >>> for i in range(len(b)) b[i] += i >>> b bytearray(b'ifnos%}vzun,') 64 22-bob: Biroz None (null) yoki NoneType tipi haqida Null kalit so‘zi, odatda, Java, C++, C# va JavaScript kabi ko‘plab dasturlash tillarida qo‘llaniladi. Bu biror o‘zgaruvchiga o‘zlashtiriladigan qiymatdir. Null kalit so‘zining ma’nosi shundan iboratki, u o‘zgaruvchiga neytral (betaraf) yoki nolli holatni beradi. Pythonda bu masalada nima gaplar? Pythondagi null ning ekvivalenti: None U ikkita sababga ko‘ra shunday ishlab chiqilgan: Ko‘pchilik Null so‘zi yangi o‘rganuvchilar uchun uncha qulay va tushunarli emasligini aytishadi. Bundan tashqri None aynan talab etilayotgan funksionallikni taqdim etadi. my_none_variable = None Nonedan foydalanish kerak bo‘lgan bir qancha holatlar mavjud. Ko‘pincha siz ishlashi yoki ishlamasdan xatolikka olib kelishi mumkin bo‘lgan amallarni bajar- ishingizga to‘g‘ri keladi. Nonedan doydalangan holda siz bu amalning bajarilgan yoki bajarilmagan- ligini aniqlashingiz mumkin. Mana, masalan: # Biz ma’lumotlar omboriga ulanmoqchimiz. # Biz login va parolimizning to‘g‘riligini bilmaymiz. # Agar ma’lumotlar ombori bilan ulanish natijasiz bo‘lsa, u holda, # u noodatiy holatni qaytaradi. MyDatabase va DatabaseExceptionlar haqiqiy # haqiqiy klasslar emasligiga e’tibor qarating. # Biz ulardan shunchaki oddiy misol sifatida foydalanmoqdamiz try: database = MyDatabase(db_host, db_user, db_password, db_database) database_connection = database.connect() except DatabaseException: pass if database_connection is None: print('The database could not connect') else: print('The database could connect') Python obyektga yo‘naltirilgan til hisoblanadi. Shuning uchun None ham obyekt hamda o‘zining tipiga ega. 65 None ekanlikka tekshirish Nonelikka tekshirishning 2 xil metodi mavjud. Birinchi metodi – is kalit so‘zi yordamida tekshirish. Ikkinchi metodi esa == yordamida (lekin bu metoddan foydalanish tavsiya etilmaydi, nima uchun ekanligini esa quyida tushuntirishga harakat qilamiz). Ba’zi misollarni ko‘rib chiqaylik: null_variable = None not_null_variable = 'Hammaga salom!' # is kalit so'zi if null_variable is None: print('null_variable is None') else: print('null_variable is not None') if not_null_variable is None: print('not_null_variable is None') else: print('not_null_variable is not None') # == operatori if null_variable == None: print('null_variable is None') else: print('null_variable is not None') if not_null_variable == None: print('not_null_variable is None') else: print('not_null_variable is not None') Bu kod quyidagi natijani chiqaradi: null_variable is None not_null_variable is not None null_variable is None not_null_variable is not None Juda yaxshi, demak, ular bir xil ishni bajarishmoqda. Lekin unchalik emas. Tarkibiy tiplar uchun shunday. Lekin foydalanuvchi klasslari bilan ishlaganda, ehtiyot bo‘lish lozim. Python foydalanuv- chi klasslarida solishtirish operatorlarini qaytadan taqsimlash imkoniyatini beradi. Shu tarzda siz quyidagi klasslarni solishtirishingiz mumkin. Masalan, MyObject == MyOtherObject kabi. class MyClass: def __eq__(self, my_object): # Shunchaki True ni qaytaramiz return True 66 my_class = MyClass() if my_class is None: print('my_class bu None, is kalit so\'zini ishlatdik') else: print('my_class bu None emas, is kalit so\'zini ishlatdik') if my_class == None: print('my_class bu None, == operatorini ishlatdik') else: print('my_class bu None emas, == operatorini ishlatdik') Hamda biroz kutilmagan natijani olamiz: my_class is not None, using the is keyword my_class is None, using the == syntax Juda ham qiziq, shunday emasmi? Aynan shu sababli None ekanligini tekshirishda is dan foydal- anishni tavsiya etamiz. Bundan tashqari ba’zi klasslar uchun __eq__ metodiga murojaat qilish ko‘proq vaqtni oladi, is esa undan tezroq bajarilganligi uchun ham afzalroq hisoblanadi. 67 23-bob: Fayllar. Fayllar bilan ishlash Bu bobda biz Python tarkibidagi fayllar bilan ishlash vositalari – faylni ochish, yopish, undan o‘qish va unga yozish amallari bilan tanishamiz. Fayl bilan ishlashdan avval uni ochish kerak. Bu ishni open tarkibiy funksiyasi juda yaxshi bajaradi. f = open('text.txt', 'r') open funksiyasining parametrlari juda ko‘p bo‘lib, hozir bizga ulardan 3 tasi muhim: birinchisi – fayl nomi. Faylga yo‘l esa absolyut yoki nisbiy bo‘lishi mumkin. Ikkinchisi – biz faylni ochadigan rejim. Rejim Ma’nosi 'r' O‘qish uchun ochish (boshqa holat ko‘rsatilma- sa, odatiy hol hisoblanadi) 'w' Yozish uchun ochish, faylning tarkibi o‘chirila- di, agar bunday fayl mavjud bo‘lmasa, yangisi yaratiladi 'x' Yozish uchun ochish, agar bunday fayl mavjud bo‘lmasa, noodatiy holat yuzaga keladi 'a' Qo‘shimcha yozish uchun ochish. Qo‘shilayot- gan ma’lumot faylning yakunidan qo‘shiladi 'b' Ikkilik rejimda ochish 't' Matnli rejimda ochish(boshqa holat ko‘rsatil- masa, odatiy hol hisoblanadi) '+' O‘qish va yozish uchun ochish Rejimlarni birlashtirilgan holda ham ishlatish mumkin, masalan, rb – ikkilik rejimda o‘qishni an- glatadi. Boshqa holat ko‘rsatilmasa, odatiy holda rejim rt ga teng. Uchinchisi bu – encoding, u faqat faylni o‘qishning matnli holatidagina kerak bo‘ladi. Mazkur argu- ment kodirovkani anglatadi. Fayldan o‘qish Faylni ochganimizdan keyin, undagi ma’lumotlarni o‘qishimiz kerak. Buning bir necha metodi mav- jud bo‘lsa-da, ulardan faqat quyidagi ikkitasiga e’tiboringizni qaratamiz: birinchisi – read metodi, agar argumentlarisiz qo‘llanilgan bo‘lsa, u faylni to‘liqligicha o‘qiydi. Agar butun sonli n argumenti qo‘llangan bo‘lsa, shuncha (n ta) sonli belgilarni o‘qiydi. >>> f = open('text.txt') >>> f.read(1) 'H' >>> f.read() 'ello world!\nThe end.\n\n' 68 Ikkinchi metodi – for takrorlash operatoridan foydalangan holda faylni satrma-satr o‘qish. >>> f = open('text.txt') >>> for line in f: line 'Hello world!\n' '\n' 'The end.\n' '\n' Faylga yozish Endi esa fayl yozishni ko‘rib chiqamiz. Faylimizga quyidagi ro‘yxatning qanday yozilishini ko‘rib chiqaylik: >>> l = [str(i)+str(i-1) for i in range(20)] >>> l ['0-1', '10', '21', '32', '43', '54', '65', '76', '87', '98', '109', '1110', '1211', '1312', '1413', '1514', '1615', '1716', '1817', '1918'] Faylni yozish uchun ochamiz: >>> f = open('text.txt', 'w') Faylga yozish write metodi yordamida amalga oshiriladi: >>> for index in l: f.write(index + '\n') 4 3 3 3 3 Bu sonlar nimaligini tushunmagan bo‘lsangiz, tushunib oling: write metodi yozilgan simvollar sonini qaytaradi. Fayl bilan ishlash yakuniga yetgach, uni, albatta, close metodi yordamida yopish kerak bo‘ladi. >>> f.close() Endi esa hosil bo‘lgan faylimizdan shu ro‘yxatimizni chaqirishga harakat qilib ko‘ramiz. Faylni o‘qish uchun ochamiz (umid qilamanki, siz buni qanday bajarilishini tushundingiz) va satrlarni o‘qiymiz. 69 >>> f = open('text.txt', 'r') >>> l = [line.strip() for line in f] >>> l ['0-1', '10', '21', '32', '43', '54', '65', '76', '87', '98', '109', '1110', '1211', '1312', '1413', '1514', '1615', '1716', '1817', '1918'] >>> f.close() Biz o‘sha avvalgi ro‘yxatimizga ega bo‘ldik. Bundan murakkabroq holatlarda (lug‘atlar, ichki korte- jlar va h. k. uchun) yozish algoritmi nisbatan murakkabroq bo‘ladi. Bizga bu kerak ham emas. Pythonda allaqachonlar pickle yoki json kabi murakkab strukturalarni saqlash vositalari o‘ylab topilgan. 70 24-bob: with…as – kontekst menejeri with…as konstruksiyasi kontekst menejeri tomonidan ko‘rsatmalar blokining bajarilishi jarayonini qamrab olish uchun ishlatiladi. Ba’zida bu konstruksiyadan foydalanish try/except/finally dan ko‘ra samaraliroq bo‘lishi mumkin. with…as konstruksiyasining sintaksisi: "with" expression ["as" target] ("," expression ["as" target])* ":" suite Endi esa ushbu blokning bajarilisih jarayoni haqida batafsil to‘xtalib o‘tamiz: 1. with…as konstruksiyasidagi ko‘rsatma bajariladi; 2. keyinchalik foydalanish uchun __exit__maxsus metodi yuklanadi; 3. __enter__ metodi bajariladi. Agar with konstruksiyasining tarkibida as so‘zi mavjud bo‘lsa, u holda __enter__ metodi tomonidan qaytariladigan qiymat o‘zgaruvchiga yoziladi; 4. suite amalga oshiriladi; 5. __exit__ metodiga murojaat qilinadi. Bu yerda suite bajarilganligi yoki noodatiy holat yu- zaga kelganligi ahamiyatsiz. Bu metodga, agar noodatiy holat yuzaga kelgan bo‘lsa, uning parametrlari, agar yuzaga kelmagan bo‘lsa, barcha argumentlarda None qiymati beriladi. Agar with…as konstruksiyasining tarkibida bir necha ko‘rsatma keltirilgan bo‘lsa, u holda ular bir necha ichma-ich joylashtirilgan ko‘rsatmalar bilan teng kuchli hisoblanadi: with A() as a, B() as b: suite hamda: with A() as a: with B() as b: suite dastur qismlari o‘zaro ekvivalent (teng kuchli) hisoblanadi. with…as konstruksiyasi nima uchun qo‘llaniladi? – Bajarilishi o‘ta muhim bo‘lgan funksiyalar har qanday holatda ham kafolatlangan tarzda bajarilishini nazorat qilish uchun. Ushbu konstruksi- yadan foydalanishning eng keng tarqalgan holatlaridan biri bu – fayllarni ochish jarayoni. Biz av- valgi boblarimizda open funksiyasi yordamida fayllarni ochish jarayoni bilan tanishgan edik, lekin with…as konstruksiyasi bu amal uchun ko‘proq qo‘llaniladigan konstruksiya bo‘lib, undan foydala- nilganda har qanday holatda ham yakunida faylning yopilishini kafolatlashi bilan farq qiladi. Masalan: with open('newfile.txt', 'w', encoding='utf-8') as g: d = int(input()) print('1 / {} = {} '.format(d, 1 / d), file=g) 71 Bunday holatda foydalanuvhci tomonidan nima kiritilsa ham, yakunida faylning aniq yopilishiga shubha qilmasangiz ham bo‘ladi. 72 25-bob: PEP8 – Pythonda kod yozish bo‘yicha qo‘llanma Bu hujjat Python dasturlash tilida kod yozish, jumladan, Python tarkibiga kiruvchi standart kutubx- ona haqidagi kelishuvdan iborat. PEP8 hujjati til asoschisi Gvido van-Rossum tomonidan berilgan takliflar hamda uning izdoshi Barri Uorsouning qo‘shimchalari asosida ishlab chiqilgan. Agar qaysidir sohada qarama-qarshi- liklar kelib chiqadigan bo‘lsa, biz Gvido van-Rossum ko‘rsatmalarini ustun qo‘yamiz. Albatta, PEP to‘liq bo‘lmasligi ham mumkin (ehtimol, u hech qachon o‘z yakuniga yetmas). Gvido van-Ros- sumning asosiy g‘oyasi – kod yozilganidan ko‘ra ko‘proq o‘qiladi. Demak, kod yozish uslubiga berilayotgan takliflar, asosan, kodni o‘qishni osonlashtirish hamda ko‘plab loyihalar orasida bir xillikni ta’minlashni o‘z oldiga maqsad qilib qo‘ygan. Eng ideal holatda butun kod aniq bir xil uslubda yoziladi, shu boisdan har qanday dasturchiga uni o‘qish va tushunish oson. Bu kelishuv va bir xillik haqidagi qo‘llanmadir. Qo‘llanamaga binoan ishlash muhim ahamiyatga ega. Bir loyiha ichida bir xillik undan ham muhim bo‘lib, bitta modul yoki funksiya ichidagi bir xillik hammasidan ham muhimroqdir. Lekin, shuni ham esda saqlash kerakki, ba’zida bu qo‘llanmaga rioya etishning iloji bo‘lmasligi ham mumkin, bunday holatlar haqida ham bilib qo‘yganingiz yax- shi. Agar ikkilansangiz, boshqalar bu masalada qanday yechimni tanlaganliklarini ko‘rib chiqing hamda uning asosida qaror qabul qiling. Bu qoidalarga rioya qilmaslikning ikkita asosiy sababi: 1. qoidalarga rioya qilish hatto qoidalar bo‘yicha yozilgan kodni o‘qishga o‘rgangan kishi uchun ham qiyinchilik tug‘dirsa; 2. biror loyihadagi qoidalarga roiya qilinmagan holda yozilgan (balki xiyla avval yozilgandir) kod bilan bir xillikni ta’minlash maqsadida (balki bu o‘sha kodni qaytadan yozish uchun bir sababdir). Mundarija Kodning tashqi ko‘rinishi —— Siljishlar —— Tabulyatsiyami yoki bo‘sh joy? —— Qatorning maksimal uzunligi —— Bo‘sh satrlar —— Boshlang‘ich faylning kodirovkasi —— Import qilishlar Ko‘rsatma va iboralarda bo‘sh joylar —— Quyidagi hollarda bo‘sh joylardan foydalanmaslikka harakat qiling —— Boshqa tavsiyalar 73 Izoh (kommentariy)lar —— Izohlar bloki —— “Satrdagi” izohlari —— Rasmiylashtirish satrlari Versiyalar nazorati Nomlashlar bo‘yicha kelishuv —— Asosiy g‘oya —— Tavsiflash: nomlar uslublari —— Ko‘rsatmalar: nomlash bo‘yicha kelishuv * Qo‘llash kerak bo‘lmagan nomlar * Modullar va paketlarning nomlari * Klasslar nomlari * Noodatiy holatlar nomlari * Global o‘zgaruvchilarning nomlari * Funksiyalarning nomlari * Funksiya va metodlarning argumentlari * Klasslar ekzemplyarlarining metod va o‘zgaruvchilari uchun nomlar * O‘zgarmas (konstanta)lar * Vorislikni loyihalashtirish Umumiy tavsiyalar Kodning tashqi ko‘rinishi Siljishlar Har bir siljish darajasida 4 ta bo‘sh joydan foydalaning. Uzun satrlar ichki elementlar bilan yaqqol bo‘lmagan va qavslar bilan cheklangan vertikal chiziq bo‘ylab yoki muallaq siljish vositasida tekislanishi zarur. Muallaq siljishdan foydalanadigan bo‘lsangiz, quyidagilarga rioya qilish tavsiya etiladi: birinchi qatorda argumentlar bo‘lmasligi ker- ak, qolgan satrlar esa chiziqning davomi sifatida aniq qabul qilinishi shart. To‘g‘ri yozishga misol: # Ochilayotgan ajratuvchi bo‘yicha tekislangan foo = long_function_name(var_one, var_two, var_three, var_four) # Ko‘proq siljish qo‘llanilishidan maqsad, boshqa siljishlardan farq qilishdir def long_function_name( var_one, var_two, var_three, 74 var_four): print(var_one) Xato qo‘llanilishiga misol: # agar vertikal tekislash qo‘llanilmayotgan bo‘lsa, # birinchi satrda argumentlar joylashtirish taqiqlanadi foo = long_function_name(var_one, var_two, var_three, var_four) # boshqa satrlardan farqlanishi uchun ko‘proq bo‘sh joy tashlash talab etiladi def long_function_name( var_one, var_two, var_three, var_four): print(var_one) Vaziyatdan kelib chiqqan holda: # ortiqcha siljishlarga ehtiyoj yo‘q. foo = long_function_name( var_one, var_two, var_three, var_four) Ko‘p satrli konstruksiyalarda yopilayotgan dumaloq/kvadrat/figurali qavslar ro‘yxat oxirgi satrining birinchi bo‘sh bo‘lmagan belgisi ostida joylashtirilishi mumkin. my_list = [ 1, 2, 3, 4, 5, 6, ] result = some_function_that_takes_arguments( 'a', 'b', 'c', 'd', 'e', 'f', ) Yoki ko‘p satrli konstruksiyani boshlayotgan satrning birinchi belgisi ostida ham joylashishi mum- kin: my_list = [ 1, 2, 3, 4, 5, 6, ] result = some_function_that_takes_arguments( 'a', 'b', 'c', 'd', 'e', 'f', ) 75 Tabulyatsiyami yoki bo‘sh joy? Bo‘sh joylar siljishlarning eng ma’qul metodidir. Tabulyatsiyadan faqat xuddi shu tariqa (tabulyatsiyadan foydalanib) yozilgan kod bilan bir xillikni ta’minlash maqsadidagina foydalanish mumkin. Python 3 siljishlarda tabulyatsiya va bo‘sh joylardan bir vaqtning o‘zida foydalanishni ta’qiqlaydi. Python 2 tabulyatsiyani bo‘sh joylarga aylantirishga harakat qiladi. Agar siz Python2 interpretatorini buyruq satri orqali -t parametru bilan birga ishga tushirsangiz va u siljishlarda aralash uslub qo‘llanilgan bo‘lsa, u holda ogohlantirish (warnings)ni chiqaradi. Inter- pretatorni -tt parametri bilan ishga tushirganingizda esa shu joylarda xatolik borligi haqida xabar hosil bo‘ladi. Agar siz Python 2 dan foydalanadigan bo‘lsangiz, u holda quyidagi parametrlardan foydalanish tavsiya qilinadi. Qatorning maksimal uzunligi Qator uzunligini eng ko‘pi bilan 79 tadan oshirmang. Tuzilmaviy cheklashlari ozroq bo‘lgan uzunroq matnli bloklar uchun esa (rasmiylashtirish satrlari yoki izohlar uchun) satr uzunligini 72 tadan oshirmaslik tavsiya etiladi. Muharrir oynasining zarur kengligini cheklash imkoniyati bir necha ochiq faylni yonma-yon joy- lashtirish imkonini beradi hamda yonma-yon ustunlarda ikki xil variantni ko‘rsatib turuvchi kod tahlili vositalari qo‘llanilganda, yaxshi natija beradi. Ba’zi jamoalar satrlarining uzunroq bo‘lishini ma’qul ko‘radi. Ushbu uzunlikdagi kodni qo‘llab-quv- vatlaydigan jamoa bu masalada alohida kelishuvga kelishlari mumkin, bunda izohlar va rasmi- ylashtirish satrlari hali ham 72 tadan oshmasligi sharti bilan boshqa satrlar uzunligini 80 tadan 100 tagacha (aslida esa maksimal uzunlikni 99 tagacha) oshirish oddiy holdir. Pythonning standart kutubxonasi bu masalada konservativ bo‘lib, satr uzunligini 79 tadan hamda izohlar va rasmiylashtirish satrlarining 72 tadan oshirilmasligini talab qiladi. Satrlarning keyingi satrga o‘tkazilishi uchun eng ma’qul metod bu – Python satrlarining dumaloq, kvadrat va figurali qavslari ichidagi nazarda tutilgan ko‘chirishlaridan foydalanish metodi. Uzun satrlar qavslar ichiga olingan bir necha satrga bo‘lib yozilishi mumkin. Bu metod satrni davom ettirish uchun teskari egri chiziq (teskari slesh)dan foydalanish metodidan ko‘ra afzalroqdir. Teskari egri chiziqdan ham ba’zida foydalanish mumkin. Masalan, with konstruksiyasi uzun bo‘lganda, u aniq bo‘lmagan satr ko‘chirishlardan foydalana olmaydi. Mana shunday hollarda teskari sleshdan foydalanish metodini qo‘llash mumkin: with open('/path/to/some/file/you/want/to/read') as file_1, \ open('/path/to/some/file/being/written', 'w') as file_2: file_2.write(file_1.read()) Yana bir holat – assert. Ko‘chirilgan satrlar uchun to‘g‘ri siljishlarni o‘rnating. Satr ko‘chirishni man- tiqiy operatorlardan avval emas, keyin amalga oshirish ma’qulroq. Masalan: 76 class Rectangle(Blob): def __init__(self, width, height, color='black', emphasis=None, highlight=0): if (width == 0 and height == 0 and color == 'red' and emphasis == 'strong' or highlight > 100): raise ValueError("sorry, you lose") if width == 0 and height == 0 and (color == 'red' or emphasis is None): raise ValueError("I don't think so -- values are %s, %s" % (width, height)) Blob.__init__(self, width, height, color, emphasis, highlight) Bo‘sh satrlar Yuqori darajali funksiya va klasslarning tavsifini ikkita bo‘sh qatorlar bilan ajrating. Klass ichidagi metodlarning tavsiflari bitta bo‘sh satr bilan ajratiladi. Qo‘shimcha bo‘sh satrlardan bir-biriga o‘xshash funksiyalar guruhlarini ajratish uchun qo‘llash mumkin. Bo‘sh qatorlar bir nechta o‘zaro bog‘liq bir satrliklar (masalan, fiktiv realizatsiyalar uchun) orasida qo‘yilmasligi ham mumkin. Funksiyalarda mantiqiy bo‘limlarni ko‘rsatish uchun bo‘sh satrlardan foydalaning. Python Ctrl+L kombinatsiyasini oddiy bo‘sh joy (whitespace) sifatida qabul qiladi va siz undan ham foydalanishingiz mumkin, chunki aksariyat muharrirlar uni sahifa bo‘linishi sifatida qabul qiladi, buning oqibatida fayldagi mantiqiy bo‘laklar turli qismlarda joylashadi. Ta’kidlash joizki, hamma muharrilar ham Ctrl+L ni qo‘llayvermaydi, uning o‘rnida boshqa belgini chiqarishi ham mumkin. Boshlang‘ich faylning kodirovkasi Python kodirovkasi UTF-8 bo‘lishi lozim. (Python 2 da ASCII). ASCII (Python 2) hamda UTF-8 (Python 3)dagi fayllar kodirovkasi e’lon qilinishga ega bo‘lmasligi kerak. Standart kutubxonadagi nostandart kodirovkalar faqat sinab ko‘rish maqsadida yoki izoh yoki rasmiylashtirish satrlari ASCII belgisi bo‘lmagan biror simvoldan muallif nomini ko‘rsatish maq- sadida foydalanishni taqozo qilgandagina foydalanish mumkin; boshqa barcha holatlarda satrga ASCII bo‘lmagan belgilarni kiritish uchun \x, \u, \U yoki \N lardan foydalanish eng ma’qul metod hisoblanadi. Python 3.0 versiyasidan boshlab standart kutubxona uchun quyidagi kelishuv amal qiladi: har bir identifikator faqat ASCII simvollardan hamda mumkin bo‘lgan barcha holatlarda ingliz tilidagi so‘zlardan iborat bo‘lishi (ko‘p hollarda qisqartirishlar va ingliz tilida bo‘lmagan texnik atamalar- da) kerak. Bundan tashqari satrlar va izohlar ham faqat ASCII belgilaridan iborat bo‘lishi lozim. Bu qoidaga faqat (a) test case dasturlarning ASCII bo‘lmagan xususiyatlarini testlash hamda (b) mualliflarning ismlari uchungina rioya qilmaslikka ruxsat beriladi. Ismlari lotin alifbosidan boshqa 77 alifboda yoziladigan mualliflar o‘z ismlarini lotin alifbosiga transliteratsiya qilishlari zarur. Keng ommaga mo‘ljallangan ochiq kodli loyihalarda ham ushbu ko‘rsatmalarga rioya qilish tavsi- ya etiladi. Import qilishlar Har bir import, odatda, alohida satrda bo‘lishi lozim. To‘g‘ri yozilishi: import os import sys Xato yosilishi: import sys, os Shu bilan birga, quyidagicha yozishga ruxsat etiladi: from subprocess import Popen, PIPE Import qilishlar har doim faylning boshlanishida, modulga izohlar va rasmiylashtirish satr- laridan keyin hamda o‘zgarmaslarni e’lon qilishdan avval joylashtiriladi. Import qilishlar quyidagi tartibda guruhlanishi kerak: 1. standart kutubxonadan import qilish; 2. chetki kutubxonalardan import qilish; 3. joriy loyiha modullarini import qilish. Har bir import qilishlar guruhlari orasida bo‘sh satr qoldiring. Import qilishlardan keyin __all__ spetsifikatsiyasini ko‘rsating. Absolyut import qilish tavsiya etiladi, chunki, odatda, bunday holatda uni o‘qish oson hamda import qilinayotgan tizim xato sozlanganga nisbatan tushunarli bo‘lgan xatoliklar haqidagi xabarlarni beradi (masalan, paket ichidagi katalog sys.path da yakunlanib qol- ganda): import mypkg.sibling from mypkg import sibling from mypkg.sibling import example Shunga qaramasdan, absolyut importning o‘rniga nisbiy importdan ham foydalanish mum- kin. Ayniqsa, absolyut importdan foydalanish haddan tashqari maydalashish bo‘lishi mum- kin bo‘lgan murakkab paketlar bilan ish olib borilayotganda: from. import sibling from.sibling import example 78 Standart kutubxonalarda paketlarning murakkab strukturalaridan qutulishga harakat qilish va har doim absolyut importdan foydalanish maqsadga muvofiq bo‘ladi. Nomuayyan importlardan hech qachon foydalanmaslik kerak, bunday imkoniyat Python 3 da olib tashlangan. Siz moduldan klassni import qilayotganingizda quyidagicha yozishingiz mumkin: from myclass import MyClass from foo.bar.yourclass import YourClass Agar bunday yozish nomlar orasida kelishmovchilikka olib kelsa, u holda quyidagicha yoz- ing: import myclass import foo.bar.yourclass myclass.MyClass va foo.bar.yourclass.YourClass lardan foydalaning. Import shablonlaridan (from import * kabi) imkon qadar foydalanmaslik kerak, chunki ular nomlar maydonida qanday nomlar mavjudligi haqida nafaqat dasturni o‘qiyotgan kishilarda, balki ko‘plab avtomatlashtirilgan tiizmlarda ham noaniqliklarga olib keladi. Ush- bu import shablonidan foydalanishning yakka-yu yagona to‘g‘ri qo‘llanilishi mavjud bo‘lib, u ham bo‘lsa ichki interfeysning umumiy API qismi sifatida e’lon qilinishidan iboratdir (mas- alan, aksellerator modulida qilingan ishlarni sof Python tiliga qayta yozishda, chunki bunda aynan qaysi funksiyalarni qayta yozilishi aniq bo‘lmaydi). Ibora va instuksiyalarda bo‘sh joylarning ahamiyati Quyidagi holatlarda bo‘sh joy belgisini qo‘llashdan saqlaning Bevosita dumaloq, kvadratli va figurali qavslarning ichida: To‘g‘ri: spam(ham, {eggs: 2}) Xato: spam(ham[ 1 ], { eggs: 2 }) Bevosiya vergul, nuqtali vergul yoki ikki nuqta oldida: To‘g‘ri: if x == 4: print(x, y); x, y = y, x Xato: if x == 4 : print(x , y) ; x , y = y , x 79 Funksiyalarga murojaat qilinayotganda argument yozilishi kerak bo‘lgan qavslarni ochish- dan oldinda: To‘g‘ri: spam(1) Xato: spam (1) Indeks yoki kesim yozilishi kerak bo‘lgan qavsning ochilishidan oldinda: To‘g‘ri: dict['key'] = list[index] Xato: dict['key'] = list[index] O‘zlashtirish (yoki boshqa ixtiyoriy) operatori atrofida boshqalari bilan tekislash maqsadi- da bittadan ortiq bo‘sh joyni ishlatishda: To‘g‘ri: x = 1 y = 2 long_variable = 3 Xato: x = 1 y = 2 long_variable = 3 Boshqa tavsiyalar Har doim quyidagi operatorlarni ikkala tomonidan bittadan bo‘sh joy bilan qamrab oling: o‘zlashtirish (=, +=, -= va boshqalar), taqqoslash (==, , !=, , =, in, not in, is, is not) va mantiqiy (and, or, not). Agar turli ustunlikka ega operatorlardan foydalanayotgan bo‘lsangiz, u holda eng past ustunlikka ega operator atrofiga bo‘sh joylarni qo‘shishga harakat qiling. O‘zingiz mustaqil fikr yuriting, lekin hech qachon 1 tadan ortiq bo‘sh joyni qo‘llamang hamda binar opera- torlarning ikkala tomonida ham bir xil sondagi bo‘sh joylarni qo‘llang: 80 To‘g‘ri: i = i + 1 submitted += 1 x = x*2 - 1 hypot2 = x*x + y*y c = (a+b) * (a-b) Xato: i=i+1 submitted +=1 x = x * 2 - 1 hypot2 = x * x + y * y c = (a + b) * (a - b) Agar = belgisi nomlangan argument yoki parametrlarning odatiy qiymatlarini ko‘rsatish uchun qo‘llanilayotgan bo‘lsa, u holda uning atrofida bo‘sh joydan foydalanmang: To‘g‘ri: def complex(real, imag=0.0): return magic(r=real, i=imag) Xato: def complex(real, imag = 0.0): return magic(r = real, i = imag) Tarkibiy ko‘rsatmalardan foydlanmang (bir qatorda bir necha buyruqdan): To‘g‘ri: if foo == 'blah': do_blah_thing() do_one() do_two() do_three() Xato: if foo == 'blah': do_blah_thing() do_one(); do_two(); do_three() Ba’zida while va for takrorlashlar tanalarini yoki if tarmog‘ini, agar ular qisqa ko‘rinish- da bo‘lsa, shu satrning o‘zida ham yozish mumkin, lekin buyruqlar bir nechta bo‘lsa, hech qachon bunday yozmang. Bundan tashqari juda