СӘЙКЕСТЕНДІРУ ОПЕРАТОРЫ: PATTERN MATCHING
3.10 нұсқасынан бастап Python тілінде pattern matching (шаблондарды сәйкестендіру) сияқты функционалдылық мүмкіндік пайда болды. Pattern matching өрнектің кейбір үлгіге сәйкес келуіне мүмкіндік беретін match дизайнын қолдануды білдіреді.
Егер өрнек үлгіге сәйкес келсе, онда белгілі бір әрекеттер орындалады. Бұл мағынада match конструкциясы кейбір шарттарға байланысты белгілі бір әрекеттерді орындайтын if/else/elif конструкциясына ұқсас. Дегенмен, match функционалдығы әлдеқайда кең — ол сонымен қатар құрама түрлерден деректерді алуға және нысандардың әртүрлі бөліктеріне әрекеттерді қолдануға мүмкіндік береді.
Match дизайны келесі ресми анықтамаға ие:
match өрнек:
case шаблон_1:
әрекет_1
case шаблон_2:
әрекет_2
…………….
case шаблон_N:
әрекет_N
case _:
әдепкі_әрекет
Match кілт сөзінен кейін салыстырылатын өрнек келеді. Содан кейін қос нүктеден кейін келесі жолдарда case өрнектері орналасады. Әрбір case өрнегінен кейін match өрнегі салыстырылатын шаблон көрсетіледі. Шаблоннан кейін қос нүкте арқылы case блогының орындалатын әрекеттер жиынтығы көрсетіледі.
Match конструкциясы өрнекті case блоктарының шаблондарымен дәйекті түрде салыстырады. Егер кейс блогынан шаблон табылса, матчтың өрнегіне сәйкес келеді, содан кейін осы кейс блогынан нұсқаулар орындалады.
Өрнектерді салыстыру үшін үлгілер/шаблондар ретінде примитивті типтегі деректерді де, элементтер тізбегін және класс объектілерін де қолдануға болады.
Алдымен, шаблон ретінде примитивті типтегі литералдар қолданылатын жағдайды қарастырайық. Мысалы, программалау тіліне байланысты сәлемдесу хабарламасын шығарайық.
Case блоктарында match конструкциясының басынан шегіністер бар екенін ескеріңіз. Әрбір case блогының нұсқауларында осы case блогының басынан шегіністер бар. Бірақ егер case блогында бір нұсқаулық болса, оны case операторымен бір жолға қоюға болады:
def print_hello(language):
match language:
case «kazakh»:
print(«Салем»)
case «russian»:
print(«Привет»)
case «english»:
print(«Hello»)
print_hello(«kazakh») # Салем
print_hello(«russian») # Привет
print_hello(«english») # Hello
Сонымен қатар, егер match өрнегі case шаблондарының ешқайсысына сәйкес келмесе, онда сәйкесінше бұл case блоктарының ешқайсысы орындалмайды.
Мұнда print_hello функциясы таңдалған тіл берілетін тіл параметрін қабылдайды. Функцияның өзінде match конструкциясы тіл айнымалысының мәнін салыстырады. Case блоктары language айнымалысы сәйкес келетін жол үлгілерін анықтайды.
Егер мәндер сәйкес келмеген жағдайда (егер case шаблондарының ешқайсысы match өрнегіне сәйкес келмесе) _ (сызықша) шаблоны қолданылады:
def print_hello(language):
match language:
case «kazakh»:
print(«Салем»)
case «english»:
print(«Hello»)
case _:
print(«Анықталмады»)
print_hello(«kazakh») # Салем
print_hello(«spanish») # Анықталмады
Сонымен қатар, бірден бірнеше мәндермен салыстыруға мүмкіндік беретін case блогын анықтауға болады. Бұл жағдайда өрнектерді басқа типтегі мәліметтермен салыстыруға болады. Мысалы:
def operation(x, y,z):
match code:
case 1:
return x + y
case 2:
return x — y
case 3:
return x * y
case _:
return 0
print(operation(3, 2, 4)) # 5
print(operation(3, 2, 4)) # 1
print(operation(3, 2, 4)) # 6
print(operation(3, 2, 4)) # 0
Кортеждердегі pattern matching
Python-да pattern matching-те шаблондар ретінде кортеждер қолданылуы мүмкін. Мысалы:
def print_data(user):
match user:
case («Timur», 15):
print(«default user»)
case («Timur», age):
print(f»Age: {age}»)
case (name, 24):
print(f»Name: {name}»)
case (name, age):
print(f»Name: {name} Age: {age}»)
print_data((«Timur», 15)) # default user
print_data((«Timur», 15)) # Age: 15
print_data((«Almas», 24)) # Name: Sam
print_data((«Madina», 25)) # Name: Madina Age: 35
print_data((«Timur», 33, «STEM»)) # ешбір шаблонға сәйкес келмейді
Бұл жағдайда функция екі элементтен тұратын кортежді білдіретін user параметрін қабылдайды. Ал match дизайны бұл кортежді бірқатар үлгілермен салыстырады.
Элементтерді өткізіп жіберу
Егер кортеждің қандай да бір элементі біз үшін маңызды болмаса, онда шаблонда нақты мәннің немесе айнымалының орнына _ символын көрсетуге болады:
def print_data(user):
match user:
case («Timur», 15):
print(«default user»)
case (name, _): # екінші элемент маңызды емес
print(f»Name: {name}»)
print_data((«Timur», 15)) # default user
print_data((«Almas», 24)) # Name: Almas
Белгісіз мөлшердегі элементтері бар кортеж
Егер өрнекті ұзындығы белгісіз кортежбен салыстыру қажет болса, онда кортеждің қалған барлық мәндерін * (жұлдызша) символы арқылы анықтауға болады:
def print_data(user):
match user:
case («Timur», 37, *rest):
print(f»Rest: {rest}»)
case (name, age, *rest):
print(f»{name} ({age}): {rest}»)
print_data((«Timur», 37)) # Rest: []
print_data((«Timur», 37, «Google»)) # Rest: [«Google»]
print_data((«Madina», 41, «Microsoft», «english»)) # Bob (41): [«Microsoft», «english»]
Жоғарыдағы мысалда барлық басқа элементтерге сәйкес келетін *rest параметрі қолданылады. Яғни, жоғарыдағы мысалда («Timur», 37, *rest) және (name, age, *rest) үлгілері екі немесе одан да көп элементтері бар кез келген кортежге сәйкес келеді. Үшіншіден бастап барлық элементтер мәндер массивін білдіретін rest параметріне орналастырылады.
Массивтердегі pattern matching
Шаблон ретінде массивтер де қолданыла алады. Мұндай шаблондар нақты мәндерді, массив элементтеріне тағайындалатын айнымалыларды немесе маңызды емес элементтер үшін _ символын қамтуы мүмкін:
def print_people(people):
match people:
case [«Timur», «Almas», «Madina»]:
print(«default people»)
case [«Timur», second, _]:
print(f»Second Person: {second}»)
case [first, second, third]:
print(f»{first}, {second}, {third}»)
print_people([«Timur», «Almas», «Madina»]) # default people
print_people([«Timur», «Sabina», «Madina»]) # Second Person: Sabina
print_people([«Aruna», «Bolat», «Aizhan»]) # Aruna, Bolat, Aizhan
print_people([«Timur», «Aizhan»]) # ешқандай шаблонға сәйкес келмейді
Бұл жағдайда print_people функциясы үш элементтен тұратын массивті қабылдайды. Бірінші шаблон массив элементтерінің белгілі бір мәндері бар екенін көрсетеді:
case [«Timur», «Almas», «Madina»]:
print(«default people»)
Бұл жағдайда массивтің бірінші элементі «Timur» жолын, екіншісі «Almas» жолын және үшіншісі «Madina» жолын көрсетуі керек.
Екінші шаблон массивтің бірінші элементі «Timur» жолына тең болуы керек деп болжайды, қалған екі элементтің ерікті мәндері болуы мүмкін:
case [«Timur», second, _]:
print(f»Second Person: {second}»)
Бұл жағдайда екінші элементтің мәні екінші айнымалыға беріледі, ал үшінші элементтің мәні маңызды емес, сондықтан оның орнына сызықша қолданылады.
Үшінші шаблон үш элементтің кез келген массивіне сәйкес келеді. Бұл жағдайда оның элементтері бірінші, екінші және үшінші айнымалыларға беріледі:
case [first, second, third]:
print(f»{first}, {second}, {third}»)
Тапсырмалар:
- Жануардың қай жерде тұратынын қалай анықтауға болады?
Шарт: Қолданушыға берілген жануардың тізімінен олардың тіршілік ету ортасын анықтайтын программа жасаңыз.
STEM: биология, зоология
Енгізу мәліметтері | Шығару мәліметтері |
Арыстан, қасқыр | Жер үсті ортасы |
Бүркіт, қарға | Ауа ортасы |
Акула, дельфин | Су ортасы |
Белгісіз орта |
- Елдің атауы бойынша климаттық аймақты қалай білуге болады?
Шарт: Қолданушыға берілген елдердің тізімінен олардың климаттық аймағының қай топқа жататының анықтайтын программа жазыңыз.
STEM: география, климатология
Енгізу мәліметтері | Шығару мәліметтері |
Китай Түркия | Субэкваторлық Континентальный |
- Жыл бойынша ғасырды қалай анықтауға болады?
Шарт: Қолданушыға берілген жылдарға сәйкес келетін ғасырды анықтайтын функцияның программасын жазыңыз.
STEM: тарих, математика
Енгізу мәліметтері | Шығару мәліметтері |
1568 | XVI |
1765 | XVIII |
2023 | XXI |
- Ақшаны толықтыру немесе есептен шығару екенін қалай анықтауға болады?
Шарт: Қолданушы енгізген соммамен жасалған банктік операцияға сәйкес банктік қызмет түрін анықтайтын функция жазыңыз.
STEM: экономика, математика
Енгізу мәліметтері | Шығару мәліметтері |
1000 -500 | Ақшаны толықтыру Есептен шығару |
- Аспан денелерінің түрлеріне қарай қалай жіктеуге болады?
Шарт: Аспан денесінің атауы бойынша оның жұлдыз, планета немесе жер серігі екенін анықтайтын программа жасаңыз.
STEM: физика, астрономия
Енгізу мәліметтері | Шығару мәліметтері |
Юпитер | Планета |
Жеті қарақшы | Жұлдыз |
🎓 STEM тұрғысынан бұл жоба не үйретеді?
STEM құрамдасы | Қолдану мысалы |
S – Science | Биология, зоология, география, астрономия салалары бойынша объектіні сәйкестендіру арқылы ғылыми деректерді талдау. |
T – Technology | Python 3.10 тілінде енгізілген match-case синтаксисін қолдану арқылы заманауи бағдарламалау тәсілдерін меңгеру. |
E – Engineering | Деректер құрылымын (tuple, list) талдап, күрделі логикалық шарттармен жұмыс істей отырып, программаны оңтайлы жобалау. |
M – Math | Жыл мен ғасырға байланысты есептеулер жасау, сан мәндерін match арқылы сәйкестендіру арқылы математикалық ойлау мен логикалық шешім қабылдау. |
Бақылау сұрақтары:
- Pattern matching негізгі қызметі қандай?
- Pattern matching (шаблон) ретінде қолданылатын Python-ның негізгі элементтері қандай?
- Match конструкциясының орындалуы?
- Match өрнегі case шаблондарының ешқайсысына сәйкес келмеген жағда йда қандай әрекет орындалады?