Ачааллж байна...
Одоо хүртэл таны бүх программ НЭГ файлд байсан. main.py — эхнээс төгсгөл хүртэл бүх зүйл тэнд.
Тэр нь жижиг программд бүрэн зөв. Гэвч Бүлэг 9.4-ийн номын сангийн системийг санаж байна уу? Тэр нь бараг 400 мөр болсон.
Тэр файлыг нээгээд, NomiinSan.zeeldekh method-ыг хайх гэж үзээрэй. Та гүйлгэж, гүйлгэж, гүйлгэнэ. Дараа нь tailan_khevlekh -ийг хайх гэж үзээрэй. Дахин гүйлгэнэ.
Тэр нь ажиллана, гэхдээ тааламжгүй.
Одоо төсөөлөөд үз: мэргэжлийн төсөл нь хэдэн мянган, хэдэн зуун мянган мөр байдаг. Тэдгээрийг НЭГ файлд хийх нь бүрэн боломжгүй.
Шийдэл: кодыг ОЛОН ФАЙЛД хуваах.
Энэ бүлэгт та түүнийг сурна. Эхлээд хамгийн энгийн зүйлээс: өөрийн файлыг import хийх.
Мөн энэ бүлэгт нэг чухал сануулга: эдгээр файлууд нь СТУДЕНТИЙН компьютер дээрх файлууд юм. Тэдгээр нь та ашиглаж байгаа платформын кодтой ямар ч холбоогүй. Бид зөвхөн Python-ы төслийн бүтцийг ярьж байна.
Гал тогооны зүйрлэлийг ашиглая.
Нэг файлтай программ нь бүх зүйлийг НЭГ том ширээн дээр байлгаж байгаа хэрэг. Хутга, тавга, амтлагч, түүхий мах, бэлэн хоол — бүгд хамт.
Эхэндээ асуудалгүй. Гэвч ажил олшрох тусам ширээ дүүрнэ. Та хутга хайхын тулд бүх зүйлийг ухах хэрэгтэй болно.
Олон файлтай программ нь зүйлсийг ШҮҮГЭЭНД ангилж хийж байгаа хэрэг:
Нэг шүүгээнд — хутганууд
Нөгөө шүүгээнд — амтлагч
Гурав дахь шүүгээнд — тавгууд
Одоо та хутга хэрэгтэй бол — хутганы шүүгээг л нээнэ. Бусад нь хөндөгдөхгүй.
Файл бүр нь НЭГ ЗОРИЛГОТОЙ байх ёстой. Тэр бол хуваах гол зарчим.
Модуль гэдэг нь маш энгийн зүйл:
Модуль бол зүгээр л
.pyФАЙЛ юм.
Тэр л болоо. Ямар ч тусгай бичлэг байхгүй, ямар ч зарлал хэрэггүй.
Хэрэв та khereгsel.py нэртэй файл үүсгэвэл — та khereгsel нэртэй модуль үүсгэсэн.
Курс 1-ээс import random, import datetime гэж бичиж байсныг санаж байна уу? Тэдгээр нь ч бас модуль — зөвхөн Python-той хамт ирдэг модуль.
Одоо та ӨӨРИЙНХӨӨ модулийг үүсгэнэ.
Шинэ хавтас үүсгэнэ үү, жишээ нь modul-dasgal. Venv үүсгэж, идэвхжүүлээрэй (Бүлэг 1-ийн зуршил).
Файл 1: khereгsel.py
python
# khereгsel.py
# Туслах функцүүд
def mendchilekh(ner: str) -> str:
return f"Сайн байна уу, {ner}!"
def niilber(a: int, b: int) -> int:
return a + b
PI: float = 3.14159Файл 2: main.py
python
# main.py
import khereгsel
print(khereгsel.mendchilekh("Болд"))
print(khereгsel.niilber(5, 3))
print(khereгsel.PI)Ажиллуулна уу:
powershell
python main.pyСайн байна уу, Болд!
8
3.14159АЖИЛЛАЛАА.
import khereгsel гэсэн мөр нь khereгsel.py файлыг олж, ачаалж, түүний БҮХ агуулгыг ашиглах боломжтой болголоо.
Анзаараарай: .py өргөтгөлийг БИЧЭЭГҮЙ. import khereгsel, import khereгsel.py ГЭЖ БИЧЭЭГҮЙ.
Модулийн доторх зүйлд хандахдаа ЦЭГ ашиглана:
python
khereгsel.mendchilekh("Болд")
khereгsel.PIТанил бичлэг үү?
Байх ЁСТОЙ. Та түүнийг Курс 1-ээс мэднэ:
python
import random
random.randint(1, 10)
import json
json.dumps(uguudul)Яг ижил бүтэц: модуль.зүйл.
Тэгэхээр random ба таны khereгsel хоёрын хооронд ямар ч ялгаа байхгүй. Хоёулаа зүгээр л Python файл.
from ... importЗаримдаа khereгsel. гэж бичих нь ядаргаатай болдог. Ялангуяа тэр функцийг олон удаа ашиглаж байвал.
Хоёр дахь бичлэг: from ... import
python
# main.py
from khereгsel import mendchilekh, niilber, PI
print(mendchilekh("Болд"))
print(niilber(5, 3))
print(PI)Сайн байна уу, Болд!
8
3.14159Одоо цэг хэрэггүй. Функцууд нь ШУУД байна.
Танил үү?
python
from dataclasses import dataclass, field, asdict
from datetime import date, timedeltaТа түүнийг курсийн турш ашиглаж байсан.
import модуль — модулийн нэрийг хадгална.
python
import khereгsel
khereгsel.mendchilekh("Болд")Давуу тал: тодорхой. Уншигч нь mendchilekh нь ХААНААС ирснийг шууд мэднэ.
Сул тал: урт бичлэг.
from модуль import зүйл — зүйлийг ШУУД импортлоно.
python
from khereгsel import mendchilekh
mendchilekh("Болд")Давуу тал: богино.
Сул тал: уншигч нь mendchilekh хаанаас ирснийг мэдэхгүй. Хэрэв файлын дээд хэсэгт хорин import байвал — хайх хэрэгтэй.
Практик зөвлөгөө:
Цөөн зүйл ашиглаж байвал → from модуль import зүйл
Олон зүйл ашиглаж байвал → import модуль
Нэр нь ойлгомжгүй бол → import модуль (контекст өгнө)
Жишээ:
python
from dataclasses import dataclass # цөөн, тодорхой
import json # олон зүйл (dump, load, dumps, loads)
import requests # олон зүйлas — нэр солихЗаримдаа модулийн нэр нь урт эсвэл мөргөлдөнө:
python
import khereгsel as kh
print(kh.mendchilekh("Болд"))as нь өөр нэр өгнө.
Практикт та үүнийг ихэвчлэн стандарт сануудад харна:
python
import numpy as np
import pandas as pdЭдгээр нь дэлхийн заншил. Гэхдээ өөрийн модульд as хэрэглэх нь ховор. Тодорхой нэр өгсөн нь дээр.
from модуль import *Дараах бичлэгийг та бусдын кодод харах магадлалтай:
python
from khereгsel import * # БҮГДИЙГ импортлоно
print(mendchilekh("Болд"))
print(PI)Ажиллана. Гэхдээ ХЭЗЭЭ Ч ингэж БҮҮ бич.
Яагаад муу вэ?
Шалтгаан 1: нэр мөргөлддөг.
python
from modul_a import *
from modul_b import *
khiikh() # аль модулиас ирсэн бэ??Хэрэв хоёулаа khiikh гэсэн функцтэй бол — сүүлчийнх нь өмнөхийг ЧИМЭЭГҮЙ дарна.
Шалтгаан 2: уншигч мэдэхгүй.
mendchilekh хаанаас ирсэн бэ? Хэрэв * ашигласан бол — файл бүрийг нээж хайх хэрэгтэй.
Шалтгаан 3: built-in нэрийг дарж болно.
Бүлэг 3.4-ээс санаж байгаа байх: list, str, sum -ыг дарж бичих нь аюултай. * нь тэр эрсдэлийг үүсгэдэг.
Дүрэм: from модуль import * — ХЭЗЭЭ Ч БҮҮ АШИГЛА.
Одоо БОДИТ жишээ. Бүлэг 11.5-ын цаг агаарын кодыг ХОЁР файл болгож хуваая.
Файл 1: api.py — интернэттэй ярих
python
# api.py
# Цаг агаарын API-тай харилцах
import requests
FORECAST_URL = "https://api.open-meteo.com/v1/forecast"
GEOCODE_URL = "https://geocoding-api.open-meteo.com/v1/search"
TIMEOUT = 10
def khot_khaikh(ner: str) -> dict | None:
parametruud = {"name": ner, "count": 1, "language": "en"}
try:
hariult = requests.get(GEOCODE_URL, params=parametruud, timeout=TIMEOUT)
hariult.raise_for_status()
uguudul = hariult.json()
except requests.exceptions.RequestException as alda:
print(f"Сүлжээний алдаа: {alda}")
return None
ur_dun = uguudul.get("results")
if not ur_dun:
return None
return ur_dun[0]
def tsag_agaar_avakh(lat: float, lon: float) -> dict | None:
parametruud = {
"latitude": lat,
"longitude": lon,
"current": "temperature_2m,wind_speed_10m",
"timezone": "auto",
}
try:
hariult = requests.get(FORECAST_URL, params=parametruud, timeout=TIMEOUT)
hariult.raise_for_status()
return hariult.json()
except requests.exceptions.RequestException as alda:
print(f"Сүлжээний алдаа: {alda}")
return NoneФайл 2: main.py — хэрэглэгчтэй ярих
python
# main.py
# Цаг агаарын программ
from api import khot_khaikh, tsag_agaar_avakh
def kheveleкh(khot: dict, tsag_agaar: dict) -> None:
odoo = tsag_agaar["current"]
print()
print("=" * 44)
print(f"{khot['name'].upper()}, {khot.get('country', '')}")
print("=" * 44)
print(f"Координат: {khot['latitude']}, {khot['longitude']}")
print(f"Цаг: {odoo['time']}")
print(f"Температур: {odoo['temperature_2m']}°C")
print(f"Салхи: {odoo['wind_speed_10m']} км/ц")
print("=" * 44)
def gol() -> None:
ner = input("Хотын нэр (англиар): ").strip()
if not ner:
print("Нэр хоосон байна.")
return
khot = khot_khaikh(ner)
if khot is None:
print(f"'{ner}' гэсэн хот олдсонгүй.")
return
tsag_agaar = tsag_agaar_avakh(khot["latitude"], khot["longitude"])
if tsag_agaar is None:
print("Цаг агаарын мэдээлэл авч чадсангүй.")
return
kheveleкh(khot, tsag_agaar)
gol()Ажиллуулна уу:
powershell
python main.pyХотын нэр (англиар): Ulaanbaatar
============================================
ULAANBAATAR, Mongolia
============================================
Координат: 47.90771, 106.88324
Цаг: 2026-07-13T22:00
Температур: 18.7°C
Салхи: 8.3 км/ц
============================================Хоёр файл, тод үүрэгтэй:
api.py — интернэттэй ярина. Хэрэглэгчийн талаар ЮУ Ч мэдэхгүй. input(), print() (алдааны мессежээс бусад) байхгүй.
main.py — хэрэглэгчтэй ярина. requests -ийн талаар ЮУ Ч мэдэхгүй.
Энэ бол СALГAЛТ (separation of concerns).
Бүлэг 6.5 ба 9.4-т бид "гурван давхарга" -ын тухай ярьсан: ЛОГИК → ХАРУУЛАХ → ИНТЕРФЕЙС. Тэр үед тэдгээр нь НЭГ файл дотор функцүүдийн бүлэг байсан.
Одоо тэдгээр нь ТУСДАА ФАЙЛ болов. Тэр л жинхэнэ салгалт юм.
1. Хайхад амархан. API-тай холбоотой асуудал байвал — api.py -г нээ. Харуулах асуудал бол — main.py.
2. Дахин ашиглаж болно. api.py -г ӨӨР программд ашиглаж болно. Жишээ нь вэб сайт бичвэл — ижил api.py -г import хийнэ.
3. Туршихад амархан. api.py -г тусад нь турших боломжтой, хэрэглэгчийн интерфейс шаардлагагүй.
4. Хамтран ажиллахад амархан. Хоёр хүн ажиллаж байвал — нэг нь api.py, нөгөө нь main.py дээр. Тэд бие биедээ саад болохгүй.
Одоо нэг маш чухал, эхлэгчдийг байнга төөрөгдүүлдэг зүйл рүү орно.
import хийхэд Python нь тэр файлыг ЭХНЭЭС ТӨГСГӨЛ ХҮРТЭЛ АЖИЛЛУУЛНА.
Туршиж үзье. khereгsel.py -г өөрчилье:
python
# khereгsel.py
print("khereгsel.py АЧААЛАГДЛАА!")
def mendchilekh(ner: str) -> str:
return f"Сайн байна уу, {ner}!"
print("khereгsel.py дууслаа")main.py:
python
# main.py
print("main.py эхлэв")
import khereгsel
print("import дууслаа")
print(khereгsel.mendchilekh("Болд"))main.py эхлэв
khereгsel.py АЧААЛАГДЛАА!
khereгsel.py дууслаа
import дууслаа
Сайн байна уу, Болд!Анзаараарай: khereгsel.py -гийн print -үүд АЖИЛЛАСАН.
Гэвч бид зөвхөн import хийсэн, ямар ч функц дуудаагүй!
Учир нь: import нь файлыг ачаалж, түүний БҮХ мөрийг гүйцэтгэдэг.
def мөрүүд → функцийг ТОДОРХОЙЛНО (ажиллуулахгүй)
print мөрүүд → ШУУД АЖИЛЛАНА
Хувьсагч олгох мөрүүд → ШУУД АЖИЛЛАНА
Тэгэхээр модуль дотор "чөлөөт" код (функц дотор биш код) байвал — тэр нь import хийх үед АЖИЛЛАНА.
Энэ нь ноцтой асуудал үүсгэж болно.
main.py -г ХОЁР файл болгож хуваая. Гэхдээ зөв бус аргаар:
python
# tsag_agaar.py
from api import khot_khaikh, tsag_agaar_avakh
def kheveleкh(khot: dict, tsag_agaar: dict) -> None:
...
ner = input("Хотын нэр: ") # ЧӨЛӨӨТ КОД!
khot = khot_khaikh(ner)
...Одоо ӨӨР файлаас kheveleкh функцийг ашиглахыг хүсэв:
python
# tailan.py
from tsag_agaar import kheveleкh # зөвхөн НЭГ функц хэрэгтэй
print("Тайлан эхлэв")Ажиллуулбал:
powershell
python tailan.pyХотын нэр:ГЭНЭТИЙН ЗҮЙЛ! tailan.py нь хэрэглэгчээс хот асууж байна!
Учир нь: from tsag_agaar import kheveleкh гэсэн мөр нь tsag_agaar.py -г БҮХЭЛД НЬ ажиллуулсан. Тэр файл дотор input() байсан тул — тэр ажилласан.
Бид зөвхөн НЭГ функц хүссэн, гэвч БҮХ программ ажиллав.
Энэ бол маш түгээмэл, маш төөрөгдүүлдэг асуудал.
Одоохондоо хамгийн энгийн шийдэл: чөлөөт кодыг ФУНКЦ дотор ор.
python
# tsag_agaar.py
from api import khot_khaikh, tsag_agaar_avakh
def kheveleкh(khot: dict, tsag_agaar: dict) -> None:
...
def gol() -> None: # ФУНКЦ ДОТОР!
ner = input("Хотын нэр: ")
khot = khot_khaikh(ner)
...
gol() # ЭНЭ мөр л чөлөөтОдоо from tsag_agaar import kheveleкh гэж импортлоход — def -үүд тодорхойлогдоно, гэхдээ gol() мөр нь ДАХИН АЖИЛЛАНА.
Асуудал бүрэн шийдэгдээгүй.
Жинхэнэ шийдэл нь if __name__ == "__main__": бөгөөд түүнийг Хичээл 12.3-т үзнэ. Тэр мөр нь: "хэрэв энэ файлыг ШУУД ажиллуулж байвал — энэ кодыг ажиллуул. Хэрэв import хийж байвал — БҮҮ ажиллуул."
Одоохондоо мэдэж байгаад өнгөрөөрэй. Хоёр хичээлийн дараа бид түүнийг бүрэн шийднэ.
Python нь import khereгsel гэж бичихэд файлыг ХААНААС хайдаг вэ?
1. Одоогийн хавтас — хамгийн эхлээд. Тиймээс таны khereгsel.py олдож байна.
2. Суулгасан сангууд — venv\Lib\site-packages (Бүлэг 1.3-ээс танил).
3. Python-ы стандарт сан — json, random, datetime.
Практик үр дагавар: файлууд НЭГ ХАВТАСТ байх ёстой (эсвэл package дотор — Хичээл 12.2).
Хэрэв main.py нь C:\project\ -д, api.py нь C:\өөр-газар\ -д байвал — import api нь ажиллахгүй:
ModuleNotFoundError: No module named 'api'Танил алдаа! Бүлэг 1.3-аас. Гэхдээ энд шалтгаан нь өөр — venv биш, файлын байрлал.
Одоо нэг ноцтой урхи.
Хэрэв та өөрийн файлыг Python-ы стандарт модультай ИЖИЛ нэрээр нэрлэвэл — тэр нь стандарт модулийг ДАРНА.
python
# json.py ← АЮУЛТАЙ НЭР!
def miny_funktsi():
print("Миний функц")python
# main.py
import json
print(json.dumps({"a": 1}))AttributeError: module 'json' has no attribute 'dumps'Python нь ТАНЫ json.py -г ачаалсан, стандарт json модулийг БИШ!
Учир нь одоогийн хавтас нь ХАМГИЙН ЭХЭНД шалгагддаг.
Аюултай нэрс (БҮҮ ашигла):
json, random, csv, datetime, time, math, os, sys, email, test, requests, string, types
Аюулгүй нэрс:
api.py, khereгsel.py, tokhirgoo.py, tsag_agaar.py, nomiin_san.py
Дүрэм: файлын нэрээ сонгохдоо ТОДОРХОЙ, ӨВӨРМӨЦ бай. Хэрэв эргэлзвэл — урт нэр өг.
Хэрэв сонирхвол: khereгsel.py дотор print("АЧААЛАГДЛАА") гэсэн мөр нэмээд, main.py -ээс import хийж, тэр мессеж хэвлэгдэхийг өөрийн нүдээр хараарай. Тэр туршилт нь "import нь файлыг АЖИЛЛУУЛДАГ" гэдгийг бүрэн ойлгуулна.
Мөн хүсвэл: json.py нэртэй файл үүсгээд, import json хийж, AttributeError -ыг хараарай. Дараа нь файлыг УСТГААД, ажиллахыг нь хараарай.
Тэр алдааг нэг удаа өөрөө үүсгэсэн бол — та түүнийг хэзээ ч мартахгүй.
1. .py өргөтгөлийг бичих
python
import khereгsel.pyModuleNotFoundError: No module named 'khereгsel.py'; 'khereгsel' is not a packageӨргөтгөлгүй: import khereгsel.
2. Файл өөр хавтаст байх
ModuleNotFoundError: No module named 'api'Файлууд НЭГ хавтаст байх ёстой (эсвэл package дотор — Хичээл 12.2).
3. Стандарт модулийн нэрийг ашиглах
python
# json.pyAttributeError: module 'json' has no attribute 'dumps'ХЭЗЭЭ Ч json.py, random.py, requests.py гэж нэрлэж болохгүй.
4. from модуль import * ашиглах
Нэр мөргөлдөнө, уншигч төөрнө. ХЭЗЭЭ Ч БҮҮ АШИГЛА.
5. Модуль дотор чөлөөт код байлгах
python
# tsag_agaar.py
ner = input("Хотын нэр: ") # import хийхэд АЖИЛЛАНА!Import хийхэд гэнэтийн зүйл болно. Хичээл 12.3-т бүрэн шийднэ.
6. Дугуй import (circular import)
python
# a.py
import b
# b.py
import aImportError: cannot import name 'x' from partially initialized module 'a' (most likely due to a circular import)cannot import name ... most likely due to a circular import — "дугуй import" — А нь Б -г хүсч байна, Б нь А -г хүсч байна. Хэзээ ч дуусахгүй.
Засвар: бүтцээ дахин бод. Ихэвчлэн тэр нь дизайн буруу байгаагийн шинж. Нийтлэг кодыг ГУРАВ дахь файлд гарга.
Модуль бол зүгээр л .py ФАЙЛ. Ямар ч тусгай зарлал хэрэггүй.
import khereгsel — модулийг ачаална. Хандахдаа цэг: khereгsel.mendchilekh(...). .py өргөтгөлийг БҮҮ бич.
from khereгsel import mendchilekh — зүйлийг ШУУД импортлоно. Цэг хэрэггүй.
import модуль as ner — өөр нэр өгнө. Өөрийн модульд ховор.
from модуль import * — ХЭЗЭЭ Ч БҮҮ АШИГЛА. Нэр мөргөлдөнө, уншигч төөрнө, built-in дарагдана.
Файл бүр НЭГ ЗОРИЛГОТОЙ байх ёстой. api.py нь интернэттэй ярина, main.py нь хэрэглэгчтэй.
Салгалтын ашиг тус: хайхад амархан, дахин ашиглаж болно, туршихад амархан, хамтран ажиллахад амархан.
ЧУХАЛ: import хийхэд Python нь файлыг ЭХНЭЭС ТӨГСГӨЛ ХҮРТЭЛ АЖИЛЛУУЛНА.
def → тодорхойлно (ажиллуулахгүй)
Чөлөөт код (print, input) → ШУУД АЖИЛЛАНА
Тиймээс модуль дотор чөлөөт код байвал — import хийхэд гэнэтийн зүйл болно. Хичээл 12.3-ын if __name__ == "__main__": нь түүнийг шийднэ.
Python нь модулийг ХААНААС хайдаг: (1) одоогийн хавтас, (2) suулгасан сангууд, (3) стандарт сан.
АЮУЛТАЙ: стандарт модулийн нэрийг ашиглах. json.py, random.py, requests.py — таны файл нь СТАНДАРТ модулийг ДАРНА.
Дугуй import (a → b → a) → ImportError. Бүтцээ дахин бод.
Дараагийн хичээлд бид PACKAGE -ыг үзнэ. Модуль бол файл, package бол ХАВТАС.
Хэрэв төсөл томроод хорин файл болвол — тэдгээрийг ХАВТАСНУУДАД ангилах хэрэгтэй болно. Тэнд бид __init__.py гэсэн нууцлаг файл юу хийдэг, мэргэжлийн Python төсөл ЯМАР харагддаг, мөн FastAPI төсөл (Бүлэг 15) яаж зохион байгуулагддагийг үзнэ.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.