1-sahifa 2-sahifa


Download 363.98 Kb.
bet20/21
Sana06.06.2020
Hajmi363.98 Kb.
#115448
1   ...   13   14   15   16   17   18   19   20   21
Bog'liq
Python


24.5. Importni tashkil qilish

PEP 8-ga binoan import buyruqlari joylashgan bo'lishi kerak

modul hujjatlari qatoridan keyin fayl liniyasi. Har bir satr bo'lishi kerak

bitta import buyrug'i mavjud va import buyruqlari bo'lishi kerak

birgalikda guruhlangan:

❍ standart kutubxonadan import qilish.

Third Uchinchi tomon kodidan import qiling.

Local Mahalliy paketlardan import qiling.





242-sahifa

242

24-bob. Kutubxonalarni import qilish

Masalan, modulning boshlanishi quyidagicha ko'rinishi mumkin:

#! / usr / bin / env python3

"" "

Modul yozuvlarni JSON-ga o'zgartiradi



va ularni ma'lumotlar bazasida saqlaydi

"" "


import json

# Standart kutubxonalar

import sys

import psycopg2

# Uchinchi tomon kutubxonalari

import recordconverter # Mahalliy kutubxonalar

...

MASLAHAT

Guruhlangan import buyruqlari alfa tomonidan qulay tartiblangan

vitu.

MASLAHAT

Ba'zida import buyruqlari quyidagini keyinga qoldirishi mumkin

sabablar:

• davriy importning oldini olish uchun (qaysi holatlarda)

to'dalar modullari bir-birini import qiladi). Agar qila olmasangiz (yoki xohlamasangiz)

tsiklik importni oldini olish uchun reaktor

Bundan tashqari, import buyrug'i kod yoki funktsiyaga yoki usulga joylashtirilishi mumkin

ulardan import qilinadigan narsalar deyiladi.

Ba'zi modullarda mavjud bo'lmagan modullarni olib kirishni oldini olish

tizimlari.

• Katta modullarni olib kirishni oldini olish uchun ishlatmang

Dasturda Mykh.





243-bet

24.7. Mashqlar

243

24.6. Xulosa

Ushbu bob Python-ga kutubxonalarni import qilishni ko'rib chiqdi.

Python katta standart 1 kutubxonasiga ega va sizga kerak bo'ladi

kodlardan foydalanish uchun ushbu kutubxonalarni import qiling. Kitob yo'q

bir vaqtlar Pythonda ob'ektlardan boshqa narsa yo'qligi ta'kidlangan.

va siz ko'pincha ushbu ob'ektlarga ishora qiluvchi o'zgaruvchilar yaratasiz. Da

modulni import qilish ob'ektga ishora qiluvchi o'zgaruvchini yaratadi

moduli Shundan so'ng siz istalgan elementga murojaat qilishingiz mumkin

qidirish operatsiyasidan foydalangan holda modul nomlari bo'sh joylari ( . ).

Siz shuningdek nomlar maydonining qismlarini tanlab import qilishingiz mumkin

moduli dan amri . Agar siz import qilingan nomni o'zgartirmoqchi bo'lsangiz

element sifatida, konstruktsiya sifatida foydalaning .



24.7. Mashqlar

1. standart Python kutubxonasida JSON bilan ishlash uchun paketni toping.

Kutubxona modulini import qiling va atributlarni ko'ring.

Qo'shimcha ma'lumot olish uchun yordam funktsiyasidan foydalaning .

moduldan foydalanish to'g'risida fikr. Serializatsiyalashtirish lug'ati, havolasi-

asosiy "nomi" ismingiz va asosiy «yoshi» siz yosh bilan,

JSON satriga. Python-da JSON-ni Desializatsiya qiling.

2. Chiqish uchun standart Python kutubxonasida paketni toping

o'tkaziladigan kataloglar. Ushbu paketdan foydalaning va yozing

Katalog nomini oladigan funktsiya barcha fayllarning ro'yxatini oladi

ushbu katalogda joylashtirilgan va har biri uchun fayllar soni ko'rsatilgan hisobot ko'rsatiladi

th kengaytirish.

1

https://docs.python.org/3/library/index.html





244-bet

25 kutubxonalar:

paketlar va modullar

24-bo'limda siz kutubxonalarni qanday import qilishni o'rgandingiz. Ushbu bobda biz

