1-sahifa 2-sahifa
19.7. Faylga asoslangan dizayn
Download 363.98 Kb.
|
Python
- Bu sahifa navigatsiya:
- 178-sahifa 178
- 179-bet 19.9. Mashqlar 179
- 180-bet 20 yagona kod
- 20.1. Tarix malumotnomasi
- 181-sahifa 20.1. Tarix malumotnomasi 181
- 182-sahifa 182
- 183-bet 20.2. Python-dagi muhim bosqichlar 183
- 20.2. Python-dagi muhim bosqichlar
- 185-bet 20.3. Kodlash 185
- 187-sahifa 20.4. Dekodlashtirish 187 20.4. Dekodlashtirish
- 20.5. Unicode va fayllar
19.7. Faylga asoslangan dizayn 177 19.7. Faylga asoslangan dizayn Siz allaqachon funktsiyalarni tartibga solish va tuzish uchun qanday foydalanishni ko'rgansiz- murakkab dasturlar. Foydalanishning afzalliklaridan biri funktsiyalari bu funktsiyalarni qayta ishlatish mumkinligi kodda. Bu ishlaydigan xususiyatlarni tashkil qilish bo'yicha foydali maslahatlar. fayllar bilan. Aytaylik, fayl nomini oladigan kod yozmoqchisiz va fayldan va har biridan oldin qatorlar ketma-ketligini yaratadi chiziq uning raqamini kiritadi. Bir qarashda, ko'rinishi mumkin O'zingizning API (Application Programming Interface) funktsiyalari tarkibiga kerakli fayl nomini olish kerak tahrirlash: >>> def add_number (fayl nomi): ... natijalar = [] ... ochiq (fayl nomi) fin sifatida: ...
raqam uchun, sonlar qatori (fin): ...
results.append ( ... '{0} - {1}'. Formati (raqam, qator)) ... natijalarni qaytaring Ushbu kod juda yaxshi ishlaydi. Agar kerak bo'lsa, nima bo'ladi fayldan emas, balki boshqa manbadan olingan satrlardan oldin raqamlarni kiriting tochnik? Agar siz kodni sinab ko'rishingiz kerak bo'lsa, endi buni qilishingiz kerak Fayl tizimiga ulaning. Bir yechim - bu funktsiyani qaytarish faylni faqat kontekst menejerida ochishi uchun add_nearn , va keyin yana bir funktsiyani chaqirdi - add_nums_to_seq . Yangi xususiyat bog'liq emas, ketma-ketlik bilan ishlaydigan mantiqni o'z ichiga oladi fayl nomidan. Fayl ketma-ketliklar ketma-ketligi kabi ishlaydi, asl funksionallik saqlanib qoladi: >>> def add_number (fayl nomi): ... ochiq (fayl nomi) fin sifatida: ... qaytish add_nums_to_seq (fin) >>> def add_nums_to_seq (seq): ... natijalar = [] ... raqami uchun raqamlar qatori (seq): ...
results.append (
178 19-bob I / O-fayl ... '{0} - {1}'. Formati (raqam, qator)) ... natijalarni qaytaring Endi sizda yana qo'shimcha funktsiyalar mavjud add_nums_to_seq va boshqalar sinov va qayta foydalanish uchun suruv, chunki buning o'rniga Fayl nomiga qarab, bu ketma-ketlikka bog'liq. Siz satrlar ro'yxatidan o'tishi yoki nosog'lom fayl yaratishi mumkin funktsiyalari uzatiladi.
Shunga o'xshash interfeysni amalga oshiradigan boshqa turlari ham mavjud fayl interfeysi bilan (o'qish va yozish). Qachon bo'lganingizda Dasturlash paytida fayl nomidan foydalanish uchun o'zingizdan so'rang bu mantiqni boshqa ketma-ketliklarga qo'llash mumkinmi? Agar iloji bo'lsa, yuqoridagi qayta ishlovchi misoldan foydalaning kam foydalanish muammosini keltirib chiqaradigan kodni olish - sinov va sinov. 19.8. Xulosa Python o'zaro ishlash uchun bitta ochiq funktsiyani taqdim etadi matnli va ikkilik fayllar bilan. Rejimni belgilab, siz Python, fayl bilan qanday operatsiyalarni bajarish kerak - o'qish yoki yozib oling. Matnli fayllar bilan ishlashda o'qish va yozish kerak torlari. Ikkilik fayllar bilan ishlashda ular o'qiladi va yoziladi bayt torlari. Fayllarni yopishni unutmang. Idiomatik yopish foydalanish bilan buyruq hisoblanadi . Va nihoyat, bunga ishonch hosil qiling sizning funktsiyalaringiz o'rniga ma'lumotlar ketma-ketligi bilan ishlash mumkin fayl nomlari, chunki bu sizning kodingizni yanada ko'p qirrali qiladi.
1. Ajratilgan ma'lumotlar fayllarini yozish funktsiyasini yozing beshinchi (CSV, vergul bilan ajratilgan qiymatlar). Funktsiya yarim bo'lishi kerak parametrlarda fayl nomi va bog'lanishlar ro'yxati. Tuvaklar kerak Bizda ism, manzil va yosh mavjud. Fayl chiziq yaratishi kerak
19.9. Mashqlar 179 sarlavha va undan keyin har bir qator uchun qator. Agar Quyidagi bog'lanishlar ro'yxati funktsiyaga o'tkaziladi: [('Jorj', '4312 Abbey yo'li', 22), ('John', '54 Love Ave ', 21)] Faylga quyidagi ma'lumotlar yozilishi kerak: nomi, manzili, yoshi Jorj, 4312 Abbey yo'li, 22 Jon, 54-sonli Sevgi prospekti, 21-uy 2. CSV fayllarini o'qish uchun funktsiyani yozing. U qaytishi kerak birinchi qatorni nom sifatida talqin qilib, lug'atlar ro'yxatini tuzing tugmachalari va har bir keyingi qatorda ushbu tugmachalarning qiymatlari sifatida. Yuqoridagi misolda keltirilgan ma'lumotlar uchun quyidagilar qaytariladi natija:
[{'name': 'George', 'address': '4312 Abbey Road', 'age': 22}, {'name': 'John', 'address': '54 Love Ave ',' age ': 21}]
20 yagona kod Ushbu kitobda chiziqlar allaqachon bir necha bor ko'rilgan, ammo biz hali ham yo'q Python 3-ning eng katta o'zgarishlaridan biri - Uni torlarini muhokama qildi kodi. Python 2-da Unicode satrlari qo'llab-quvvatlandi, ammo kerak edi maxsus yaratilgan. Endi vaziyat o'zgargan, barcha qatorlar saqlangan unikodda. 20.1. Tarix ma'lumotnomasi Unicode nima? Bu gliflar uchun standart. (yozuvlarning ko'pchiligiga kiritilgan belgilar, shuningdek belgilar va kulgichlar). Standartning xususiyatlarini Unicode 1 veb-saytida topish mumkin , bundan tashqari, standart ko'pincha yangilanadi. Standart turli xillardan iborat
Giflar (H yoki ☺ ) va nomlar bilan 0048 yoki 1F600 kabi raqamlar ( LATIN KAPITALI H va GRINNING YO'Q ). Kod nuqtalari va nomlari noyob, garchi ko'plab gliflar juda o'xshash bo'lsa-da. Va endi ozgina tarixiy ma'lumot. Keng tarqalgan turli xil kompyuterlar turli xil sxemalarni taklif qila boshladilar Ikkilamchi ma'lumotlarni simli ma'lumotlarga xaritalash Ulardan biri FIR kodlashlari - ASCII - 7 ko'rsatishda ma'lumotlar bitlaridan foydalanadi 128 belgilar va boshqarish belgilar. Ushbu kodlash normaldir masalan, lotin alifbosiga yo'naltirilgan muhitda ishlaydi 1 https://unicode.org
20.1. Tarix ma'lumotnomasi 181 o'lchovlar ingliz tilida. 128 xil gliflarga ega bo'lish ta'minlanadi kichik harflar va bosh harflar uchun etarli joy harf, raqamlar va tinish belgilari. Vaqt o'tishi bilan ingliz tilidan tashqari boshqa tillarni qo'llab-quvvatlash yanada ko'paydi keng tarqalgan va ASCII kodlash etarli emas edi. Oilalarda Windows 98-dan oldin Windows Windows-1252 kodlashni qo'llab-quvvatlaydi turli diakritik belgilar va belgilarni qo'llab-quvvatlash bilan (masalan. Evro belgisi). Ushbu kodlash sxemalarining barchasi birlamchi xaritalashni ta'minlaydi. har bir belgi uchun bayt. Xitoy, koreys va yapon tillarini qo'llab-quvvatlash uchun Yozish uchun 128 tadan ortiq belgi kerak bo'ladi. To'rt bayt kodlash 4 milliarddan ortiq belgilarni qo'llab-quvvatlashga imkon beradi. Muallif: Bundan tashqari, bunday universallik bejiz emas. Ko'pchilik uchun, faqat ASCII belgilaridan foydalangan holda to'rtburchak bir xil miqdordagi ma'lumotlar bilan xotira narxining oshishi ko'rinadi yog'li xotira yo'qolishi. Barcha belgilarni ortiqcha xarajatlarsiz qo'llab-quvvatlash xotira, men murosaga kelishim kerak edi - kodlashni rad qilish bitlarning belgilar ketma-ketligi. Buning o'rniga belgilar edi mavhum. Har bir belgi noyob kod bilan taqqoslandi
ism). Keyin turli xil kodlashlar kodli nuqtalarni ko'rsatdi bit kodlash. Unicode Sim-ga mos keladi ho'kiz va kod nuqtasi, aniq bir vakillik emas. Turli xillarda kontekstlarda muqobil vakillik ko'proq ma'lumot berishi mumkin samarali ishlash. Kodlashlardan biri bo'lgan UTF-32 ma'lumotni saqlash uchun 4 baytdan foydalanadi Ramz haqidagi matsiyalar. Ushbu ko'rinish past darajadagi odamlar uchun qulay Trivial indeksatsiya operatsiyalari tufayli dasturchilar. Boshqa tomondan, ASCII-ga qaraganda to'rt barobar ko'proq xotira sarflaydi, Lotin alifbosidagi bir qator harflarni kodlash uchun. O'zgaruvchan kenglikdagi kodlash tushunchasi ham kurashishga yordam berdi xotira bosh bilan. Ushbu kodlashlardan biri UTF-8 bo'lib, unda Belgini ifodalash uchun 1 dan 4 baytgacha foydalanish. Undan tashqari Bundan tashqari, UTF-8 orqaga qarab ASCII bilan mos keladi. UTF-8 - bu eng yaxshisi
182 20-bob. Unicode K a u a
TO VA G Utf-8
TO Yuzlar Kulgilarga osonlikcha og'iz orqali buyuriladi. kodlar jadvalidagi belgilarni qidirish. 1F60
0 1F61 1F62 1F63 1F64 YUQORI YOZ '\ N {YUZ YUZISH}' '\ U0001f600' '' b '\ xf0 \ x9f \ x98 \ x80', dekodlash ('utf8') 1F600 1F600
1F610 1F620
1F630 1F640
1F601 1F602
→ 263A 1F603
Yuz bilan kulish Ko'z yoshlariga KULMOQ a (a)
G VA TO Anjir. 20.1. Unicode.org-da kod jadvallarini o'qish. Jadvallar keltirilgan tegishli o'n oltilik kodeks nuqtalari bo'lgan gliflar. Buning uchun keyin jadval kodi, glif va nomli boshqa jadval keltirilgan. Siz glif, ism yoki kod nuqtasidan foydalanishi mumkin. Agar kod nuqtasi bo'lsa 4 ta raqamdan ko'p bo'lsa, U katta harfdan foydalaning va chapdagi kodni nol bilan kiriting 8 ta raqam. Agar raqamlar 4 yoki undan kam bo'lsa, u kichik harfdan foydalanish kerak chap tomonda kodni nol bilan 4 raqamga qo'ying. Kodni ochish misoli ham keltirilgan. Tegishli glifga UTF-8 baytli qator
20.2. Python-dagi muhim bosqichlar 183 Internetda keng tarqalgan kodlash - kod uchun juda yaxshi xarakteristikasi, chunki u ko'plab dasturlar tomonidan qo'llab-quvvatlanadi va operatsion tizimlar. MASLAHAT Mashinangiz uchun afzal qilingan kodlashni bilish uchun quyidagilarni bajaring quyidagi kod (mening 2015 Mac uchun natijam berilgan): >>> import mahalliy >>> lokal.getpreferredencoding (noto'g'ri) 'UTF-8'
Yana bir bor aniqlik kiritamiz: UTF-8 - bayt kodni bayt kodlash kodi. UTF-8 va Unicode eng yaxshi deb ayt noaniqlik va eng yomoni, kodni noto'g'ri tushunish belgilar. Bundan tashqari, ismning o'zi "Unicode" so'zlaridan kelib chiqadi Transformatsiya formati - 8 bit ", ya'ni" Uni- kod 8 bitli, "bu Unicode formatidir. Bir misolni ko'rib chiqaylik. SUPERSCRIPT IKKI deb nomlangan belgi aniqlandi Unicode standartida U + 00b2 kod nuqtasi sifatida. Uning glifasi (bosilgan) vakillik) ² shakliga ega. ASCIIda bu belgini namoyish etish mumkin emas. lekin. Windows-1252-da bunday vakillik mavjud, belgi kodlangan b2 bayt o'n oltilik belgi bilan belgilanadi (bu tasvir mos keladi) kod nuqtasi bilan, garchi bunday moslik kafolatlanmagan). UTF-8 da c2 kodlashiga mos keladi . Xuddi shunday UTF-16 da, ff fe b2 00 kodlash usulidan foydalanadi . Shunday qilib, bu kod ishora Unicode bir nechta turli xil kodlashlardan iborat. 20.2. Python-dagi muhim bosqichlar Python-da siz Unicode satrlarini yaratishingiz mumkin. Aslida, siz buni qildingiz kitobning birinchi sahifalarida: Python 3-da barcha satrlar kodlanganligini eslang unikodda. Agar siz belgilar bilan satr yaratmoqchi bo'lsangiz nima bo'ladi? emas ASCII? Quyida "x 2 " satrini yaratish uchun kod mavjud . Agar satrda ishlatiladigan glifni topasiz, nusxa oling koddagi belgi: >>> natija = 'x²'
184 20-bob. Unicode Unicode kodlash va dekodlash Unicode qatori x "x \ u00b2" "x \ n {IKKI SUPERSCRIPT}" Bayt qatori .encode ('utf-8') .decode ('utf-8') 2 b "x \ xcb \ xb2 Anjir. 20.2. Kodlash (bu holda UTF-8) satrlari Bayt vakillik va keyingi ichiga Unicode o'girish shu Unicode baytli qator (UTF-8-dan foydalangan holda). Shuningdek dekodlash sizning niyatlaringiz haqida juda aniq bo'lishi kerak, chunki noaniqlik noto'g'ri ma'lumotlar yoki belgilar buzilishiga olib keladi Ushbu usul odatda ishlaydi, garchi muammolar yuzaga kelsa ham Shriftingiz belgilangan glifni qo'llab-quvvatlamaydi. Keyin o'rniga bo'ladi " tofu " deb nomlangan ekranni (bo'sh to'rtburchak yoki rombus) namoyish eting savol belgisi bilan). Shuningdek, kiritilmagan belgilarni kiritish uchun ASCII-da siz Unicode o'n oltilik kod kod nuqtasini yoqishingiz mumkin \ u prefiksidan keyin : >>> natija2 = 'x \ u00b2' E'tibor bering: bu chiziq oldingi satr bilan bir xil: >>> natija == natija2 Rost Va nihoyat, satrda kod nuqtasi nomini ilova qilish orqali ishlatishingiz mumkin uni \ n {} qavs ichida : >>> result3 = 'x \ N {IKKINChI SUPERSCRIPT}' Ushbu usullarning barchasi ishlaydi. Va ularning barchasi bir xil satrni qaytaradi Unicode:
>>> chop eting (natija, 2-natija, 3-natija) x² x² x²
20.3. Kodlash 185 Uchinchi variant kamroq ixchamdir. Ammo eslamasangiz kerakli kod nuqtasi yoki glif shrift bilan qo'llab-quvvatlanmaydi, ehtimol bu variant eng o'qiladigan. MASLAHAT Python hujjatlarida Unicode bo'yicha bo'lim mavjud. Kirish help () va keyin UNICODE . Ushbu bo'limda Unicode haqida ko'p narsa muhokama qilinmaydi, Python satrlarini yaratishning turli xil usullari. 20.3. Kodlash Python-da Unicode-ni tushunishning kalitlaridan biri bu tushunish- Bir haqiqatdir Unicode string bir bayt satrlari kodlangan . Bayt Yuqori satrlar hech qachon kodlanmaydi, lekin ularni mag'lubiyatga uchratish mumkin Unicode Xuddi shunday, Unicode satrlari dekodlanmaydi . Kodlash va dekodlash jarayonlarini ko'rib chiqishingiz mumkin boshqa tomondan: kodlash tushunarli yoki mazmunli o'zgaradi mavhum vakillik uchun inson vakili mo'ljallangan saqlash uchun (baytdagi harflar yoki baytlarda harflar) va dekodlash uchun ushbu mavhum tasvirni qulay shaklga qaytaradi odam uchun. Berilgan Unicode STRING uchun, siz qo'ng'iroq qilishingiz .encode usuli uchun uning taqdimotini turli xil kodlashlarda tomosha qiling. UTF-8 bilan boshlaylik: >>> x_sq = 'x \ u00b2' >>> x_sq.encode ('utf-8') b'x \ xc2 \ xb2 ' Agar Python kodlashni qo'llab-quvvatlamasa, xato tashlanadi UnicodeEncodeError . Bu Unicode kod nuqtalari yo'qligini anglatadi ushbu kodlashda qo'llab-quvvatlanadi. Masalan, ASCII qo'llab-quvvatlamaydi kvadratik belgi: >>> x_sq.encode ('ascii') Traceback (eng so'nggi qo'ng'iroq oxirgi): ... UnicodeEncodeError: 'ascii' kodek belgi kodlay olmaydi 1-pozitsiyadagi '\ xb2': tartibsiz (128)
186 20-bob. Unicode Agar siz Python bilan uzoq vaqt ishlagan bo'lsangiz, ehtimol siz duch kelgansiz bu xato bilan. Belgilangan kodlash imkon bermaydi degan ma'noni anglatadi barcha belgilarni ifodalaydi. Agar siz majbur qilmoqchi bo'lsangiz Kodlash uchun Python, keyin siz xatolar parametrini o'tishingiz mumkin . Nima- Python tasavvur qila olmaydigan belgilarga e'tibor bermaslik, xatolarni o'tkazib yuboring = 'e'tiborsiz' parametr : >>> x_sq.encode ('ascii', xatolar = 'e'tiborsizlik') b'x '
Agar siz xatolar = 'almashtirish' parametrini o'tkazsangiz , Python savol beruvchini joylashtiradi - Qo'llab-quvvatlanmaydigan bayt o'rniga belgilar: >>> x_sq.encode ('ascii', xatolar = 'almashtirish') bxx? '
ESLATMA Kodlash moduli qo'llab-quvvatlanadigan kodlash uchun xaritalarni o'z ichiga oladi Python Python 3.6 99 kodlashni qo'llab-quvvatlaydi. Ko'p zamonaviy ilovalar UTF-8 bilan cheklanib qolishga harakat qiladi, ammo sizga yordam kerak bo'lsa Boshqa kodlashlarga kelsak, ular Python-da qo'llab-quvvatlanishi mumkin. Kodlash jadvali encodings.aliases.aliases-da joylashgan . Shuningdek, stol kodlash Python 1 saytidagi modul hujjatlarida berilgan . Ushbu chiziq uchun kodlashning bir nechta mumkin bo'lgan variantlari: >>> x_sq.encode ('cp1026') # turkcha b '\ xa7 \ xea' >>> x_sq.encode ('cp949') # Koreys b'x \ xa9 \ xf7 ' >>> x_sq.encode ('shift_jis_2004') # yapon b'x \ x85K ' Python ko'plab kodlashni qo'llab-quvvatlasa ham, ular kamroq va kamroq ishlatiladi. amalda. Qoida tariqasida, ular faqat meros qilib olinadi ilovalar. Hozirgi kunda ko'pgina dasturlar UTF-8-dan foydalanadi. 1 https://docs.python.org/3/library/codecs.html
20.4. Dekodlashtirish 187 20.4. Dekodlashtirish Python-da "dekodlash" atamasi alohida ma'noga ega. U degani baytlar ketma-ketligini olish va Unicode qatorini yaratish. Pythonda baytlar hech qachon kodlanmaydi, lekin faqat kodlangan (tegishli- Aslida , bayt uchun .encode usuli mavjud emas). Agar eslasangiz ushbu qoida, bu sizni ramzlar bilan ishlashda ko'p muammolardan xalos qiladi, ASCIIda emas. Aytaylik, sizda ketma-ketlik bor X ² uchun UTF-8 bayt : >>> utf8_bytes = b'x \ xc2 \ xb2 ' Bayt sifatida berilgan belgilar ma'lumotlari bilan ishlashda, iloji boricha tezroq ularni Unicode qatoriga o'tkazishga harakat qiling. Odatda, dasturda siz faqat satrlar bilan shug'ullanishingiz kerak, va baytlardan faqat seriyalash mexanizmi sifatida foydalaning (ya'ni qachon fayllarni saqlash yoki ularni tarmoq orqali uzatish). Agar siz ushbu baytlarni olsangiz ba'zi bir manbadan va ishlatilgan ramka yoki kutubxona emas ularni satrga o'zgartiradi, siz buni qilishingiz mumkin: >>> text = utf8_bytes.decode ('utf-8') >>> matni 'x²' Siz diqqat qilishingiz kerak bo'lgan yana bir nuqta - bu siz qila olmaysiz baytlarning ketma-ketligi kodlanganligini taxmin qiling. Bilasizmi, koddagi ma'lum bir ketma-ketliklar UTF-8, chunki siz uni o'zingiz yaratgansiz; lekin agar noma'lum bayt bo'lsa Siz ularni boshqa manbadan olgan bo'lsangiz, ehtimol ular ega bo'lishi mumkin boshqa kodlash.
Belgilarni kodlashni bilishingiz kerak; aks holda siz qila olasiz noto'g'ri kodlash bilan dekodlashga harakat qiling va oling noto'g'ri ma'lumotlar. Bunday noto'g'ri dekodlangan satrlar deyiladi " Mojibake " ("belgilarni buzish" degan ma'noni anglatuvchi yaponcha so'z - lekin) "Mojibake" salqinroq eshitiladi).
188 20-bob. Unicode Noto'g'ri dekodlashga bir nechta misollar: >>> b'x \ xc2 \ xb2'.decode ('cp1026') # turkcha '¥B ¥' >>> b'x \ xc2 \ xb2'.decode ('cp949') # Koreys 'x' >>> b'x \ xc2 \ xb2'.decode ('shift_jis_2004') # yapon 'x' Ba'zi kodlashlar barcha bayt ketma-ketligini qo'llab-quvvatlamaydi. Agar siz noto'g'ri kodlash bilan dekodlashni amalga oshirsangiz, buning o'rniga buzilgan belgilar siz istisno olasiz. Masalan, ASCII emas bayt quyidagi ketma-ketlikni qo'llab-quvvatlaydi: >>> b'x \ xc2 \ xb2'.decode ('ascii') Traceback (eng so'nggi qo'ng'iroq oxirgi): ...
UnicodeDecodeError: 'ascii' kodek 0xc2 baytini dekodlay olmaydi 1 pozitsiyada: tartibsiz (128) UnicodeDecodeError xatosi, siz aylantirmoqchi bo'lganingizni anglatadi Unicode satriga bayt-satr yoziladi va kodlashga ruxsat berilmaydi Barcha baytlar uchun unikal kod satrlari. Qoida tariqasida, bu foydalanishdan dalolat beradi noto'g'ri kodlash. Optimal natijalar uchun, kodirovka to'g'ri kodlashni aniqlashga va ishlatishga harakat qiladi. Agar kodlash noma'lum bo'lsa, siz xatolar parametrini = 'e'tiborsiz qoldirishingiz' , ammo bu ma'lumotlar yo'qolishiga olib keladi. Ushbu chora faqat ishlatilishi kerak. oxirgi chora sifatida: >>> b'x \ xc2 \ xb2'.decode ('ascii', xatolar = 'e'tibor bermaslik') 'x'
20.5. Unicode va fayllar Matnli faylni o'qiyotganda Python Unicode satrlarini qaytaradi. Python odatiy kodlashni qo'llaydi ( locale.getpre fer re- kodlash (noto'g'ri) ). Agar siz matnli faylni boshqasiga kodlamoqchi bo'lsangiz kodlash, ushbu ma'lumotlarni parametrlarni kodlash funktsiyasiga o'tkazing yozildi ochiq .
Download 363.98 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling