Մոդուլներ

Python ծրագրավորման լեզուն սովորելիս մենք արդեն կիրառել ենք ներդրված ֆունկցիաներ՝ print(), input(), կամ type(): Իրականում, Python-ն ունի մեծ թվով ֆունկցիաներ, սակայն ոչ բոլորն են ուղղակիորեն հասանելի Python-ի նոր ծրագրից: Փոխարենը, դրանք պահվում են առանձին ֆայլերում, որոնք կոչվում են մոդուլներ: Այս ֆունկցիաներն օգտագործելու համար մենք պետք է ներմուծենք դրանք պարունակող մոդուլը, ինչն արվում է import-ի միջոցով: Եկեք տեսնենք՝ ինչպես․

import math           # Importing the math module

print(math.pi)        # Accessing the constant pi from the math module
print(math.sqrt(16))  # Accessing the square root function from the math module

Այս ծրագիրը տպելու է pi-ի արժեքը (3.141592653589793) և 16-ի քառակուսի արմատը (4.0):

Մենք կարող ենք նաև մոդուլից import անել հատուկ ատրիբուտներ կամ ֆունկցիաներ՝ օգտագործելով from...import հայտարարությունը.

from math import pi, sqrt  # Importing only pi and sqrt from the math module

print(pi)                  # We can use pi directly without prefixing it with the module name
print(sqrt(16))            # Similarly, we can use sqrt directly

Ծրագրի արդյունքը կլինի նույնը, ինչ նախորդ դեպքում:

Երբեմն մոդուլներն ունեն երկար անուններ, և ամեն անգամ, երբ ցանկանում ենք որևէ ֆունկցիա օգտագործել, ամբողջ անունը մուտքագրելը կարող է ժամանակատար լինել: Սրանից խուսափելու համար մենք կարող ենք օգտագործել as հիմնաբառը մոդուլին այլ անուն (alias) տալու համար:

import math as m   # Importing the math module and renaming it as m

print(m.pi)        # Now we can use the short alias
print(m.sqrt(16))  # Using the sqrt function using the alias

Արդյունքը նույնպես կլինի 3.141592653589793 և 4.0, ինչպես նախկինում:

Այսպիսով, Python-ի մոդուլները նման են գործիքների տուփերի, որոնք պարունակում են նախապես մշակված գործառույթներ և փոփոխականներ, որոնք մենք կարող ենք ներմուծել և օգտագործել մեր ծրագրերում: Մոդուլներն օգնում են կազմակերպել կոդը և մեր աշխատանքն ավելի արդյունավետ դարձնել:

Ինչպես են աշխատում մոդուլները

Երբ ներմուծում ենք անում մոդուլ, Python-ը կատարում է կուլիսային որոշ աշխատանքներ, որոնք կարող են անմիջապես չերևալ: Հակիրճ նկարագրենք, թե ինչ է տեղի ունենում, երբ օգտագործում ենք import հայտարարությունը.

  1. Մոդուլի տեղորոշում
    Python-ը նախ փնտրում է մոդուլը՝ ստուգելով իր sys.path ցանկում նշված վայրերը: Այս ցանկը ներառում է ընթացիկ գրացուցակը (directory), ներկառուցված Python փաթեթների գրացուցակը և ցանկացած ուղի, որը նշված է PYTHONPATH միջավայրի փոփոխականում: Եթե Python-ը գտնում է մոդուլը, այն անցնում է հաջորդ քայլերին: Եթե ոչ, այն raise է անում ModuleNotFoundError:

  2. Մոդուլի սկզբնավորում
    Հենց նշում ենք մոդուլի ֆայլը, Python-ը ստեղծում է նոր մոդուլի օբյեկտ (types.ModuleType): Այնուհետև ծրագիրը մոդուլի բովանդակությունը տեղափոխում է նոր մոդուլի օբյեկտի մեջ՝ գործարկելով մոդուլի ֆայլի վերին մակարդակում գտնվող բոլոր կոդերը: Խոսքը վերաբերում է ֆունկցիաների, class-ների, փոփոխականների սահմանումներին և կոդի սկզբնավորման կատարմանը:

  3. Մոդուլի քեշավորում
    Սկզբնավորումից հետո մոդուլը պահվում է sys.modules-ում (բառարան): Այս քայլը երաշխավորում է, որ երբ նույն մոդուլը նորից ներմուծենք սցենարում (կամ այլ սցենարների միջոցով), Python-ը կարիք չունենա կրկին տեղորոշել և սկզբնավորել մոդուլը։ Փոխարենը, այն կարող է օգտագործել քեշավորված տարբերակը: Այս բառարանի բանալին մոդուլի անվանումն է, իսկ արժեքը՝ մոդուլի օբյեկտը:

  4. Ավելացնել մոդուլը սցենարի namespace-ին
    Վերջապես, Python-ն ավելացնում է մոդուլի անունը սկրիպտի namespace-ին կամ մոդուլին, որը import է արել այն։ Անունը վերաբերում է մոդուլի օբյեկտին, այնպես որ կարող եք հասանելիություն ստանալ մոդուլի ֆունկցիաներին և փոփոխականներին՝ օգտագործելով կետային նշումը:

Եկեք սա ցույց տանք կոդի օրինակով.

import sys
import math

print(sys.path)       # The path where Python searches for modules
print(sys.modules)    # The cached modules
print(math.sqrt(16))  # Accessing a function from the math module

sys.path-ը տպում է պանակների ցանկ, որի մեջ Python-ը փնտրում է մոդուլները։ sys.modules-ը տպում է բառարան՝ մոդուլների անուններով (բանալիներով) և անուններին համապատասխան մոդուլների օբյեկտներով (արժեքներով)։

Առաջադրանք․ պատահական թվեր

Կրիպտոգրաֆիայի աշխարհում պատահական թվերը չափազանց կարևոր դեր են խաղում: Կրիպտոգրաֆիկ ալգորիթմները հաճախ հիմնվում են պատահական թվերի հաջորդականության ստեղծման վրա՝ տվյալների անվտանգությունն ապահովելու համար:

Այս առաջադրանքում ձեզ հանձնարարված է մոդելավորել պատահական թվերի պարզ գեներատոր, որը մեզ կօգնի ավելի հստակ հասկանալ, թե ինչ է պատահականությունը: Python-ն ունի ներկառուցված random մոդուլ, որն ունի տարբեր ֆունկցիաներ՝ պատահական թվեր ստեղծելու համար: Ձեզանից պահանջվում է օգտագործել այս մոդուլը տրված երկու՝ a և b միջակայքում՝ n պատահական ամբողջ թվերի ցուցակ ստեղծելու համար: Սակայն պատահականությունը չպետք է իսկապես պատահական լինի. փորձի կրկնելիությունն ապահովելու համար մենք պետք է seed-ը ֆիքսենք 42-ի: Դուք կարող եք օգտագործել seed() ֆունկցիան՝ seed-ը շտկելու համար, իսկ randint()-ը՝ պատահական թիվ ստեղծելու համար:

Մուտքի առաջին տողը պարունակում է բացատներով բաժանված երեք ամբողջ թիվ՝ n, a և b: a և b թվերը որոշում են այն միջակայքը (ներառյալ), որից պետք է ընտրվեն պատահական թվերը, իսկ n-ը որոշում է, թե քանի այդպիսի թիվ պետք է գեներացվի:

Ծրագիրը պետք է տպի [a, b] միջակայքում ստեղծված, n բացատով բաժանված պատահական թվեր, որոնց պատահական seed-ը ֆիքսված է՝ 42:

Input

Output

10 1 100

82 15 4 95 36 32 29 18 95 14

5 1 5

1 1 3 2 2

3 10 20

20 11 10

Նշում. քանի որ մենք պատահական seed-ի համար կոնկրետ թիվ ենք սահմանում՝ 42, ելքում հաջորդականությունը պետք է նույնը մնա՝ անկախ նրանից, թե քանի անգամ ենք գործարկում ծրագիրը։ Սա մի առանձնահատկություն է, որը մենք օգտագործում ենք փորձարկման, վրիպազերծման (debugging) և այլ դեպքերում, երբ անհրաժեշտ է ստանալ կանխատեսելի արդյունք:

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue