Loading...
Python

Կարող եք ձեր կոդը փորձարկել այստեղ

Python

Գլուխ 8. Pattern matching

Pattern matching

Конструкция match
Սկսած 3.10 տարբերակից, Python լեզուն ներկայացրեց այնպիսի ֆունկցիոնալություն, ինչպիսին օրինակների համընկնումն է : Նախշերի համընկնումը ներկայացնում է համընկնման կառուցվածքի օգտագործումը , որը թույլ է տալիս համապատասխանեցնել արտահայտությունը որոշակի օրինաչափության հետ: Իսկ եթե արտահայտությունը համապատասխանում է օրինաչափությանը, ապա կատարվում են որոշակի գործողություններ։ Այս առումով համընկնման կառուցվածքը նման է if/else/elif կառուցվածքին , որը կատարում է որոշակի գործողություններ՝ կախված ինչ-որ պայմանից: Այնուամենայնիվ, համընկնման ֆունկցիոնալությունը շատ ավելի լայն է. այն նաև թույլ է տալիս տվյալներ հանել կոմպոզիտային տեսակներից և կիրառել գործողություններ օբյեկտների տարբեր մասերի վրա:
Համապատասխանության կառուցվածքն ունի հետևյալ պաշտոնական սահմանումը.
match արտահայտություն: case նմուշ_1: գործողություն_1 case նմուշ_2: գործողություն_2 case նմուշ_N: գործողություն_N case _: գործողություն լռելյայն
Համընկնման բանալի բառից հետո գալիս է համեմատվող արտահայտությունը: Եվ հետո երկու կետից հետո հաջորդ տողերում կան դեպքերի հայտարարություններ : Յուրաքանչյուր դեպքի արտահայտությունից հետո նշվում է օրինաչափություն, որի հետ համեմատվում է համընկնող արտահայտությունը: Կաղապարից հետո նշվում է գործի բլոկում կատարվող գործողությունների մի շարք՝ առանձնացված երկու կետով:

Համապատասխանի կառուցվածքը հաջորդաբար համեմատում է արտահայտությունը պատյանների բլոկների օրինաչափությունների հետ: Եվ եթե որոշ case block- ից օրինաչափություն է հայտնաբերվել , որը համապատասխանում է համընկնումի արտահայտությանը, ապա այս case բլոկի հրահանգները կատարվում են:

Ինչպես պարզունակ տեսակների, այնպես էլ տարրերի և դասի օբյեկտների հաջորդականության տվյալները կարող են օգտագործվել որպես օրինաչափություններ, որոնց հետ համեմատվում են արտահայտությունները:

Նախ, եկեք դիտարկենք իրավիճակը, երբ պարզունակ տիպերի բառացիները գործում են որպես կաղապարներ: Օրինակ, կախված լեզվից, մենք կցուցադրենք ողջույնի հաղորդագրություն.
def print_hello(language): match language: case "russian": print("Привет") case "english": print("Hello") case "german": print("Hallo") print_hello("english") # Hello print_hello("german") # Hallo print_hello("russian") # Привет
Այստեղ ֆունկցիան print_hello վերցնում է լեզվի պարամետր, որով փոխանցվում է ընտրված լեզուն։ Բուն գործառույթում համընկնման կառուցվածքը համեմատում է լեզվի փոփոխականի արժեքը։ Case բլոկները սահմանում են օրինաչափություններ՝ տողեր, որոնց լեզվի փոփոխականը համընկնում է:

Օրինակ, երբ կանչվում է, print_hello("english")լեզվի պարամետրը «անգլերեն» է, ուստի համընկնումի կառուցվածքը կընտրի հետևյալ գործի բլոկը.
case "english": print("Hello")
Նկատի ունեցեք, որ գործի բլոկները նահանջված են համընկնումի կետի սկզբից: Եվ յուրաքանչյուր դեպքի բլոկի հրահանգները կտրված են տվյալ գործի բլոկի սկզբից: Բայց եթե գործի բլոկը ունի մեկ հայտարարություն, այն կարող է տեղադրվել գործի հայտարարության նույն տողում.
def print_hello(language): match language: case "russian": print("Привет") case "english": print("Hello") case "german": print("Hallo") print_hello("english") # Hello print_hello("german") # Hallo print_hello("russian") # Привет
Ավելին, եթե համընկնումից արտահայտությունը չի համընկնում գործի օրինաչափություններից որևէ մեկին, ապա համապատասխանաբար այս գործի բլոկներից ոչ մեկը չի կատարվում:

Եթե ցանկանում եք, որ որոշ կանխադրված գործողություններ կատարվեն, երբ արժեքները չեն համընկնում (եթե դեպքերի օրինակներից ոչ մեկը չի համապատասխանում համընկնումի արտահայտությանը), ապա այս դեպքում օգտագործվում է _ (գծիկ) օրինաչափությունը.
def print_hello(language): match language: case "russian": print("Привет") case "english": print("Hello") case "german": print("Hallo") case _: print("Undefined") print_hello("english") # Hello print_hello("spanish") # Undefined
Եթե գործի օրինաչափություններից ոչ մեկը չի համապատասխանում լեզվի արժեքին, ապա բլոկը կկատարվի.
case _: print("Undefined")
Բայց դուք կարող եք նաև սահմանել գործի բլոկ, որը թույլ է տալիս համեմատել միանգամից մի քանի արժեքների հետ: Այս դեպքում արժեքները բաժանվում են ուղղահայաց բարով.
def print_hello(language): match language: case "russian": print("Привет") case "american english" | "british english" | "english": print("Hello") case _: print("Undefined") print_hello("english") # Hello print_hello("american english") # Hello print_hello("spanish") # Undefined
Այս դեպքում ձևանմուշը case "american english" | "british english" | "english"համընկնում է միանգամից երեք արժեքի:

Դուք կարող եք համեմատել արտահայտությունները այլ տեսակի տվյալների հետ նույն կերպ: Օրինակ:
def operation(a, b, code): match code: case 1: return a + b case 2: return a - b case 3: return a * b case _: return 0 print(operation(10, 5, 1)) # 15 print(operation(10, 5, 2)) # 5 print(operation(10, 5, 3)) # 50 print(operation(10, 5, 4)) # 0
Այստեղ գործողության ֆունկցիան վերցնում է երկու թվեր և գործառնական կոդ։ Համապատասխանության կառուցվածքը համեմատում է գործողության կոդը որոշակի արժեքների հետ և, կախված արժեքից, կատարում է որոշակի գործողություն թվերի վրա: Օրինակ, եթե կոդը 1 է, ապա արտահայտությունը կատարվում է.
case 1: return a + b
Այս դեպքի արտահայտությունը ֆունկցիայից կվերադարձնի a և b թվերի գումարը։

Նմանապես, եթե կոդը = 2, ապա տարբերությունը վերադարձվում է, իսկ եթե կոդը = 3, ապա վերադարձվում է թվերի արտադրյալը: Մնացած բոլոր դեպքերում վերադարձվում է 0:

Մեկնաբանություն գրելու համար խնդրում ենք մուտք լինել