Keling, kutubxona nima ekanligini tushunaylik. Import paytida

Kutubxonaga ikkita talab qo'yiladi:

1. Kutubxona modul yoki paket bo'lishi kerak .

2. Kutubxona o'zgaruvchi tomonidan belgilangan joyda bo'lishi kerak

PYTHONPATH muhiti yoki Python sys.path o'zgaruvchisi .

25.1. Modullar

Modullar .py kengaytmasi va nomi bo'lgan Python fayllari ,

import uchun mos. PEP 8 ga binoan, modulli fayl nomlari

Qisqa va kichik harflardan iborat bo'lishi kerak. Belgilar

pastki chiziqlarni o'qish uchun foydalanish mumkin.



25.2. Paketlar

Python-dagi paket bu nomlangan faylni o'z ichiga olgan katalog

__init__.py . __Init__.py faylida har qanday bajarilish bo'lishi mumkin (yoki.)

odatda bo'sh bo'ling). Bundan tashqari, katalogda o'zboshimchalik bo'lishi mumkin

modullar va pastki paketlar soni.



245-sahifa

25.3. Paketlarni import qiling

245

Kodni yozishda nimani qo'llash yaxshiroq - modul yoki paket?

Men odatda sodda variant bilan boshlayman va moduldan foydalanaman. Agar

Men o'zimning modullarimda alohida qismlarni tanlashim kerak, men oldindan

Men modullarni paketga tarqataman.

