IlmHamroh
Python kursi/Muhit va vositalar8/9-dars16 daqiqa
Mundarija (23)

2.8-dars: Birinchi .py fayl va uni ishga tushirish

2-QISM — MUHIT VA VOSITALAR · 8-dars


1. Kirish va motivatsiya

Yetti dars nazariya va tayyorgarlikdan keyin — nihoyat.

Bu darsda birinchi haqiqiy dasturingizni yozasiz. "Haqiqiy" deganda: bir qatorlik print emas, balki foydalanuvchi bilan gaplashadigan, ma'lumot qabul qiladigan, hisoblaydigan va natija beradigan dastur.

Lekin dars faqat kod yozishdan iborat emas. Biz dastur qanday tuzilishi kerakligini ham o'rganamiz:

  • fayl nomi qanday bo'lsin va nega
  • kod ichida qanday tartib bo'lsin
  • if __name__ == "__main__" nima va nega hamma joyda uchraydi
  • __pycache__ papkasi qayerdan paydo bo'ldi
  • dasturga terminal orqali ma'lumot berish
  • dastur qanday "muvaffaqiyat" yoki "xato" bilan tugaydi

Bu tafsilotlar boshida ortiqcha tuyulishi mumkin. Lekin ular — professional kod bilan havaskor kod orasidagi farq. Va ularni hozir o'rganish keyin qayta o'rganishdan oson.


2. Nazariya — chuqur tushuntirish

2.1. Fayl nomi qoidalari

Python fayli nomi shunchaki nom emas — u modul nomi ham bo'ladi. import salom yozganingizda Python salom.py faylini qidiradi.

Shuning uchun qoidalar qat'iy:

Qoida To'g'ri Noto'g'ri
Faqat kichik harf main.py Main.py
So'zlar orasida _ hisob_kitob.py hisob-kitob.py
Bo'sh joy yo'q test_kod.py test kod.py
Raqam bilan boshlanmasin dars_01.py 01_dars.py
Standart nomlarni band qilmang mening_json.py json.py

Oxirgisi — jiddiy tuzoq. Agar faylingiz nomi random.py bo'lsa:

python
import random
print(random.randint(1, 10))
text
AttributeError: module 'random' has no attribute 'randint'

Python sizning random.py faylingizni topdi — standart kutubxonanikini emas. Chunki joriy papka qidiruv yo'lida birinchi turadi.

Band qilmaslik kerak bo'lgan nomlar: random, json, time, math, string, email, test, types, code, os, sys.

- (chiziqcha) nega taqiqlangan? Chunki Pythonda - ayirish operatori. import hisob-kitob "hisob minus kitob" deb o'qiladi va sintaksis xatosi beradi.

2.2. Dastur tuzilmasi — qaysi tartibda

Professional Python fayli quyidagi tartibda yoziladi:

python
"""Modul haqida qisqacha — nima qiladi.

Bu — docstring. Uch tirnoq ichida yoziladi va faylning
birinchi narsasi bo'ladi.
"""

# 1. Standart kutubxona importlari
import sys
from datetime import datetime

# 2. Tashqi kutubxona importlari (bo'sh qator bilan ajratiladi)
import requests

# 3. O'z modullaringiz
from mening_kodim import yordamchi

# 4. Doimiylar (KATTA HARF bilan)
SOLIQ_FOIZI = 0.12
MAKSIMAL_URINISH = 3

# 5. Funksiyalar va sinflar
def hisobla(summa):
    return summa * SOLIQ_FOIZI

# 6. Asosiy kod
def main():
    print(hisobla(1_000_000))

if __name__ == "__main__":
    main()

Bu tartib — PEP 8 tavsiyasi (3.14-darsda batafsil). Nega muhim?

  • Importlar yuqorida — faylni ochgan kishi nimaga bog'liqligini darhol ko'radi
  • Doimiylar bir joyda — o'zgartirish kerak bo'lsa, izlash shart emas
  • Funksiyalar oldin, chaqiruv keyin — Python faylni yuqoridan pastga o'qiydi, funksiya chaqirilishidan oldin aniqlangan bo'lishi kerak

Yaxshi xabar: ruff importlarni o'zi tartiblaydi (2.7-dars). Siz faqat mantiqiy tuzilmani o'ylaysiz.

2.3. if __name__ == "__main__" — nima bu

Bu qator har bir Python loyihasida uchraydi va boshlovchilarni chalkashtiradi.

Muammo nima?

Faylni ikki xil ishlatish mumkin:

  1. To'g'ridan-to'g'ri ishga tushirish: python3 main.py
  2. Boshqa fayldan import qilish: import main

Ikkala holatda ham Python butun faylni bajaradi. Ya'ni import qilganingizda ham fayldagi barcha print ishlaydi. Bu — kutilmagan.

Misol:

salomlash.py:

python
def salom(ism):
    return f"Salom, {ism}!"

print(salom("Ali"))       # bu qator import paytida ham ishlaydi

asosiy.py:

python
import salomlash          # faqat funksiyani olmoqchi edik
print("Asosiy dastur")
bash
python3 asosiy.py
text
Salom, Ali!        ← kutilmagan! biz buni so'ramagan edik
Asosiy dastur

Yechim:

Python har bir modulga __name__ degan maxsus o'zgaruvchi beradi:

Vaziyat __name__ qiymati
Fayl to'g'ridan-to'g'ri ishga tushirilgan "__main__"
Fayl import qilingan modul nomi ("salomlash")

Shuning uchun:

python
def salom(ism):
    return f"Salom, {ism}!"

if __name__ == "__main__":
    print(salom("Ali"))       # FAQAT to'g'ridan-to'g'ri ishga tushirilganda

Endi import salomlash hech narsa chiqarmaydi — faqat funksiyani beradi.

Amaliy qoida:

Fayl ishga tushiriladigan kodni doim if __name__ == "__main__": ichiga qo'ying.

Bu — kelajakda faylni kutubxona sifatida ishlatish imkonini beradi. Va bu tekin.

2.4. main() funksiyasi — nega u kerak

Yuqoridagi misolni yanada yaxshilash mumkin:

python
def salom(ism):
    return f"Salom, {ism}!"


def main():
    ism = input("Ismingiz: ")
    print(salom(ism))


if __name__ == "__main__":
    main()

Nega asosiy kodni main() ichiga o'rash kerak?

  1. Global o'zgaruvchilar paydo bo'lmaydi. main() ichidagi ism — mahalliy. Bu — 7-qismdagi qamrov mavzusi
  2. Testlash oson — main() ni testdan chaqirish mumkin (17-qism)
  3. O'qish oson — dastur nimadan boshlanishi aniq
  4. Tez qaytish mumkin — return bilan istalgan joyda tugatish

Bu — Python jamoasidagi standart shakl. Ochiq kodli har qanday loyihada uni ko'rasiz.

2.5. __pycache__ — bu nima va nima qilish kerak

Faylni import qilgach papkangizda yangi narsa paydo bo'ladi:

text
loyiha/
├── main.py
├── salomlash.py
└── __pycache__/
    └── salomlash.cpython-312.pyc

1.4-darsdan eslang: Python kodni bytecode'ga o'giradi. .pyc fayli — saqlangan bytecode.

Nega? Tezlik uchun. Keyingi safar import qilganda Python qayta kompilyatsiya qilmaydi — tayyor bytecode'ni oladi.

Muhim faktlar:

  • .pyc faqat import qilingan modullar uchun yaratiladi. main.py uchun yaratilmaydi
  • Nomdagi cpython-312 — qaysi Python versiyasiga tegishli ekanini bildiradi
  • Manba fayl o'zgarsa, Python buni sezadi va bytecode'ni yangilaydi
  • Bu faylni tahrirlash mumkin emas — u ikkilik format

Nima qilish kerak?

Hech narsa. Faqat Git'ga qo'shmang:

text
# .gitignore
__pycache__/
*.pyc

Yaratilishini o'chirish ham mumkin (odatda kerak emas):

bash
python3 -B main.py                    # bu safar
export PYTHONDONTWRITEBYTECODE=1      # doimiy

2.6. Ishga tushirishning barcha usullari

bash
python3 main.py                 # oddiy
py main.py                      # Windows
python3 -m mening_paketim       # modul sifatida (19-qism)
python3 -i main.py              # bajarib, REPL'da qolish
python3 -B main.py              # .pyc yaratmasdan
python3 -u main.py              # buferlashsiz (1.8-dars)
python3 -O main.py              # optimallashtirilgan (assert o'chadi)
python3 -c "print('salom')"     # bitta buyruq

-u — muhim bayroq. 1.8-darsda buferlash haqida gapirgandik. Server va Docker'da loglar ko'rinmay qolishi mumkin. -u buni hal qiladi.

Shebang (Unix'da)

Faylning birinchi qatoriga:

python
#!/usr/bin/env python3

Keyin faylni bajariladigan qilib belgilang:

bash
chmod +x main.py
./main.py                       # endi python3 yozish shart emas

#! — "shebang". Operatsion tizim uni o'qib, faylni qaysi dastur bilan ochishni biladi.

/usr/bin/env python3 — "PATH dan python3 ni top" degani. To'g'ridan-to'g'ri /usr/bin/python3 yozishdan yaxshiroq, chunki u virtual muhitni ham hurmat qiladi (2.3-dars).

Windows'da shebang ishlamaydi (lekin py ishga tushirgichi uni o'qiy oladi). Zarar qilmaydi — qo'shib qo'yavering.

2.7. Dasturga ma'lumot berish: sys.argv

Dasturga tashqaridan ma'lumot berishning ikki asosiy usuli bor.

1. input() — dastur ishlayotganda so'raydi

python
ism = input("Ismingiz: ")

Qulay, lekin avtomatlashtirishga yaramaydi.

2. Buyruq satri argumentlari — ishga tushirishda beriladi

python
import sys

print(sys.argv)
bash
python3 main.py salom dunyo 42
text
['main.py', 'salom', 'dunyo', '42']

Muhim jihatlar:

  • sys.argv[0] — doim fayl nomi. Argumentlar [1] dan boshlanadi
  • Hamma element — satr. 42 ham '42', son emas
  • 1.8-darsdagi 5-bosqichni eslang: OT jarayonga argumentlarni shunday uzatadi

Amaliy misol:

python
import sys

if len(sys.argv) < 2:
    print("Foydalanish: python3 salom.py <ism>")
    sys.exit(1)

ism = sys.argv[1]
print(f"Salom, {ism}!")
bash
python3 salom.py Ali
text
Salom, Ali!
bash
python3 salom.py
text
Foydalanish: python3 salom.py <ism>

Jiddiy dasturlarda argparse ishlatiladi — u bayroqlar, yordam matni va turlarni o'zi boshqaradi. 15-qismda o'rganamiz.

2.8. Chiqish kodi — dastur qanday tugadi

Har bir dastur tugaganda operatsion tizimga son qaytaradi:

Kod Ma'nosi
0 Muvaffaqiyat
1 Umumiy xato
2 Noto'g'ri foydalanish
boshqa Dasturga xos

Python buni avtomatik qiladi:

  • Dastur normal tugadi → 0
  • Ushlanmagan xato → 1

Qo'lda belgilash:

python
import sys

if xato_bor:
    sys.exit(1)          # xato bilan tugatish
sys.exit(0)              # yoki oddiy tugash

Tekshirish:

bash
python3 main.py
echo $?                  # Unix
text
0
text
python main.py
echo %ERRORLEVEL%        # Windows cmd

Nega bu muhim?

Chiqish kodi — skriptlar va CI tizimlari uchun signal:

bash
python3 test.py && python3 deploy.py

&& — "birinchisi muvaffaqiyatli tugasa, ikkinchisini bajar". Agar test.py 1 qaytarsa, deploy.py ishga tushmaydi.

Bu — 28-qismdagi CI/CD ning asosi.

2.9. Kodlash va o'zbekcha matn

Python 3 sukut bo'yicha UTF-8 kutadi. O'zbekcha harflar (o', g', sh, ch) muammosiz ishlaydi:

python
print("Salom, o'zbek dasturchisi!")
ism = "G'ulomjon"
print(f"Xush kelibsiz, {ism}!")

Muammo faqat ikki holatda chiqadi:

1. Fayl UTF-8 da saqlanmagan. Muharrirda tekshiring — VS Code holat qatorida UTF-8 yozilgan bo'lishi kerak.

2. Terminal UTF-8 ni qo'llab-quvvatlamaydi (eski Windows cmd):

text
UnicodeEncodeError: 'charmap' codec can't encode character

Yechim:

text
chcp 65001               # cmd'da UTF-8 rejimga o'tish

Yoki Windows Terminal / Git Bash ishlating.

Eski kodda ba'zan quyidagi qatorni ko'rasiz:

python
# -*- coding: utf-8 -*-

Bu — Python 2 davridan qolgan. Python 3 da kerak emas. Ko'rsangiz — eskirgan kod belgisi (1.7-dars).


3. Tez ma'lumotnoma

Fayl nomi

text
✅ main.py, hisob_kitob.py, dars_01.py
❌ Main.py, hisob-kitob.py, 01_dars.py, random.py

Standart tuzilma

python
"""Docstring."""

import sys                    # standart kutubxona

import requests               # tashqi

SOLIQ = 0.12                  # doimiylar

def yordamchi():              # funksiyalar
    ...

def main():                   # asosiy mantiq
    ...

if __name__ == "__main__":    # kirish nuqtasi
    main()

Ishga tushirish

bash
python3 main.py           oddiy
python3 -i main.py        REPL'da qolish
python3 -u main.py        buferlashsiz
python3 -B main.py        .pyc yaratmasdan
./main.py                 shebang bilan (chmod +x kerak)

Argumentlar va chiqish

python
import sys
sys.argv          # ['main.py', 'arg1', 'arg2'] — hammasi SATR
sys.exit(0)       # muvaffaqiyat
sys.exit(1)       # xato

4. Batafsil misollar

Misol 1 — Birinchi to'liq dastur

salomlashuv.py:

python
"""Foydalanuvchi bilan salomlashadigan oddiy dastur."""


def salomlash(ism: str) -> str:
    """Ism bo'yicha salomlashish matnini qaytaradi."""
    return f"Salom, {ism}! Wisar Python kursiga xush kelibsiz."


def main() -> None:
    ism = input("Ismingiz: ")

    if not ism.strip():
        print("Ism kiritilmadi.")
        return

    print(salomlash(ism.strip()))


if __name__ == "__main__":
    main()
bash
python3 salomlashuv.py
text
Ismingiz: Sarvar
Salom, Sarvar! Wisar Python kursiga xush kelibsiz.

Kodda nima bor:

Element Nima
"""...""" (birinchi qator) Modul docstringi
ism: str va -> str Tur ishoralari (13-qism)
.strip() Boshi va oxiridagi bo'sh joyni olib tashlaydi
if not ism.strip() Bo'sh kiritishni tekshirish
return (qiymatsiz) Funksiyadan erta chiqish
main() va __main__ Standart shakl

Nima ko'rsatdi: 2.2, 2.3, 2.4-bo'limlar. Bu — professional Python faylining minimal shakli.

Misol 2 — __name__ ni o'z ko'zingiz bilan ko'rish

modul.py:

python
print(f"modul.py ichida __name__ = {__name__!r}")


def salom():
    return "Salom moduldan!"


if __name__ == "__main__":
    print("modul.py TO'G'RIDAN-TO'G'RI ishga tushirildi")
    print(salom())

asosiy.py:

python
print(f"asosiy.py ichida __name__ = {__name__!r}")

import modul

print(modul.salom())

To'g'ridan-to'g'ri ishga tushirish:

bash
python3 modul.py
text
modul.py ichida __name__ = '__main__'
modul.py TO'G'RIDAN-TO'G'RI ishga tushirildi
Salom moduldan!

Import qilish:

bash
python3 asosiy.py
text
asosiy.py ichida __name__ = '__main__'
modul.py ichida __name__ = 'modul'
Salom moduldan!

E'tibor bering:

  1. asosiy.py — u ishga tushirilgan, shuning uchun '__main__'
  2. modul.py — u import qilingan, shuning uchun 'modul'
  3. modul.py dagi if bloki ishlamadi — aynan biz xohlagandek

{__name__!r} — !r tirnoqlar bilan ko'rsatadi (repr). 4-qismda batafsil.

Nima ko'rsatdi: 2.3-bo'lim. Bu tajriba __name__ ni bir marta va butunlay tushuntiradi.

Misol 3 — Argumentlar bilan ishlaydigan dastur

kalkulyator.py:

python
"""Buyruq satridan ikki son olib, ular ustida amal bajaradi.

Foydalanish:
    python3 kalkulyator.py <son1> <amal> <son2>
Misol:
    python3 kalkulyator.py 10 + 5
"""

import sys


def hisobla(a: float, amal: str, b: float) -> float:
    if amal == "+":
        return a + b
    if amal == "-":
        return a - b
    if amal == "*":
        return a * b
    if amal == "/":
        if b == 0:
            print("Xato: nolga bo'lish mumkin emas")
            sys.exit(1)
        return a / b

    print(f"Xato: noma'lum amal {amal!r}")
    sys.exit(1)


def main() -> None:
    if len(sys.argv) != 4:
        print(__doc__)
        sys.exit(2)

    a = float(sys.argv[1])
    amal = sys.argv[2]
    b = float(sys.argv[3])

    print(f"{a} {amal} {b} = {hisobla(a, amal, b)}")


if __name__ == "__main__":
    main()
bash
python3 kalkulyator.py 10 + 5
text
10.0 + 5.0 = 15.0
bash
python3 kalkulyator.py 10 / 0
text
Xato: nolga bo'lish mumkin emas
bash
echo $?
text
1
bash
python3 kalkulyator.py 10
text
Buyruq satridan ikki son olib, ular ustida amal bajaradi.
...
bash
echo $?
text
2

E'tibor bering:

  • float(sys.argv[1]) — argument satr, uni songa aylantirish kerak (2.7-bo'lim)
  • __doc__ — modul docstringi. Yordam matni sifatida ishlatilyapti
  • Turli xato uchun turli chiqish kodi (2.8-bo'lim)
  • * ni terminalda ishlatganda tirnoqqa oling: "*" — aks holda qobiq uni fayl nomlariga almashtiradi

Nima ko'rsatdi: 2.7 va 2.8-bo'limlar. Bu — haqiqiy buyruq satri vositasining tuzilishi.

Misol 4 — __pycache__ ni kuzatish

bash
mkdir sinov && cd sinov

yordamchi.py:

python
def qosh(a, b):
    return a + b

main.py:

python
from yordamchi import qosh

print(qosh(2, 3))
bash
ls
text
main.py  yordamchi.py
bash
python3 main.py
text
5
bash
ls
text
__pycache__  main.py  yordamchi.py
bash
ls __pycache__
text
yordamchi.cpython-312.pyc

Savol: nega main.cpython-312.pyc yo'q?

Chunki main.py import qilinmadi — u to'g'ridan-to'g'ri ishga tushirildi. Python faqat import qilingan modullar uchun bytecode saqlaydi (2.5-bo'lim).

Tekshirish:

bash
rm -rf __pycache__
python3 -B main.py       # -B — bytecode yozmasdan
ls
text
main.py  yordamchi.py

Papka yaratilmadi.

Nima ko'rsatdi: 2.5 va 2.6-bo'limlar hamda 1.4-darsdagi bytecode mavzusi.


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"Fayl nomi ahamiyatsiz" U modul nomi. random.py deb nomlash standart kutubxonani buzadi
"if __name__ — keraksiz marosim" U import va ishga tushirishni ajratadi. Kelajakdagi o'zingiz uchun
"main() funksiyasi ortiqcha" U global o'zgaruvchilarni oldini oladi va testlashni osonlashtiradi
"__pycache__ — axlat, o'chirish kerak" U tezlashtiradi. Faqat Git'ga qo'shmang
"sys.argv[0] — birinchi argument" Yo'q, u fayl nomi. Argumentlar [1] dan
"Argumentlar avtomatik son bo'ladi" Hammasi satr. int() yoki float() kerak
"Chiqish kodi ahamiyatsiz" CI, skriptlar va && unga tayanadi
"# -*- coding: utf-8 -*- kerak" Python 3 da yo'q. Bu — Python 2 qoldig'i

6. Keng tarqalgan xatolar va yechimlari

1. ModuleNotFoundError: No module named 'X'

Sabablar:

  • Kutubxona o'rnatilmagan → python3 -m pip install X
  • Noto'g'ri interpretator → 2.6-dars
  • Fayl nomi noto'g'ri yozilgan

2. AttributeError: module 'random' has no attribute 'randint'

Sabab: sizning faylingiz nomi random.py (2.1-bo'lim).

Yechim: faylni qayta nomlang va __pycache__ ni o'chiring:

bash
mv random.py mening_random.py
rm -rf __pycache__

3. Import qilganda kutilmagan chiqish

Sabab: if __name__ == "__main__": ishlatilmagan (2.3-bo'lim).

Yechim: ishga tushirish kodini shu blok ichiga oling.

4. IndexError: list index out of range — sys.argv bilan

Sabab: argument berilmagan, lekin sys.argv[1] o'qilyapti.

Yechim: avval uzunlikni tekshiring:

python
if len(sys.argv) < 2:
    print("Foydalanish: ...")
    sys.exit(2)

5. TypeError: can only concatenate str (not "int") to str

Sabab: sys.argv elementlari satr.

python
son = sys.argv[1]        # '42' — satr!
natija = son + 10        # XATO
natija = int(son) + 10   # TO'G'RI

6. Windows'da o'zbekcha harflar buzilyapti

Sabab: cmd UTF-8 rejimida emas (2.9-bo'lim).

Yechim: chcp 65001, yoki Windows Terminal / Git Bash ishlating.

7. Permission denied: ./main.py

Sabab: fayl bajariladigan deb belgilanmagan.

Yechim: chmod +x main.py. Shebang qatori ham bo'lishi kerak (2.6-bo'lim).

8. Kod o'zgardi, lekin eski natija chiqyapti

Sabablar:

  • Fayl saqlanmagan (2.6-dars — Auto Save)
  • Boshqa papkadagi bir xil nomli faylni ishga tushiryapsiz → pwd bilan tekshiring

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 2.9-dars: bu dasturlarda xato chiqqanda uni o'qish
  • 3-qism: input(), print(), turlarni o'zgartirish — batafsil
  • 7-qism: funksiyalar, main() ning to'liq ma'nosi, qamrov
  • 19-qism: paketlar, python3 -m, __init__.py
  • 15-qism: argparse — argumentlar bilan professional ishlash
  • 17-qism: main() ni testlash
  • 28-qism: chiqish kodlari CI/CD da

8. Eng yaxshi amaliyotlar

  1. Har doim if __name__ == "__main__": yozing. Bu — bir qator, lekin kelajakda ko'p muammoni oldini oladi.

  2. Asosiy mantiqni main() ichiga oling. Global o'zgaruvchilar — kelajakdagi bosh og'rig'i.

  3. Fayl nomlarini ehtiyot bo'lib tanlang. Standart kutubxona nomlarini band qilmang.

  4. __pycache__ ni .gitignore ga qo'shing. Har doim, birinchi kundan.

  5. Argumentlarni doim tekshiring. sys.argv[1] ni ko'r-ko'rona o'qish — IndexError uchun taklifnoma.

  6. Xato bo'lganda sys.exit(1) qiling. Skriptlar va CI shuni kutadi.

  7. Modul docstringi yozing. Uch oydan keyin o'zingizga rahmat aytasiz.


9. Amaliy topshiriq

Vazifa 1: Birinchi dastur

1-misoldagi salomlashuv.py ni yozing va ishga tushiring. Keyin kengaytiring:

  • Yoshni ham so'rasin
  • Yosh 18 dan kichik bo'lsa boshqa xabar chiqarsin

Vazifa 2: __name__ tajribasi

2-misoldagi ikki faylni yarating va ikkala usulda ishga tushiring. Savollar:

  1. python3 modul.py da __name__ nima edi?
  2. python3 asosiy.py da modul.py ning __name__ i nima edi?
  3. Nega if bloki ikkinchi holatda ishlamadi?

Vazifa 3: Argumentlar

sonlar.py yozing — buyruq satridan istalgancha son olib, quyidagilarni chiqarsin:

text
python3 sonlar.py 5 3 9 1 7
text
Sonlar: 5.0, 3.0, 9.0, 1.0, 7.0
Jami:    25.0
O'rtacha: 5.0
Eng katta: 9.0
Eng kichik: 1.0

Agar son berilmagan bo'lsa, foydalanish yo'riqnomasini chiqarib sys.exit(2) qilsin.

Yechim
python
"""Buyruq satridan sonlar olib, statistikasini chiqaradi.

Foydalanish: python3 sonlar.py <son1> <son2> ...
"""

import sys


def main() -> None:
    if len(sys.argv) < 2:
        print(__doc__)
        sys.exit(2)

    sonlar = [float(x) for x in sys.argv[1:]]

    print("Sonlar:", ", ".join(str(s) for s in sonlar))
    print("Jami:   ", sum(sonlar))
    print("O'rtacha:", sum(sonlar) / len(sonlar))
    print("Eng katta:", max(sonlar))
    print("Eng kichik:", min(sonlar))


if __name__ == "__main__":
    main()

sys.argv[1:] — birinchisidan tashqari hammasi (fayl nomini tashlab). Bu — kesim (slice), 4 va 6-qismlarda batafsil.

Vazifa 4: Chiqish kodini tekshirish

3-misoldagi kalkulyator.py ni yozing va har bir holatda chiqish kodini tekshiring:

bash
python3 kalkulyator.py 10 + 5   ; echo $?
python3 kalkulyator.py 10 / 0   ; echo $?
python3 kalkulyator.py 10       ; echo $?

Uch xil kod chiqdimi?

Vazifa 5: __pycache__ tajribasi

4-misoldagi tajribani takrorlang. Savol: main.py uchun nega .pyc yaratilmadi?

Vazifa 6: Nom tuzog'i

Ataylab xato yarating:

  1. random.py nomli fayl yarating, ichiga print("Bu mening faylim") yozing
  2. Shu papkada sinov.py yarating:
    python
    import random
    print(random.randint(1, 10))
  3. Ishga tushiring. Nima bo'ldi?
  4. Tuzating
Javob
text
Bu mening faylim
AttributeError: module 'random' has no attribute 'randint'

Python joriy papkani birinchi qidiradi va sizning random.py ni topdi.

Tuzatish: faylni qayta nomlang va __pycache__ ni o'chiring (eski bytecode qolib ketishi mumkin).

Nimani mustahkamlaydi: 2.1, 2.3, 2.4, 2.5, 2.7, 2.8-bo'limlar.


Xulosa

Bu darsda birinchi haqiqiy Python dasturini yozdik va uni professional shaklga keltirdik.

Eng muhim uch fikr:

  1. if __name__ == "__main__": + main() — standart shakl. Bu ikki qator faylni ham dastur, ham kutubxona qiladi. Har doim yozing.

  2. Fayl nomi — modul nomi. random.py yoki json.py deb nomlash standart kutubxonani soya qiladi va tushunarsiz xatolarga olib keladi.

  3. sys.argv elementlari — satr, chiqish kodi — signal. Argumentni songa aylantiring, xato bo'lsa sys.exit(1) qiling. Bu — dasturingizni boshqa vositalar bilan ishlatish imkonini beradi.

Keyingi darsda — 2-qismning yakuni — xato xabarlarini o'qishni o'rganamiz. Bu, ehtimol, butun kursdagi eng amaliy ko'nikma: chunki dasturchi vaqtining katta qismi xato tuzatishga ketadi.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
2.8-dars: Birinchi .py fayl va uni ishga tushirish — IlmHamroh