Лекция · 3.2

Параметрлер

Өткен сабақта процедураны үйрендік, бірақ бір мәселе бар еді — процедура ӘРДАЙЫМ БІРДЕЙ әрекет жасайды. Ал егер бір процедураны әртүрлі сандармен қолданғың келсе ше (мыс. бірде 37-нің жай сан екенін тексеру, бірде 100-дің)? Дәл осы үшін параметр деген механизм бар — ол процедураға «сырттан» мән беруге мүмкіндік береді.

Параметр (аргумент) деген не
Анықтама
Аргумент (параметр) — процедураны шақыру кезінде негізгі программадан ішкі программаға берілетін мән.

Параметр арқылы бір ғана процедура кодын жазып, оны ӘРТҮРЛІ мәндермен қайта-қайта қолдана аламыз.

Есеп (орта): жай санды тексеру

Берілді: N саны.

Табу керек: N санының жай сан екенін анықтайтын процедура.

Неге параметр қолданамыз? Егер параметрсіз жазсақ, әр санды тексеру үшін БҮТІН ЖАҢА процедура керек болар еді. Параметр арқылы бір процедура ӘРБІР санмен жұмыс істей алады.

def PrintSimple(N):
    simple = 1
    for i in range(2, N // 2):
        if N % i == 0:
            simple = 0
            break
    if simple == 1:
        print(N, "jai san")
    else:
        print(N, "jai san emes")

PrintSimple(37)

Жауабы: 37 jai san

Есеп (оңай): бірнеше параметрлі процедура

Берілді: N ұзындықтағы жолды ch таңбасымен басып шығару.

Шешуі: процедура тақырыбында параметрлер үтірмен бөлінеді, шақырғанда мәндер СОЛДАН ОҢҒА қарай ретімен беріледі.

def LineOfChar(N, ch):
    print(ch * N)

LineOfChar(10, '@')

Жауабы: @@@@@@@@@@

Жергілікті және жаһандық айнымалылар

Программада бір атпен екі бөлек айнымалы болуы мүмкін бе? Иә! Мұны түсіну үшін екі маңызды ұғымды білу керек — олардың «көріну аймағы» әртүрлі.

Анықтама
Жергілікті айнымалы — процедура немесе функция ІШІНДЕ жарияланатын, тек сол ішкі программада ғана «көрінетін» айнымалы.
Анықтама
Жаһандық (ауқымды) айнымалы — функция денесінен ТЫС жарияланатын айнымалы, оның көріну аймағы БҮКІЛ программаны қамтиды.
Есеп (орта): жергілікті мен жаһандықты ажырату

Берілді: x = 5 және y = 12 жаһандық айнымалылары бар, ал proc() процедурасының ішінде y = 9 деп жергілікті айнымалы жарияланады.

Табу керек: программа орындалғаннан кейінгі x пен y мәндері.

x = 5  # jahandyq ainymaly
y = 12  # jahandyq ainymaly

def proc():
    print("func: jahandyq x = ", x)
    y = 9  # jergilikti ainymaly
    print("func: jergilikti y = ", y)

proc()
print("jahandyq y = ", y)

Неге жаһандық y өзгермейді? Процедура ішінде x-ті ТЕК ОҚУҒА болады (өзгертпей тұрса), бірақ y = 9 жолы жаңа, ТӘУЕЛСІЗ жергілікті айнымалы құрады — оның аты жаһандықпен бірдей болғанымен, олар екі БӨЛЕК «жәшік».

func: jahandyq x =  5
func: jergilikti y =  9
jahandyq y =  12

Жауабы: процедурадан кейін де жаһандық y мәні 12 болып қала береді — жергілікті y оған әсер етпеді.

global кілттік сөзі

Ал егер процедура ІШІНЕН жаһандық айнымалыны ШЫНЫМЕН өзгерткің келсе ше? Мұны Python-ға арнайы айту керек:

Анықтама
global кілттік сөзі — функция ішінде осы атаумен жаңа жергілікті айнымалы жасамай, дәл сол ЖАҺАНДЫҚ айнымалыны қолдану/өзгерту керегін білдіреді.
Есеп (орта): global сөзін қолдану

Берілді: a = 25 жаһандық айнымалысы, proc() ішінде global a арқылы оны 3-ке өзгертеді.

a = 25  # jahandyq ainymaly

def proc():
    global a  # a - jahandyq ainymaly ekenin korsetedi
    print("a ten ", a)
    a = 3  # jahandyq mänin özgertemiz

proc()
print("a mani quraidy ", a)

Жауабы:

a ten  25
a mani quraidy  3
⚠️
Жиі шатастырылады: global сөзінсіз функция ішінде жаһандықпен АТАСЫ бірдей айнымалыға мән берсең — бұл ЖАҢА жергілікті айнымалы жасайды, жаһандыққа әсер етпейді. global сөзі болса ғана нақты жаһандық мән өзгереді.
Өзгермелі типтерді параметр ретінде беру

Ерекше жағдай бар — тізім (list) сияқты «өзгермелі» (mutable) типтегі объект параметр ретінде берілгенде, ЖОҒАРЫДАҒЫ ережелер өзгереді! Себебі параметр объектінің ӨЗІНЕ (көшірмесіне емес) сілтеме жасайды.

Есеп (қиын): тізімді параметр ретінде беру

Берілді: кесінді ұштары C = [1, 2], D = [-3, 2], ығысу векторы Y = [1, 1].

Табу керек: кесіндіні вектор бойынша параллель тасымалдайтын процедура.

def shift(a, b, x):
    a[0] = a[0] + x[0]
    a[1] = a[1] + x[1]
    b[0] = b[0] + x[0]
    b[1] = b[1] + x[1]

C = [1, 2]
D = [-3, 2]
Y = [1, 1]
shift(C, D, Y)
print(C, D)

Неге C мен D да өзгереді? a мен b параметрлері C мен D тізімдерінің дәл ӨЗІНЕ сілтеме жасайды (жаңа көшірме емес), сондықтан процедура ішіндегі өзгеріс тікелей негізгі программадағы C мен D-ні өзгертеді.

Жауабы: [2, 3] [-2, 3]

🎯 ҰБТ байланысы
Жергілікті/жаһандық айнымалыны ажырату Python есептерінде жиі тексеріледі.
1
global сөзінсіз функция ішінде жаһандықпен аттас айнымалыға мән беру — ЖАҢА жергілікті айнымалы жасайды.
2
Тізім (list) сияқты өзгермелі типтер параметр ретінде берілгенде, процедура ішіндегі өзгеріс негізгі программаға да әсер етеді.
3
Шақырудағы параметр реті СОЛДАН ОҢҒА қарай, анықтамадағы ретпен дәл сәйкес болуы керек.
Сабақ қорытындысы
  • Параметр — процедураға сырттан мән беру механизмі, бір процедураны әртүрлі мәндермен қолдануға мүмкіндік береді.
  • Жергілікті айнымалы тек процедура ішінде «көрінеді», жаһандық — бүкіл программада.
  • Жаһандық айнымалыны функция ішінен өзгерту үшін global кілттік сөзі керек.
  • Тізім сияқты өзгермелі типтер параметр ретінде берілгенде, процедурадағы өзгеріс негізгі программаға да тікелей әсер етеді.