1-sahifa 2-sahifa
Download 363.98 Kb.
|
Python
- Bu sahifa navigatsiya:
- 191-bet 20.7. Mashqlar 191-yil
- 192-bet 21 sinf
- 193-bet Sinflar 193
- Anjir. 21.1.
- 195-bet 21.1. Sinfni rejalashtirish 195 21.1. Sinfni rejalashtirish
- 197-bet 21.2. Sinfni aniqlash 197
- 199-bet 21.2. Sinfni aniqlash 199
- 201-bet 21.3. Sinf namunasini yaratish 201
20.5. Unicode va fayllar 189 Bundan tashqari, faylni yozib olish uchun ochishda kodlash o'rnatilishi mumkin. Unutmangki, kodlash ketma-ket format sifatida ko'rib chiqilishi kerak lizatsii (Internet orqali ma'lumot uzatish uchun ishlatiladi yoki ma'lumotlarni faylda saqlash). Faylga yozishning ikkita misoli. Kodlash birinchi fayl bilan aniqlanmaydi, shuning uchun sukut bo'yicha UTF-8 ishlatiladi (tizim uchun standart kodlash). Ikkinchisida Kodlash parametridagi misolda CP949 (Koreya) kodlash tayinlangan: >>> ochiq ('/ tmp / sq.utf8', 'w') marshrut sifatida: ... fout.write ('x²') >>> ochiq ('/ tmp / sq.cp949', 'w', kodlash = 'cp949') bilan quyidagicha: ... fout.write ('x²') UNIX terminalidagi fayllarni ko'rib chiqing. Sizda borligini ko'rasiz turli xil tarkiblarga ega, chunki ular turli kodlashlardan foydalanadi: $ hexdump /tmp/sq.utf8 0000000 78 c2 b2 0000003 $ hexdump /tmp/sq.cp949 0000000 78 a9 f7 0000003
Ma'lumotni fayllardan o'qish mumkin: >>> ma'lumotlar = ochiq ('/ tmp / sq.utf8'). o'qing () >>> ma'lumotlar 'x²'
Yodingizda bo'lsin, Python-da niyatni aniq ifoda etish yaxshiroqdir vat . Kodlash bilan ishlashda o'ziga xoslik talab etiladi. O'qish paytida UTF-8 tizimidagi Python fayli UTF-8-dan kodni echishga harakat qiladi. u agar fayl UTF-8-da kodlangan bo'lsa normaldir, ammo yo'q bo'lsa, olasiz yoki mojibake yoki xato: >>> ma'lumotlar = ochiq ('/ tmp / sq.cp949'). o'qing () Traceback (eng so'nggi qo'ng'iroq oxirgi): ... UnicodeDecodeError: 'utf-8' kodek baytni dekodlay olmaydi 1 holatda 0xa9: yaroqsiz boshlang'ich bayt
190 20-bob. Unicode Agar siz o'z niyatlaringizni bildirsangiz va Python-ga ushbu faylni aytsangiz CP949-da kodlangan, keyin fayldan to'g'ri ma'lumotlarni oling: >>> ma'lumotlar = ochiq ('/ tmp / sq.cp949', kodlash = 'cp949'). o'qish () >>> ma'lumotlar 'x²' Agar siz belgilarni o'z ichiga olgan matnli fayllar bilan ishlayotgan bo'lsangiz, qilmang ASCII-ga kiritilgan, ularning kodlanishini aniq ko'rsatganingizga ishonch hosil qiling. 20.6. Xulosa Unicode kod nuqtalari va glif- milya Python-da satrlar tarkibida Unicode gliflari bo'lishi mumkin. Chiziq Unicode boshqasidan foydalanib bayt qatoriga kodlanishi mumkin kodlash. Python satrlari hech qachon ochilmaydi. Matnli faylni o'qiyotganda kodlashni belgilashingiz mumkin Unicode satrida to'g'ri belgilar mavjud edi. Yozayotganda kodlash parametrini aniq faylga o'rnatish uchun matnli faylga o'rnatish mumkin ishlatilgan kodlash. UTF-8 barcha zamonaviy kodlashlarning eng mashhuridir. Agarda boshqa kodlash, foydalanish uchun asosli sabab yo'q Standart UTF-8 kodlash usulidan foydalaning. 20.7. Mashqlar 1. http://unicode.org saytiga tashrif buyuring va kod tugmalari yordamida jadvalni yuklab oling ktami. ASCII belgilar to'plamida bo'lmagan belgini tanlang, va ushbu belgini kod sifatida chiqarish uchun Python kodini yozing nuqta va nomi bilan. 2. Turli xil Unicode belgilar mavjud ASCII belgilarining inverterli versiyalari. Jadvalni toping bu belgilar (bu oson bo'ladi). Funktsiya yozing ASCII belgilar qatorini qabul qiladi va inverterni qaytaradi Ushbu chiziqning ushbu versiyasi.
20.7. Mashqlar 191-yil 3. O'zingizning ismingizni faylga yozing, pastki harflar bilan. Bunga yordam beradigan kodlashlarga misollar keltiring ismingiz yozuvi. Kodirovkalarga misollar keltiring Ushbu yozuv qo'llab-quvvatlanmaydi. 4. Aqlli (yoki yumaloq) tirnoq ASCII-da qo'llab-quvvatlanmaydi. ASCII satrini qabul qiladigan va qaytaradigan funktsiyani yozing qo'shtirnoqlarni "aqlli" tirnoqlarga almashtiradigan satr - milya Masalan, Python satriga "batareyalar kiritilgan" kerak bo'ladi
Uchinchisi yaqinlashganda, siz tirnoqning ochilishini ko'rasiz yopiladiganlar singari yumaloq emas). 5. Satrli matnli funktsiyani yozing rum uslubi ( :) , : P .. va hokazo) Kulgichlar yordamida jadval 1 , Add o'z funktsiyasida Unicode matnli matnlarni almashtirish uchun kod jadvaldan versiyalari. 1 http://unicode.org/emoji/charts/full-emoji-list.html
21 sinf Strings, lug'atlar, fayllar va butun sonlar - bu barcha narsalar. Hatto vazifalari ob'ektlardir. Pythonda deyarli hamma narsa ob'ektdir. u yerda va istisnolar: kalit so'zlar (masalan, in ) ob'ekt emas. Bundan tashqari, o'zgaruvchan nomlar ob'ektlar emas, balki ularni belgilaydi ular ustiga. Ushbu bobda biz mavzuni chuqurroq o'rganamiz va nimani ko'ramiz ob'ektni anglatadi. "Ob'ekt" atamasi noaniq. Ob'ektga yo'naltirilgan ta'riflardan biri dasturlash tuzilmalardan foydalanishni talab qiladi ma'lumotlarni guruhlash uchun (holat) va usullar (o'zgartirish funktsiyalari) holat). Ob'ektga yo'naltirilgan ko'plab tillar, masalan C ++, Ushbu holatni aniqlash uchun Java va Python sinflardan foydalanadilar ob'ektda saqlanishi mumkin va bu holatni o'zgartirish usullari. Agar sinflar davlat va metod ta'riflari bo'lsa, bu holatlar bu sinflarning mujassamlanishidir. Odatda qachon ishlab chiquvchi ob'ektlar haqida gapirganda, u sinf nusxalarini anglatadi. Python-da str - satrlarni saqlash uchun ishlatiladigan sinf nomi. Str klassi simli usullarni aniqlaydi. B deb nomlangan str sinfining namunasini yaratish uchun sintaksisdan foydalaning Python satrlari: >>> b = "Men simman" >>> b
"Men simman"
Sinflar 193 Agar dasturchilar b muhokamasini boshlasalar , siz eng ko'p eshitishingiz mumkin turli xil atamalar. " B - bu satr", " b bu ob'ekt", " b - bu misol satrlar "... Ehtimol, oxirgi shakllantirish eng o'ziga xosdir. Ammo b torli sinf emas. Sinflar
status = "o'chirilgan" Kod
"yopiq" Id: 2e6a
Turi: String Kompyuter nima qiladi O'zgaruvchan ob'ektlar holat
str Id: 1aea
Turi: turi Anjir. 21.1. String ob'ekti Har bir ob'ekt turiga ega aslida bu ob'ekt sinfi. Bunday holda, bu str str ESLATMA Str klassni strings yaratish uchun ham ishlatish mumkin, ammo ko'proq turini o'zgartirish uchun ishlatiladi. Simlar tilga qurilgan, shuning uchun uzatiladi Harfdan to str gacha bo'lgan ortiqcha chiziq ortiqcha bo'lar edi. Boshqacha qilib aytganda, qilmang yozuvdan foydalaning >>> c = str ("Men torman"), chunki Python avtomatik ravishda a-ga belgi qo'yganda satr yaratadi dummies. Bu holda " tom ma'noda " atamasi maxsus sintaksisni anglatadi Python-ga o'rnatilgan simlarni yaratish. Boshqa tomondan, agar siz o'zgartirishingiz kerak bo'lgan raqamingiz bo'lsa Qatorga qo'ng'iroq qilib, str :
194 21-bob. Sinflar >>> num = 42 >>> javob = str (raqam) >>> javob '42'
Ularning aytishicha, Python "batareyalar bilan birga keladi" - kutubxona bilan birga - kami va sinflar ishlab chiqaruvchi uchun oldindan belgilangan. Bu sinflar odatda juda universal hisoblanadi. Siz aniqlashingiz mumkin o'zingizning fan sohangizga ixtisoslashgan o'z sinflaringiz STI, o'zgarishi mantiqqa ega bo'lgan ixtisoslashtirilgan ob'ektlar bu shart. Sinflar status = "o'chirilgan" "yopiq" Id: 2e6a
__-sinf __: str holat
Id: 1aea __-sinf __: turi __ qo‘ng‘iroq__ Id: 1be2
__-sinf __: usul_ kapitallashtirish ... ...
tavsiflovchi Satrlar sinfi M simli usul Kod Kompyuter nima qiladi O'zgaruvchilar Ob'ektlar Anjir. 21.2. Satr ob'yektining yangilangan versiyasi. Turi __class__ ga o'zgartirildi, chunki ob'ektni tahlil qilishda __class__ atributi ob'ekt sinfiga ishora qiladi. Bu sinf turli usullarni o'z ichiga oladi (diagrammada faqat katta harflar kiritish usuli ko'rsatilgan, ammo boshqalar juda ko'p). Diagrammadan ko'rinib turibdiki, usullar ham ob'ektlardir.
21.1. Sinfni rejalashtirish 195 21.1. Sinfni rejalashtirish Birinchidan, Python-da darslar har doim ham zarur emasligini unutmang. Tomonidan Agar sinfni aniqlash kerak bo'lsa yoki funktsiyalar (yoki guruhlar) etarli bo'lsa, o'ylab ko'ring funktsiyalari). Sinf dasturiy taqdimot uchun foydali bo'lishi mumkin. jismoniy yoki kontseptual ob'ektlar. Ta'rif beradigan tushunchalar mania, - tezlik, harorat, arifmetik o'rtacha, rang - yo'q darslarga yaxshi nomzodlar. Agar siz sinfdan foydalanib biror narsani modellashtirishga qaror qilsangiz, o'zingizga quyidagi savollarni bering: He Uning ismi bormi? ❍ U qanday xususiyatlarga ega? These Ushbu xususiyatlar barcha sinflarga xosmi? Aynan: Barcha sinf uchun qanday xususiyatlar umumiy? Ushbu xususiyatlarning qaysi biri har bir misol uchun o'ziga xos? He u qanday operatsiyalarni bajaradi? Muayyan bir misolni ko'rib chiqaylik. Aytaylik, siz konchilikda ishlaysiz tosh kurorti va chang'i liftini ishlatishni taqlid qilishni istayman. Bitta variant - bu stulni belgilaydigan sinf yaratish liftda. Yuk ko'tarish (agar siz to'satdan ishlatmagan bo'lsangiz) ko'plab kreslolar bilan jihozlangan. Chang'ichilar bazaga navbatda turishadi tog'larni stullarga o'tirish uchun, keyin ularni tepada qoldiring. Albatta, ma'lum bir mavhum darajada model zarur vat. Kresloning har bir past darajadagi mulkini modellashtirishga hojat yo'q. Masalan, yukni hisoblash uchun, qaysi materialdan qilinganligi muhim emas kreslo - alyuminiy, po'lat yoki yog'ochdan yasalgan. Boshqa tomondan, mumkin ba'zi chang'ichilar uchun muhim bo'lishi kerak. Simulyatsiya qilingan ob'ektning nomi bormi? Ha, stul. Xususiyatlari orasida stullar, siz ularning sonini, imkoniyatlarini, xavfsizlik paneli mavjudligini ta'kidlashingiz mumkin nosti va yumshoq o'rindiqlar. Agar siz biroz chuqurroq sho'ng'irsangiz, imkoniyatlar maksimal quvvat va joriy ish bilan taqsimlanishi mumkin. Maksimal quvvat esa doimiy bo'lib turishi kerak Buni istalgan vaqtda o'zgartirish mumkin.
196 21-bob. Sinflar Bir qator operatsiyalar kafedra bilan bog'liq - masalan, odamlarni qo'shish tog 'pichog'i va tepada chiqish. Boshqa harakat ham bo'lishi mumkin xavfsizlik darajasini belgilash. Yuklash va tushirish ishlari bilan shug'ullanamiz tashrif buyuruvchilar, lekin bizning modelimizda xavfsizlik paneli pozitsiyasi bo'ladi e'tiborsiz qoldirildi.
Quyidagi liftda stulni ifodalovchi Python sinfi. Birinchidan, oddiy sinf ta'rifini ko'rib chiqing; sharhlar Keyingi muhokamada o'lchangan: >>> sinf kafedrasi: # 1
... '' 'Kafedrada stul' '' №2 ... max_occupants = 4 №3 ...
... def __init __ (o'zini, id): №4 ... self.id = id №5 ... self.count = 0 ...
... def yuki (o'zini, raqamini): # 6
... self.count + = raqam ... ... def tushirish (o'zini, raqam): # 7 ... self.count - = raqam Python- dagi klass kalit so'zi sinfni belgilaydi. Sinf bo'lishi kerak ism (1) va undan keyin yo'g'on ichak qo'yildi. Shuni unutmang Pythonda yo'g'on ichakning orqasidan ichi bo'sh blok qo'yiladi (foydalanishdan tashqari) tilimlarda). Bundan tashqari, ostidagi ketma-ket kiruvchi belgilarga e'tibor bering sinf ta'rifi va sinf nomi katta harf bilan boshlanadi harflar.
ESLATMA Sinf nomlari " tuya sumkasi " da yozilgan . Yildan kafedrasi bir narsa deb so'zi, siz buni sezmagan bo'lishi mumkin. Nomlari vazifalaridan farqli o'laroq so'zlar "tuya sumkasida" pastki chiziqlar bilan bog'langan har bir so'z katta harf bilan boshlanadi va so'zlarning o'zi bir-biriga bog'lanadi. ajratuvchisiz. Odatda, sinf nomlari sinf nomlari sifatida ishlatiladi.
21.2. Sinfni aniqlash 197 otlar. Python-da sinf nomlari raqamlardan boshlanishi mumkin emas. Quyida sinf nomlariga misollar keltirilgan - ham yaxshi, ham yomon. • mushukcha # yaxshi • jaguar # bad - kichik harf bilan boshlanadi Snow Leopard # yaxshi - "tuya sumkasi" • White_Tiger # bad - pastki chiziqlarni o'z ichiga oladi • 9ta hayot # yomon - raqam bilan boshlanadi Sinf nomlarini tanlash bo'yicha qo'shimcha ma'lumot uchun bog'laning PEP 8 ga. Shuni ta'kidlash kerakki, ko'plab o'rnatilgan turlari ushbu qoidaga mos kelmaydi: str , int , float va boshqalar Sinf deklaratsiyasidan so'ng darhol siz oldingi qatorni qo'yishingiz mumkin hujjatlashtirish (2). Bu eng keng tarqalgan chiziq. E'tibor bering: agar bo'lsa satr uch tirnoq bilan o'ralgan, bir nechta bo'lishi mumkin paragraflar. Hujjatlar chiziqlari ixtiyoriy, ammo ular foydali bo'lishi mumkin. kodingizni o'qiydiganlar; ular shuningdek qachon yordam funktsiyasi orqali chiqariladi kodni tahlil qilish. Dokstringlarni ehtiyotkorlik bilan ishlating va bu katta foyda keltiradi. Tasdiqlangan atributlar sinf ichida yaratilishi mumkin. sinf (3). Sinf atributi holatni saqlash uchun ishlatiladi sinfning barcha holatlari uchun. Bizning misolimizda, biz xohlagan stul Biz to'rt kishini sig'dira olamiz. Atributlar sinflar o'zlarining afzalliklariga ega. Qiymati belgilangan beri sinfda, har birini yaratishda uni takrorlashingiz va so'rashingiz shart emas yangi stul. Boshqa tomondan, sizning o'rindiqlaringiz qat'iy dasturlashtiriladi shunda ular faqat to'rtta joyni qo'llab-quvvatlaydilar. Keyinchalik Siz sinf atributini qanday bekor qilishni bilib olasiz. Keyin def (4) buyrug'ini bajaring . Hammasi biz belgilaganga o'xshaydi sinf tanasi ichida ishlash. Hamma narsa haqiqatdir, funktsiya bundan mustasno Sinf tanasida to'g'ridan-to'g'ri aniqlangan funktsiya usul deb ataladi . Bu beri Usul __init__ maxsus nomiga ega , u konstruktor deb ataladi . Usul ikkita parametrni oladi: self va id . Avval ko'p usullar parametr o'zi . Buni misol sifatida talqin qilish mumkin. sinf.
198 21-bob. Sinflar Konstruktor sinf ishga tushirilganda chaqiriladi. Agar sinfni shablonni taqdim etadigan yoki "zavod" deb hisoblang misollarni yaratish uchun chizilgan, konstruktor ishga tushiradi ushbu namunalarning turishi. Konstruktor kirishda namuna oladi ma'lumotlar ( o'zi parametr ) va uni usul ichida yangilaydi. Python yordam beradi va avtomatik ravishda sizga namunani uzatadi. Biroq, bu sabab bo'lishi mumkin tartibsizlik, lekin keyinchalik bu haqida ko'proq. Konstruktor tanasining ichida (5) (chunki u ichkariga joylashtirilgan undan keyin yo'g'on ichak) noyob xususiyatga ega bo'lgan ikkita atribut qo'shilgan Masalan: id va count . Ko'pgina liftlarda, har birida stul noyob raqam bilan belgilanadi. Id atributi raqamni anglatadi. Bundan tashqari, bir nechta chang'ichilar bitta stulga minishlari mumkin - ularning soni Qiymat hisoblash atributida saqlanadi va nolga tenglashtiriladi. To'lash diqqat: konstruktor hech narsani qaytarmaydi, lekin qiymatlarni yangilaydi, misol uchun noyob.
Python-da o'rnatilgan id funktsiyasi mavjud , ammo undan foydalanishingiz ham mumkin bu nom sinf atributining nomi sifatida. Id funktsiyasi mavjud bo'lib qoladi. Har safar id atributiga murojaat qilmoqchi bo'lsangiz , qidiruv amalga oshiriladi Nusxalash orqali Agar misolga kafedraning nomi berilgan bo'lsa , u holda yarim uchun ID qiymati uchun kafedra.id yozuvidan foydalaning . Shunday qilib, o'rnatilgan funksiya almashtirilmaydi. Konstruktor mantig'ining yakunlanishi g'oyib bo'lish bilan baholanishi mumkin kirish darajasi. Biz boshqa usulning ta'rifini ko'rib turibmiz (6), yuk . Bu usul bir misol tomonidan bajarilishi mumkin bo'lgan operatsiyani anglatadi sinf. Bunday holda, stul yo'lovchilarni yuklashi mumkin va bu usul misolda bunday vaziyatlarda nima qilish kerakligini aytadi. Va yana self (misol) bu usulning birinchi parametridir. Ikkinchi parametr raqam , stulda o'tirgan odamlar sonini o'z ichiga oladi. eslab qoling liftdagi stul odatda bir nechta (bizda to'rttagacha) ushlab turadi misol) shaxs. Chang'ichi stulga o'tirganda, qo'ng'iroq qilish kerak O'rnatish uchun mo'ljallangan yuki va ushbu usulning tanasi yangilash atributlari soni misol.
Shuningdek, qo'ng'iroq qilish kerak bo'lgan juftlashtirilgan tushirish (7) usuli ham mavjud chang'ichi tog 'tepasidagi liftdan tushganda.
21.2. Sinfni aniqlash 199 Foydalanuvchi belgilaydigan sinflar sinf kafedrasi: '' 'Boshqa kafedra' '' max_occupants = 4 def __init __ (o'zi, id): self.id = id self.count = 0 def yuki (o'zini, raqamini): self.count + = raqam def tushirish (o'zini, raqam): self.count - = raqam Kod Kompyuter nima qiladi O'zgaruvchan ob'ektlar Kafedra
Id: 1aea __-sinf __: turi 4 Id: 1be2
__-sinf __: int max_occupants __init__ yuklamoq
... Id: 2a00
__class __: funktsiyasi Id: 2aa4
__class __: funktsiyasi Anjir. 21.3. Sinf namunasini yaratish. Python siz uchun yangi turni yaratadi. Barcha sinf atributlari yoki usullari yangi klass atributlarida saqlanadi. Sinov atributlari (id va hisoblash) mavjud emas, chunki ular misollar uchun belgilangan ESLATMA Usullardan qo'rqmang. Siz allaqachon ko'plab usullarni ko'rgansiz - masalan, usul satr uchun belgilangan .capitalize . Usullar funktsiyalardir ia sinfga biriktirilgan. Usul o'zi tomonidan emas, balki uchun chaqiriladi Sinf namunasi: >>> matt.capitalize () "Mat"
200 21-bob. Sinflar Shunday qilib, sinf yaratish oson. Avval ehtiyojni aniqlaysiz n atributlari. Sinf darajasida mavjud bo'lgan bu xususiyatlar sinf ta'rifiga mos keladi. Ularning har biriga xos xususiyatlar misollar konstruktorga joylashtirilgan. Siz ham belgilashingiz mumkin Sinf namunasini o'zgartiradigan operatsiyalar bilan usullar. Keyin sinf aniqlanadi, Python sinf nomi bilan o'zgaruvchini yaratadi, qaysi sinfga ishora qiladi: >>> Kafedra Kengaytirilgan sinf ma'lumotlari uchun siz foydalanishingiz mumkin funktsiya dir . Izoh: sinf atributlari aniqlangan sinfda, va ularga sinf nomi bilan kirish mumkin: >>> dir (kafedra) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'load', 'max_occupants', 'tushirish'] >>> Chair.max_occupants 4 Ushbu qismdagi diagramma atributlar va usullarning qanday saqlanishini ko'rsatadi. sinf. Shuningdek, atributlar va usullarning ro'yxatini REPL-dan ko'rish mumkin. Python-da ob'ektlardan boshqa hech narsa yo'qligi sababli ularning barchasida atribut- ovoz __class__ : >>> kafedra .__ sinf__ >>> kafedrasi.max_okkupantlari .__ sinf__ >>> kafedrasi .__ tashabbusi __.__ sinf__ >>> kafedra yuklamasi .__ sinf__ >>> kafedra yuklamasi .__ sinf__
21.3. Sinf namunasini yaratish 201 Usullar sinf darajasida ham aniqlanadi, ammo namunaviy atributlar mavjud moat - yo'q. Masalan atributlari ob'ekt uchun noyob bo'lganligi sababli, ular nusxada saqlanadi. Agar sizning sinfingizda yoki uning usullarida hujjatlar liniyalari aniqlansa, ularni yordam bilan ko'rishingiz mumkin : >>> yordam (kafedra) __Main__ modulidagi sinf kafedrasi bo'yicha yordam: sinf kafedrasi (qurilgan.obekt) | Kafedrada stul | | Bu erda belgilangan usullar: | | __init __ (shaxsiy, id) | | yuk (o'zi, raqam) | | tushirish (o'zi, raqami) | | -------------------------------------------------- ---- | Ma'lumot tavsiflovchilar bu erda aniqlanadi: | | __ qaror __ | misol o'zgaruvchilar uchun lug'at (agar aniqlangan bo'lsa) | | __weakref__ | ob'ektga zaif murojaatlar ro'yxati (agar aniqlangan bo'lsa) | | -------------------------------------------------- ---- | Bu erda aniqlangan ma'lumotlar va boshqa atributlar: | | max_occupants = 4 Download 363.98 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling