{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Funksiyalar\n", "\n", "## Dasturlash tilida funksiyalar" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Oldingi mavzularda biz bir qator funksiyalarni shunchaki ishlatib ketdik. Keling endi ular bilan batafsil tanishsakda, keyin boshqa zarur funksiyalardan bir nechtasini o'rganib chiqsak. \n", "\n", "**Funksiya** - deb dasturlash tillarida dasturning ma'lum bir bo'lagiga aytiladi va biz undan dasturning asosiy qismida bir necha mart qayta-qayta chaqirib ishlatishimiz mumkin bo'ladi. Ya'ni bir marta ma'lum bir amal yoki amallar ketma-ketligini yozib qo'yib, undan takror ishlatishimiz mumkin bo'ladi. Bundan tashqari funksiyalar bir qancha qulayliklarni bizga taqdim etadi. Bular haqida ushbu kursda kamroq so'z yuritamiz, chunki kursimiz asosan Sun'iy Intellekt uchun. Odatda har bir dasturlash tili bir qator birlamchi funksiyalar to'plamini o'zida saqlaydi. Quyida biz ulardan zarurlarini o'rganamiz.\n", "\n", "Funksiyalarni chaqirish uchun quyidagi sinkasisdan foydalanamiz: ```()``` - ya'ni birinchi bizga zarur bo'lgan funksiya nomini yozib, keyin qavs ichiga shu funksiyani ishlatish uchun zarur bo'lgan parameter yoki parameterlar vergul bilan yozib chiqiladi. Keling `print` funskiyasining ishlatilishini ber eslaylik:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Abdusamatov Doniyor 14 78.5\n" ] } ], "source": [ "age = 14\n", "fam = \"Abdusamatov\"\n", "ism = 'Doniyor'\n", "vazn = 78.5\n", "print(fam, ism, age, vazn)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yuqoridagi dastur matnida biz `print` nomli funksiya chaqirdik va uning parameterlariga 4 to'rta o'zgaruvchini uzatdik. Natijada esa bu funskiya uzatilgan parameterlarni chop qildi. Quyida ushbu funksiyalar bilan batafsil tanishib chiqamiz.\n", "\n", "Biz shu vaqtgacha faqat ikkita funksiya bilan tanishdik. Shunda ham, faqat ular bilan qisman ishlashni o'rgandik. Shuning uchun ushbu bo'limda, funksiyaning qiymat qaytarishini va ularning natijalarini boshqa o'zgaruvchi saqlab, keyinchalik ulardan foydalanishni o'rganamiz. Python dasturlash tilida har bir funksiya qiymat qaytaradi. Lekin, odatada, dasturlash tillarida biz funksiyalar qiymat qaytarishi yoki qaytarmasligiga qarab ikki turga ajratamiz. Pythonda esa bu holat faqat `None` o'zgarmas qiymati bilan amalga oshiriladi, ya'ni shunchaki `None` qiymatini qaytaradi agar oshkor ravishda qiymat qaytarish buyrug'i berilmagan bo'lsa. Bu kabi ma'lumotlar bilan keyinchalik foydalanuvchi tomonidan aniqlangan funksiyalar mavzusida tanishamiz. \n", "\n", "Hozir keling bu qismlarga chuqur kirishmasdan, uning o'rniga, sodda misollar bilan mavzuni tushunaylik. Bu kabi holatlarni esa kelgusida ko'rib chiqaylik. Keling `type` funksiyasi qaytargan qiymatni, biror o'zgaruvchiga yozaylikda, keyin uni `print` funksiyasi yordamida chop qilaylik quyidagi kodda berilgan kabi." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "# age o'zgaruvchisiga 25 yozish\n", "age = 25\n", "# age o'zgaruvchisi turini olish\n", "age_type = type(age)\n", "# va natijani chop qilish\n", "print(age_type)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## `print` funksiyasi\n", "\n", "Ushbu bo'limda biz `print` funksiyasi bilan batafsil tanishishga harakat qilamiz. Chunki biz ushbu funksiyadan ushbu kitob davomida juda ko'p o'rinlarda foydalanimiz. Ushbu funksiya 5 qiymat (argument deb ham nomlaymiz) qabul qiladi, ular:\n", "1. `*values` - ushbu argumentga biz chop qilmoqchi bo'lgan qiymatlarimizni beramiz, masalan:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Abdusamatov Doniyor 14 78.5\n" ] } ], "source": [ "age = 14\n", "fam = \"Abdusamatov\"\n", "ism = 'Doniyor'\n", "vazn = 78.5input('Yoshi kiriting: ')\n", "# chop etish\n", "print(fam, ism, age, vazn)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ushbu argument bir nechta qiymatlarni o'z ichiga oladi. Yuqoridagi kodga e'tibor bersak, undagi 4 ta qiymat ham ushbu argumentga tegishli, shuning uchun ham argumentda (`*values`) `*` belgisi bor. Bu kabi tafsilotlarni keyinchalik o'rni kelgandi o'rganamiz.\n", "\n", "2. `sep` - bu satr (matn) turida qiymat qabul qilib, `*values` argumentidagi qiymatlarni o'rtasiga ajratuvchi sifatida yoziladi. Shuning uchun ham uning nomi `sep` ya'ni `separator` ning qisqartmasi. Quyidagi misolni diqqat bilan o'rganing." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Abdusamatov|Doniyor|14|78.5\n", "Abdusamatov | Doniyor | 14 | 78.5\n" ] } ], "source": [ "age = 14\n", "fam = \"Abdusamatov\"\n", "ism = 'Doniyor'\n", "vazn = 78.5\n", "# turli xil chop etishlar\n", "# ajratuvchi sifatida ustun '|' belgisidan foydalanimiz\n", "print(fam, ism, age, vazn, sep='|')\n", "# ajratuvchi sifatida ustun '|' belgisidan foydalanimiz\n", "# va orasiga bo'sh joy ham qo'shamiz\n", "print(fam, ism, age, vazn, sep=' | ')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ushbu kodni diqqat bilan kuzatsak, eng farqli bo'lgan tomoni aniqlashmiz mumkin, bu esa biz kodda `sep='|'` kodni ishlatishimiz. Biz birinchi 4 ta qiymatni (`fam`, `ism`, `age`, `vazn`) ketma-ket vergul bilan ajratib yozdik va bular jamoa bo'lib `*values`ga tegishli bo'ldi. Lekin `sep` agrumentiga kelganda esa, biz unining nomni berdik, bu kabi funksiya argumentining nomni yozish oshkor ko'rinishda argumentga qiymat berish deb nomlanadi hamda bu shunday qilmasak xatolik ro'y beradi. Bu kabi xatolar nega chiqishi va nega yana shu kabi ko'rinishda foydalanishimiz zarur ekanligini vaqti kelib o'rganamiz. \n", "\n", "3. `end` - bu argument `print` funksiyasi ishlagandan keyin qanday qiymat qo'yishni aniqlaydi, odatda keyingi qatorga tushish qiymat sifatida turadi. Yuqoridagi kodga e'tibor bersak, unda ikki chop qilishimiz (`print` fuknisyasini birinchi va ikkinchi marta chaqirgan qism) natijalari alohida ikki qatorga yozilgan. Keling bir tekshirib ko'ramiz." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Abdusamatov|Doniyor|14|78.5\n", "Abdusamatov | Doniyor | 14 | 78.5 Abdusamatov | Doniyor | 14 | 78.5 " ] } ], "source": [ "# Yoshi 14\n", "age = 14\n", "fam = \"Abdusamatov\"\n", "ism = 'Doniyor'\n", "vazn = 78.5\n", "# ushbu koddan keyin albatta keygi chop qilish natijalari yangi qatordan yoziladi\n", "print(fam, ism, age, vazn, sep='|')\n", "# Bunda keyingi chop qilish bilan buning o'rtasida faqat bo'sh joy bo'ladi\n", "print(fam, ism, age, vazn, sep=' | ', end=' ')\n", "# orada bo'sh joy bor\n", "print(fam, ism, age, vazn, sep=' | ', end=' ')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yuqoridagi kod bizga `end` argumentiga qiymat bermasak natijada keyingi chop qilishlar yangi qatordan boshlanishini ko'rdik. Ushbu funksiyaning boshqa yana 2 ta argumenti bo'lib, biz ularni keyinchalik mustaqil o'rganishga qoldiramiz." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## `input` funksiyasi\n", "\n", "Ushbu funksiyani bir qator funksiyalarda ishlatib ulgirdik. Bu funksiya foydalanuvchiga qiymat kiritish uchun maydon hosil qiladi va uni kiritishini kutib, kiritilgan qiymatni uni chaqirgan joyiga qaytaradi. Ushbu qaytariluvchi qiymatning turi hard doim matn `str` bo'ladi. Agar biz uni boshqa turlarga o'tkazmoqchi bo'lsak, biz shu turning funksiyasini chaqirishimiz zarur bo'ladi. Ushbu funksiya faqat bitta qiymat qabul qilib, foydalanuvchiga qanday qiymat kiritish haqida qo'shimcha xabar chop qiladi va bu parameter har doim `str` turida bo'lishi zarur. Quyida bir qator misollarni qarab chiqamiz. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "34\n" ] } ], "source": [ "age = int(input('Yoshi kiriting: '))\n", "print(age)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yuqoridagi kodda biz `input` funksiyasini to'g'ridan-to'g'iri `int` funskiyasi parameteri sifatida ishlatayabmiz. Bunday ichma-ich joylashishlar dastur natijasiga ta'sir qilmaydi. Quyida shu kodning sal boshqacharoq, ya'ni `input` alohida yozilgan ko'rinishi qaraymiz." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "34\n" ] } ], "source": [ "# 1-chi yoshni satr ko'rinishida\n", "# input funksiyasidan yuklab olamiz.\n", "age_str = input('Yoshi kiriting: ')\n", "# o'zgaruvchi nomidagi str boshqa bo'lishi ham mumkin\n", "age = int(age_str)\n", "print(age)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Turlarni o'zgartirish funksiyalari\n", "\n", "Biz asosan shu vaqtgacha o'rgangan turlarimiz ustida bunday funksiyalarni ishlatib ko'ramiz. Odatda ular bir-birdan katta farq qilmaydi.\n", "\n", "1. `int` - funksiyasi ham o'zgaruvchi turi ham funksiya hisoblanib[^class_not_funk], agar biz uni funksiya sifatida chaqirib parameteriga joiz qiymatni kiritsak unda u bizga qiymatni `int` butun son ko'rinishidagisini qaytaradi. Oldingi kodda bunga sodda misol ko'rdik. Ushbu funksiya yana bitta qo'shimcha `base` parameterga ega bo'lib, u parameter kiritilayotgan qiymatning qaysi sanoq sistemasidagi ekanligini bildirish uchun ishlatiladi. Quyida unga sodda misol qilib, ikkilik sanoq sistemasidagi berilgan matnni `int` turiga[^ref_int_type] o'tkazamiz.\n", "\n", "[^class_not_funk]: Bular aslida tur hisoblanib, funksiya emas balki `class` sinflardir, lekin biz hozir funksiyalarni bilganligimiz uchun funksiya deb qarayabmiz.\n", "\n", "[^ref_int_type]: Biz odatda `int` turida faqat 10 lik sanoq sistemasidagi sonlarni tassavur qilamiz, aslida esa ikkilik sanoq sistemasidagi sonlar ham butun turda bo'lishi mumkin, faqat sanoq sistema farqlanadi xolos." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4\n" ] } ], "source": [ "# bu 4 sonidir\n", "a_2 = '0b100'\n", "a = int(a_2, base=2)\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Yuqorida biz `0b100` matnini 10 lik sanoq sistemasiga o'tkazdik va uning qiymati 4 bo'ldi. Ushbu satr boshidagi `0b` (nol va b harfi) ushbu soning ikkilik sanoq sistemasidagi ekanligini bildir edi.\n", "\n", "2. `float` - funskiyasi ham o'zgaruvchi turi ham funksiya hisoblanib, agar biz uni funksiya sifatida chaqirib joiz parameteriga qiymat berishimiz zarur. Masalan, quyida `str` dan `float` turiga o'tish keltirilgan." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sizning vazningiz: 67.8\n" ] } ], "source": [ "weight = float(input(\"Vazningizni kiriting: \"))\n", "print('Sizning vazningiz: ', weight)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Agar biz `.` o'rniga boshqa belgi, masalan, `,` ishlatsak xatolik beradi." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "could not convert string to float: '67,8'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[2], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m weight \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mfloat\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43minput\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mVazningizni kiriting: \u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSizning vazningiz: \u001b[39m\u001b[38;5;124m'\u001b[39m, weight)\n", "\u001b[0;31mValueError\u001b[0m: could not convert string to float: '67,8'" ] } ], "source": [ "weight = float(input(\"Vazningizni kiriting: \"))\n", "print('Sizning vazningiz: ', weight)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Undan tashqari soning exponenta ko'rinishi orqali ham `str` turida berish mumkin. Masalan, yuqoridagi misolda `678e-1` ni kiritsak ham bir xil natija olamiz. Bundan tashqari butun sonlarni ham haqiqiy songa yoki haqiqiy sonlarni butun sonlarga o'tkazish mumkin mos funskiyalardan foydalangan holda. Namuna uchun:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "67\n", "178.0\n" ] } ], "source": [ "# inson vazn\n", "weight = int('678e-1')\n", "print(weight)\n", "# inson bo'yi\n", "height = float(178)\n", "print(height)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Natijalardagi asosiy farq bu chop qilishda ochiq ko'rinadi, ya'ni `67.8` haqiqiy sonini `int` turiga o'tkazish uning haqiqiy qismini olib tashlaydi. `int` turidagi `178` soni `float` ga o'tkazish esa unga chop qilgan haqiqiy qism qo'shishidir, lekin saqlashda ham xotiradan boshqacha joy ajratiladi." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ko'p ishlatiladigan Python funksiyalari\n", "\n", "Quyida biz bir nechta yuqoridagi funksiyalarga o'xshash funksiyalarni jadvalda qisqacha ta'rifi bilan keltirdik. Bu kabi funksiyalar ko'p bo'lgani uchun o'tilgan mavzugacha bo'lgan funksiyalarni keltiramiz, qoganlari mavzularni tushuntirish asnosida o'rganib boriladi.\n", "\n", "| Funksiya | Tasnifi |\n", "| ----------- | ----------- |\n", "| `abs()` | Berilgan parameterni musbat songa o'tkazadi. Odatda biz bu narsani absolyut qiymat deb nomlaymiz. `abs(-5)` ifodasi 5 qiymat qaytaradi. |\n", "| `bin()` | Qiymatni ikkilik sonoq sistemasiga o'tkazadi. |\n", "| `bool()` | Qiymatni mantiqiy turga o'tkazadi. |\n", "| `chr()` | `int` qiymatiga mos belginini qaytaradi. Masalan, `chr(65)` `A` harfini qaytaradi, chunki `A` harfining kodi 65. |\n", "| `hex()` | `int` qiymatni 16 sanoq sistemasiga o'tkazadi. |\n", "| `id()` | Obyektning (o'zgaruvchining) idsini qaytaradi. |\n", "| `round()` | Haqiqiy soni berilgan aniqlikgacha yaxlitlaydi. |\n", "| `pow()` | Berilgan soni ko'rsatilgan darajaga ko'taradi. Masalan, `pow(4, 2)` 16 bo'ladi. |\n" ] } ], "metadata": { "kernelspec": { "display_name": "ai_courses", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.0" } }, "nbformat": 4, "nbformat_minor": 2 }