Mashhur SQLAlchemy 1 loyihasidagi katalog tuzilishiga misol (o'rta-

ma'lumotlar bazalari uchun ob-havoga oid xaritalash):

qallimiya /

__init__.py

dvigatel /

__init__.py

tayanch.py

schema.py

PEP 8-ga ko'ra, paketlar kataloglarining nomlari qisqa bo'lishi kerak

kichik harf bilan yozing. Pastki chiziqcha belgilari

ruxsat etilgan



25.3. Paketlarni import qiling

Paketni import qilish uchun paket nomi bilan import buyrug'idan foydalaning

(katalog nomi):

>>> import sxolchemy

Ushbu buyruq sqlchechemy / __ ташабб__.py faylini hozirgi bo'sh joyga import qiladi .

to'plam PYTHONPATH yoki sys.path-da topilgan bo'lsa, nomlar oralig'i .

Siz foydalanmoqchi bo'lsangiz Ustun va ForeignKey darslari moduli

schema.py , quyidagi parchalarning har biri bajaradi. Birinchisi o'z ichiga oladi

sqlalchemy.schema sizning ism maydoningizda, ikkinchisi esa

faqat sxema nomlari maydoni :

>>> import sqlalchemy.schema

>>> col = sqlalchemy.schema.Column ()

>>> fk = sqlalchemy.schema.ForeignKey ()

1

https://www.sqlalchemy.org/





246-bet

246

25-bob. Kutubxonalar: paketlar va modullar

yoki

>>> kvlchemyni import qilish sxemasidan



>>> col = sxemasi.Qo'l ()

>>> fk = sxema.ForeignKey ()

Va agar sizga faqat ustunlar sinfi kerak bo'lsa , ushbu sinfni bitta bilan import qiling

ikki yo'l bilan:

>>> import sqlalchemy.schema.Column

>>> col = sqlalchemy.schema.Column ()

yoki

>>> sqlalchemy.schema import ustunidan



>>> col = Ustun ()

25.4. PYTHONPATH

PYTHONPATH atrof-muhit o'zgaruvchisi nostandart kataloglarning ro'yxatini o'z ichiga oladi.

Python modullar yoki paketlarni qidirayotgan gov. Odatda bu o'zgarish

Naya bo'sh. PYTHONPATHni o'zgartirish odatda kerak emas, agar bo'lmasa

rivojlanish jarayonida siz hanuzgacha bo'lgan kutubxonalardan foydalanishni xohlamaysiz

o'rnatilmagan.



MASLAHAT

Agar sizda biron bir jiddiy sabab bo'lmasa , PYTHONPATH o'zgaruvchini bo'sh qoldiring.

uning o'zgarishi uchun unvon. Ushbu bo'limda qachon sodir bo'lishi mumkinligi ko'rsatilgan

o'zgartirish. Buning oqibatlari boshqa ishlab chiquvchilar uchun chalkash bo'lishi mumkin -

PYTHONPATH o'zgaruvchisi ekanligini unutib qo'ysangiz, kodingizni tuzatmoqchi bo'lganlar

o'zgartirildi.

Agar kodni /home/test/a/plot.py fayliga kiritgan bo'lsangiz , lekin katalogdan ishlagan bo'lsangiz

/ home / test / b / , PYTHONPATH- dan foydalanib, ushbu kodga kirishni ta'minlaydi.

Aks holda, agar plot.py fayli tizim tomonidan o'rnatilmagan bo'lsa

Python vositalari yoki asboblari, uni ishlatib import qilishga harakat qilmoqdalar

ImportError xatosiga olib keladi :

>>> import uchastkasi

Traceback (eng so'nggi qo'ng'iroq oxirgi):



247-sahifa

25.5. sysatpath

247

Fayl "", 1-qator, da

ImportError: Plot deb nomlangan modul mavjud emas

Agar siz Python-ni o'zgaruvchan qiymat bilan ishlatsangiz

PYTHONPATH , Python-ga kutubxonalarni qaerdan qidirish kerakligini aytadi:

$ PYTHONPATH = / uy / sinov / python3

Python 3.6.0 (standart, 2016 yil 24-dekabr, 08:01:42)

>>> import uchastkasi

>>> fit.histogramma ()

...


MASLAHAT

Python paketlarini o'rnatish uchun paket menejerlaridan foydalanishingiz mumkin,

Windows bajariladigan yoki Python-ning ixtisoslashtirilgan vositalari,

masalan, 1- quvur .



25.5. sysatpath

Sys moduli kataloglarning ro'yxati bo'lgan yo'l atributiga ega

Python kutubxonalarni qidirmoqda. Ko'rib chiqib sys.path , siz barcha prosmo- ko'rasiz

poezd ma'lumotnomalari:

>>> import sys

>>> tizim

['',

'/usr/lib/python35.zip',



'/usr/lib/python3.6',

'/usr/lib/python3.6/plat-darwin',

'/usr/lib/python3.6/lib-dynload',

'/usr/local/lib/python3.6/site-packages']



MASLAHAT

Agar ko'rish xatosiga duch kelsangiz

ImportError: Hujjat deb nomlangan modul mavjud emas,

sys.path o'zgaruvchisiga qarang va unda mavjudligini tekshiring

Foo.py fayl joylashgan katalog (agar u modul bo'lsa). Agar fitna bo'lsa

1

https://pip.pypa.io/





248-bet

248

25-bob. Kutubxonalar: paketlar va modullar

paket, keyin fitna / katalog kataloglardan birida bo'lishi kerak

dan sys.path :

>>> import uchastkasi

Traceback (eng so'nggi qo'ng'iroq oxirgi):

Fayl "", 1-qator, da

ImportError: Plot deb nomlangan modul mavjud emas

>>> sys.path.append ('/ home / test / a')

>>> import uchastkasi

>>> fit.histogramma ()

Bundan tashqari , buyruq satridan PYTHONPATH-ga ushbu katalogni qo'shishingiz mumkin

Python-ni ishlatish uchun ishlatilgan.

Biz yana bir bor ta'kidlaymizki, odatda sysypath yoki PYTHONPATH ni o'rnatish qo'lda

kerak emas. Oddiy holatda siz kutubxonalarni o'rnatasiz va

O'rnatish grammage ularni to'g'ri katalogga joylashtiradi.



MASLAHAT

Agar fayl tizimida kutubxonaning joylashuvini bilmoqchi bo'lsangiz,

__file__ atributini tekshiring :

>>> import json

>>> json .__ file__

'/usr/lib/python3.6/json/__init__.py'

Ushbu usul faqat Python-da amalga oshirilgan kutubxonalar bilan ishlaydi.

Sys moduli Python-da amalga oshirilmagan, shuning uchun bu urinish muvaffaqiyatsiz tugadi.

muvaffaqiyatsizlik:

>>> import sys

>>> sys .__ file__

Traceback (eng so'nggi qo'ng'iroq oxirgi):

...

AttributeError: 'sys' modulida '__file__' atributi yo'q



25.6. Xulosa

Ushbu bob modullar va paketlarni o'z ichiga oladi. Modul vakili

Python fayli. Paket - bu ichidagi katalog



249-bet

25.7. Mashqlar

249

__Init__.py nomli fayl mavjud emas . Paketda boshqa narsalar ham bo'lishi mumkin

modullar va paketlar.

Qaysi kataloglarni aniqlaydigan yo'llar ro'yxati mavjud

Kutubxonalarni import qilish uchun Python. Ushbu ro'yxat saqlanadi

yilda sys.path . Ushbu o'zgaruvchining qiymatini tekshirish bilan siz qaysi toifalarni topasiz

jurnallarni Python skanerdan o'tkazadi. Siz shuningdek ushbu ro'yxatni qachon yangilashingiz mumkin

PYTHONPATH o'zgaruvchisidan foydalanish yoki to'g'ridan-to'g'ri o'zgarishlar qilish. Ammo

odatda siz ushbu o'zgaruvchini o'zgartirish o'rniga ixtisoslashgan foydalanasiz

Paket kabi o'rnatish moslamalari.



25.7. Mashqlar

1. nomlangan funktsiyani o'z ichiga olgan start.py modulini yarating

Bosh . Bosh funktsiyasi bir qator olish va mantiqiy qaytarib kerak

bu son asosiy bo'ladimi (ya'ni, u bo'linganmi)

u faqat 1 uchun va o'zi uchun). Boshqa katalogga o'zgartiring, ishga tushiring

Python-ni ishga tushiring va buyruqni bajaring

import boshidan boshlab

Urinish muvaffaqiyatsiz bo'lishi kerak. Sys o'zgaruvchisini yangilang .

funktsiyani moduldan import qilishingiz mumkin bo'lgan yo'l . Keyin

qiymatni PYTHONPATH ga sozlang .

2. Idishlarni to'plamini yarating . Yilda __init__.py fayl, joylashtirish Bosh kodni dan

oldingi misol. Terminaldagi boshqa katalogga o'zgartirish,

python-ni ishga tushiring va buyruqni bajaring

idish-tovoq importidan asosiy mahsulot

Urinish muvaffaqiyatsiz bo'lishi kerak. Yangilanish o'zgaruvchisi

sys.path, shuning uchun funktsiyani paketdan import qilishingiz mumkin. Keyin

qiymatni PYTHONPATH ga sozlang .



250-bet

26 To'liq misol

Ushbu bobda siz skriptda kodni qanday tashkil qilishni bilib olasiz. Unda

UNIX mushuk buyrug'ini soddalashtirilgan bajarish uchun manba kodi berilgan .

Mushuk buyruq buyruq satriga va displeylar ularni dan fayl nomlari o'qiydi

ekranda tarkib. Buning uchun turli xil variantlar mavjud

Raqam qo'shish kabi operatsiyalarni yakunlang. Ushbu skript

odatda Python faylida kod qanday tashkil qilinganligini ko'rsatadi.

26.1. mush.py

Quyida Python-da UNIX mushuk buyrug'ining bajarilishi . Yoqilgan

satr raqamlarini qo'shish uchun chen varianti (- raqam ), ammo boshqalar

mushuk parametrlari qo'llab-quvvatlanmaydi. Kodni cat.py deb nomlangan faylda saqlang :

#! / usr / bin / env python3

r "" "Uniks" mushuk "buyrug'ini oddiygina bajarish.

Faqat '`- raqam' 'parametri qo'llab-quvvatlanadi.

Misol fayl tuzilishini namoyish etadi

va foydali Python dasturlash usullari.

Butun modul uchun uch tirnoqli hujjat qatori

(ushbu fayl). Agar siz ushbu modulni import qilsangiz

va "yordam (mushuk)" 'buyrug'ini bajaring, mumkin

bunga ishonch hosil qiling.

Hujjatlar qatorida "` hujjatlashtirish sinovi '',





251-sahifa

26.1. mush.py

251

kodni dasturiy ishlatishda namuna bo'lib xizmat qiladi.

Ushbu hujjat qatorini doctest moduli bajarishi mumkin.

va chiqishiga ko'ra uning to'g'riligini tekshiring.

>>> import io

>>> fin = io.StringIO (\

... "salom \ n dunyo miqyosida \ n ')

>>> fout = io.StringIO ()

>>> mushuk = Katter ([fin],

... show_number = To'g'ri)

>>> cat.run

>>> chop etish (fout.getvalue ())

1 salom

2 dunyo


"" "

import arparse

import jurnali

import sys

__version__ = '0.0.1'

logging.basicConfig (

daraja = loging.DEBUG)

sinf Catter (ob'ekt):

"" "

Fayllarni bog'lash uchun sinf



standart chiqishda

Sinf hujjatlari liniyasi,

"help (cat.Catter)" `buyrug'i bilan chiqariladi

"" "


def __init __ (o'zi, fayllar,

show_number = Noto'g'ri):

self.files = fayllar

self.show_number = show_number

def run (o'zini, fout):

# Raqamlar uchun 6 ta bo'sh joydan foydalaning

# o'ng hizalanadi

fmt = '{0:> 6} {1}'





252-sahifa

252

26-bob. To'liq misol

self.fayllarda fin uchun:

logging.debug ('{0} tortish'. format (fin))

sanash uchun, raqamlar qatori (fin, 1):

agar self.show_number:

fout.write (fmt.format (

hisoblash, chiziq))

yana:

fout.write (chiziq)



def main (args):

"" "


Argumentlar bilan mushuk mantig'i

"" "


tahlil qiluvchi = argparse.ArgumentParser (

description = 'FILE (lar) ni bog'lash yoki'

'standart chiqish, standart chiqish')

parser.add_argument ('- versiya',

action = 'version', version = __ version__)

parser.add_argument ('- n', '- raqam',

action = 'store_true',

help = 'barcha chiqish qatorlarini raqamlash')

parser.add_argument ('fayllar', nargs = '*',

type = argparse.FileType ('r'),

standart = [sys.stdin], metavar = 'FILE')

parser.add_argument ('- ishga tushirish sinovlari',

action = 'store_true',

help = 'Modul sinovlarini o'tkazish')

args = parser.parse_args (args)

agar args.run_tests:

import doktest

doctest.testmod ()

yana:

cat = Catter (args.files, args.number)



cat.run (sys.stdout)

logging.debug ('tortish tugadi')

agar __name__ == '__main__':

asosiy (sys.argv [1:])

Agar siz ushbu kodning barchasini qo'lda kiritishni xohlamasangiz, nusxasini yuklab oling

Internetdan 1 .

1

https://github.com/mattharrison/IllustratedPy3/





253-sahifa

26.2. Ushbu kod nima qiladi?

253

26.2. Ushbu kod nima qiladi?

Ushbu kod fayl tarkibiga aks etadi (ehtimol bilan

Windows va  UNIX tizimlaridagi terminalga yo'nalishlarning o'lchami bo'yicha :

$ python3 cat.py -n README.md

1 # IllustratedPy3

2

3 Agar sizda savol yoki xavotirlar bo'lsa, yuqoridagi muammolarni bosing.



Agar siz ushbu kodni -h tugmachasi bilan ishlatsangiz , unda barcha yordam ko'rsatiladi

buyruq satrining argumentlari bo'yicha hujjatlar:

$ python3 cat.py -h

foydalanish: cat.py [-h] [- o'zgartirish] [-n] [- -run-testlar] [FILE [FILE ...]]

FILE (lar) ni yoki standart kirishni standart chiqish uchun ulang

pozitsiyaviy dalillar:

FILE

ixtiyoriy dalillar:



-h, - bu yordam xabari va chiqish oynasini ko'rsating

- versiya versiyasi va chiqish versiyasi

-n, - barcha chiqish qatorlarining raqami

-run-testlar modul sinovlaridan o'tkaziladi

Buyruq satrini sintaktik tahlil qilish funktsiyada amalga oshiriladi

asosiy va standart kutubxonadan argparse moduli tomonidan ta'minlanadi .

Argparse moduli barcha argumentlarni tahlil qiladi .

Agar bilish bo'lsangiz argparse moduli qilsa, borib uchun

Internetda sharhlar yoki yordam funktsiyasidan foydalaning . Asosiy

Gap shundaki, siz ArgumentParser sinfining namunasini yaratasiz

va har bir buyruq satri parametrlari uchun .add_argumentga qo'ng'iroq qiling . Siz

buyruq satri parametrlarini belgilang, nima harakat emasligini ayting

ular bajarishi kerak (odatiy, bu qiymatni tejash,

parametrga rioya qilgan holda) va ma'lumotnomani taqdim eting.

piyoz. Dalillarni qo'shib so'ng, .parse_args usuli bo'ladi deb nomlangan uchun

buyruq satrining argumentlari ( sys.argv- dan olingan ). Natija

tat .parse_args biriktirilgan ob'ektni anglatadi



254-bet

254

26-bob. To'liq misol

parametrlari nomlari bilan belgilanadigan atributlar. Bunda

agar bu fayllar .fayl va .number xususiyatlari bo'lsa .



ESLATMA

Bundan tashqari, ma'lumot olish uchun REPL dan foydalanishingiz mumkin.

modul haqida va uni etkazib berishga kiritilgan hujjatlarni ko'rish. Eslab qoling

yordam funktsiyasi ? Modulni unga o'tkazing va u hujjatlar qatorini chiqaradi

modul darajasi.

Modulning dastlabki kodini ko'rishni istasangiz, bu ham mumkin.

Ob'ektning xususiyatlarini ko'rsatadigan dir funktsiyasini eslaysizmi ? Qarayapti

argparse moduli haqida ma'lumot , siz uning __file__ atributiga ega ekanligini ko'rasiz .

Bu kompyuterdagi faylning joylashishini ko'rsatadi:

>>> import arparse

>>> argparse .__ file__

'/usr/local/Cellar/python3/3.6.0/Frameworks/

Python.framwork / Versiyalar / 3.6 / lib / python3.6 / argparse.py '

Kod Python-da yozilganligi sababli (ba'zi modullar C-da yozilgan), mumkin

dastlabki faylni ko'rish. Siz allaqachon mumkin

modulni o'qing va nima qilish kerakligini tushuning.

Dalillarni ajralish so'ng, dastur bir misol hosil catter , belgilab

kodni llen-ga kiritadi va buning uchun .run usulini chaqiradi .

Misol biroz qo'rqinchli ko'rinadi, ammo hamma sinchkov

Kitobda taksilar ko'rib chiqilgan. Ushbu bobning qolgan qismi muhokama qilinadi

Ushbu kodning tuzilishi va boshqa jihatlari yaratilgan.

26.3. Oddiy tuzilish

Python modulining asosiy tarkibiy qismlari quyidagi tartibda:

❍ #! / Usr / bin / env python3 (agar modul shuningdek shunday ishlatilsa

skript);


❍ modul hujjatlari liniyasi;

Orts import ;





255-sahifa

26.4. #!

255

Ad metadata va global o'zgaruvchilar;

The jurnal bilan operatsiyalar;

❍ amalga oshirish;

❍ agar __name__ == '__main__': (agar modul shuningdek shunday ishlatilgan bo'lsa)

ssenariy);

❍ tortishish .

ESLATMA

Ushbu ro'yxat tavsiyalardan boshqa narsa emas. Ko'p narsa bo'lishi mumkin

tasodifiy ravishda kuzatib boring va hamma elementlar bo'lmasligi kerak -

har bir faylda. Masalan, har bir fayl bajarilishi shart emas

qobiq skript sifatida.

Siz fayllaringizdagi har qanday tuzilishdan foydalanishingiz mumkin, ammo javobgarlik

chunki bunday qaror sizga bog'liq. Sizning kodingiz foydalanuvchilari

baxtsiz bo'ladi (yoki yamalar chiqaradi). Har qanday o'quvchi

umumiy qabul qilingan qoidalarga muvofiq yaratilgan kodni afzal ko'radi, chunki u qila oladi

tezda uning mantig'ini aniqlang.



26.4. #!

Skript sifatida ishlatiladigan faylning birinchi qatori o'z ichiga oladi

belgilar ketma-ketligi #! / usr / bin / env python3 . Operatsion tizimlarda

UNIX oilaviy iplari, bu satrni aniqlash uchun qayta ishlanadi

skriptni qanday ishlatish kerak. Shunga ko'ra, ushbu chiziq kiritilgan

faqat skriptlar sifatida ishlaydigan fayllar.

Bu foydalanishi kerak python 3 yildan beri buyrug'ini python amri

aksariyat tizimlarda Python 2-versiyasiga tegishli.



Download 363.98 Kb.

Do'stlaringiz bilan baham:
1   ...   13   14   15   16   17   18   19   20   21




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling