Funksiyalar

Biz shu vaqtgacha bir qancha funksiyalardan foydalanib keldik va ularning hammasi Pythonda mavjud bo‘lgan yoki o‘zgaruvchi turlarning metodlari edi. Endi biz dasturlarni yozishdan avval o‘zimiz ham funksiya e’lon qilishni o‘rganamiz, chunki ushbu funksiyalar juda muhim ahamiyatga ega bo‘lib, bizga kodlarni qayta yozishdan tejash imkoniyatini beradi. Buning uchun biz def kalit so‘zidan foydalanamiz, quyidagi sinkasis orqali: def <funksiya nomi>(<parameterlar ro‘yxati>): <tanasi>. Quyida ikkita sondan kattasini bizga qaytaruvchi funksiya berilagan.

[ ]:
# def-kalit so‘z
# max - funksiya nomi
# qavslar ichidagi a va b parameterlar
# : belgisi
def max(a, b):
  # chekinish bilan funksiya bajarishi lozim bo‘lgan buyruqlar
  # agar a katta bo‘lsa, u holda
  if a > b:
    # return bu kalit so‘z
    # a ning qiymatini qaytar
    return a
  # agar a kichik yoki teng bo‘lsa
  else:
    # b ning qiymatini qaytar
    return b

Biz yuqorida aytilganidek ikkita soning kattasini topuvchi funksiya yasadik: - bizga ikkita son berilishi kerak shuning uchun paramterda ikkita a va b o‘zgaruvchilari bor; - biz ushbu funksiyadan boshqa joylarda ham foydalanishimiz zarur shuning uchun uning nomi bor, max; - def kalit so‘zi biz funksiyani aniqlayotganimizni bildiradi; - qavslar yordamida ushbu funksiya chaqirilganda qanday o’zgaruvchilarni qabul qilishini va ularning nomlarini ro’yxat shaklida yozib qo’ydik.

Funskiyaning tanasini, ya’ni u bajarishi zarur bo‘lgan buyruqlar ro‘yxatini biz if yoki while operatoridagi kabi 2 ta bo‘sh belgi qo‘yib keyin yozamiz, shunda u funkiyasning buyruqlari deb tushuniladi, aks holda xato yuzaga keladi. return - ham operator bo‘lib, u biror qiymatni funksiyani biz qayerdan chaqirgan bo‘lsak shu joyga qaytarib jo‘natadi va funksiyaning ushbu chaqiruvdagi vazifasi shu bilan tugaydi. Quyida qanday qilib yuqoridagi funksiyani chaqirib undan foydalanishga misollar keltirilgan.

[2]:
a = 89
b = 3
c = max(a, b)
print("Kattasi: ", c)
Kattasi:  89

Biz funksiya parameterlarida a va b o‘zgaruvchilari deb yozdik, lekin uni chaqirganda biz unga boshqa nomli o‘zgaruvchilar bilan ham murojaat qilishimiz mumkin. Quyidagicha:

[3]:
d = 3
r = 76
c = max(d, r)
print("Kattasi: ", c)
Kattasi:  76

Eng asosiy narsa bu funksiya parameterlar soni bir xil bo‘lishi kerak. Endi biz ushbu funksiyani bemalol qiymatlar bilan ham chaqirishimiz mumkin. Masalan:

[4]:
print("Kattasi: ", max(4, 37))
print("Kattasi: ", max(87, 93))
print("Kattasi: ", max(45, 45))
print("Kattasi: ", max(76, 3))
Kattasi:  37
Kattasi:  93
Kattasi:  45
Kattasi:  76

E’tibor qilgan bo‘lsangiz biz ushbu funksiyaning asosiy qismini yuqorida bir marta yozib qo‘yib uni ketma-ket necha marta zarur bo‘lsa, shuncha ishlatdik. Bu narsa funksiyalarning keng qo‘lanilishiga sabab bo‘ladi. Biz ushbu funskiyaga oid qisqa darsimizni shu yerda yakunlaymiz va qolgan qimslarni keyingi Python darslarimizda batafsil yoritamiz. Quyida biz ushbu funksiyalardan foydalanib vektorlar va matritsalar o‘rtasidagi amalarni bajarish uchun funksiyalarni yozib chiqamiz va ulardan keyinchalik zarur o‘rinlarda qayta-qayta foydalanamiz.

Vektorlar ustida amallar

[ ]:
def add_vecs(a, b):
  c = []
  i = 0
  while i < len(a):
    c.append(a[i] + b[i])
    i = i + 1

  return c

def subtract_vecs(a, b):
  c = []
  i = 0
  while i < len(a):
    c.append(a[i] - b[i])
    i = i + 1

  return c

def element_wise_product_vecs(a, b):
  c = []
  i = 0
  while i < len(a):
    c.append(a[i] * b[i])
    i = i + 1

  return c

def dot_product_vecs(a, b):
  s = 0
  i = 0
  while i < len(a):
    s += a[i] * b[i] # s = s + a[i] * b[i]
    i = i + 1

  return s

def evklid_distance_vecs(a, b):
  s = 0
  i = 0
  while i < len(a):
    s += (a[i] - b[i]) ** 2
    i = i + 1

  return s ** 0.5

def manhattan_distance_vecs(a, b):
  s = 0
  i = 0
  while i < len(a):
    s += abs(a[i] - b[i])
    i = i + 1

  return s

def product_vec_matrix(a, b):

  c = []
  i = 0
  while i < len(b[0]):
    temp = []
    j = 0
    while j < len(b):
      temp.append(b[j][i])
      j = j + 1
    c.append(dot_product_vecs(a, temp))
    i = i + 1
  return c

Matritsalar ustida amallar

[ ]:
def add_matrices(a, b):
  c = []
  i = 0
  while i < len(a):
    c.append(add_vecs(a[i], b[i]))
    i += 1

  return c

def subtract_matrices(a, b):
  c = []
  i = 0
  while i < len(a):
    c.append(subtract_vecs(a[i], b[i]))
    i += 1

  return c

def element_wise_product_matrices(a, b):
  c = []
  i = 0
  while i < len(a):
    c.append(element_wise_product_vecs(a[i], b[i]))
    i += 1

  return c

def product_matrices(a, b):
  c = []
  i = 0
  while i < len(a):
    j = 0
    inner_c = []
    while j < len(b[0]):
      temp = []
      l = 0
      while l < len(b):
        temp.append(b[l][j])
        l += 1

      inner_c.append(dot_product_vecs(a[i], temp))
      j += 1
    c.append(inner_c)
    i += 1

  return c

def product_matrix_vector(a, b):
  c = []
  i = 0
  while i < len(a):
    c.append(dot_product_vecs(a[i], b))
    i = i + 1
  return c