- Ang tradisyonal na switch ay hindi umiiral sa Python, ngunit maaari itong epektibong tularan ng mga kondisyon at diksyunaryo.
- Simula sa Python 3.10, ang bagong match-case construct ay nagdudulot ng mas mataas na kapangyarihan at pagiging madaling mabasa sa pamamagitan ng pagpapalit sa classic na switch-case.
- Nagbibigay-daan sa iyo ang iba't ibang diskarte na magpatupad ng multiple-choice na logic sa Python, na umaangkop sa iba't ibang mga sitwasyon at bersyon ng wika.
Naisip mo na ba kung paano pamahalaan ang maraming kundisyon sa Python nang simple at mahusay? Kapag gumagamit ng mga wikang tulad ng C, Java, o JavaScript, malamang na ginamit mo na ang pamilyar na switch-case statement upang pumili sa pagitan ng ilang opsyon batay sa halaga ng isang variable. Gayunpaman, sa Python, ang klasikong mekanismong ito ay hindi pa umiiral... hanggang kamakailan lamang. Bagama't kinailangang maghanap ng mga alternatibo ang mga developer sa loob ng maraming taon, ang wika ngayon ay nag-aalok ng moderno at makapangyarihang solusyon.
Ang artikulong ito ang iyong pangunahing gabay sa pag-unawa kung paano gamitin ang katumbas ng Python na 'switch' , pagtuklas ng mas malalakas na alternatibo sa mga mas lumang bersyon, paglilinaw kung bakit hindi ito isinama sa mga unang yugto nito, at pag-aaral na sumulat ng mas malinis at mas madaling basahin na code, anuman ang bersyong iyong ginagamit. Maghanda upang matutunan ang lahat ng mga trick, halimbawa, at pangunahing pagkakaiba sa pagpapatupad ng maraming conditional sa loob ng Python ecosystem.
Umiiral ba ang switch sa Python? Kasaysayan at mga dahilan para sa kawalan nito
Ang syntax ng switch-case, na nasa maraming wika, ay hindi opisyal na dumating sa Python hanggang sa bersyon 3.10. Ang pangunahing dahilan ay pilosopikal: ang mga tagalikha ng Python ay palaging inuuna ang pagiging simple at madaling mabasa. Naniniwala sila na ang pagpapakilala ng isang bagong syntax para sa mga switch statement ay maaaring magpakomplikado ng mga bagay-bagay, kaya ang if-elif-else ay sapat na upang punan ang kakulangang iyon. Bukod pa rito, hindi kailanman nagkaroon ng pinagkasunduan sa mainam na syntax. Sa katunayan, ilang opisyal na panukala (PEP 275, PEP 3103) ang tinanggihan dahil sa kawalan ng kasunduan at dahil marami ang nakadama na ang mga umiiral na alternatibo ay malinaw at sapat na makapangyarihan.
Sa loob ng maraming taon, nabawi ng komunidad ang kakulangan ng isang pahayag na 'switch' gamit ang mga conditional chain at dictionary. Hindi na kailangang sabihin pa, lumikha ito ng debate, ngunit malayo sa pagiging isang hindi malulutas na disbentaha, ang mga pamamaraang ito ay napatunayang nababaluktot at lubos na madaling ibagay. Gayunpaman, habang lumalaki ang pagiging kumplikado ng mga proyekto, ang pangangailangan para sa isang mas eleganteng solusyon ay lalong naging malinaw.
Ano ang switch case at para saan ito ginagamit?
Ang switch-case statement ay isang control structure na ginagamit sa maraming wika upang isagawa ang iba't ibang bloke ng code depende sa halaga ng isang variable o expression. Sa madaling salita, pinapayagan ka nitong pumili ng isang opsyon mula sa maraming posibilidad sa isang malinis at direktang paraan, na iniiwasan ang walang katapusang kadena ng mga conditional statement.
Ang mga karaniwang halimbawa ng paggamit ay: pagpapakita ng pangalan ng isang araw ng linggo batay sa isang numero, pagtatalaga ng mga marka, pagpili ng mga operasyon batay sa input ng user, atbp. Sa mga wika tulad ng C o Java, simple ang syntax nito:
switch(valor) {
case 1:
// acción
break;
case 2:
// otra acción
break;
default:
// acción por defecto
}
Sa Python, ang klasikong istrukturang ito ay hindi umiiral hanggang kamakailan, kaya ang mga developer ay kailangang maging mapag-imbento upang makamit ang parehong resulta.
Ang pagdating ng switch sa Python: ang match-case statement (mula noong Python 3.10)
Sa paglabas ng bersyon 3.10, isinama ng Python ang isang pinakahihintay na tampok: ang match-case statement. Bagama't ang syntax nito ay kahawig ng tradisyonal na switch-case statement, ito ay talagang mas makapangyarihan, dahil ipinakikilala nito ang pattern matching , na nagbibigay-daan sa paghahambing hindi lamang ng mga simpleng halaga, kundi pati na rin ng mga kumplikadong istruktura, tuple, klase, listahan, diksyunaryo, at iba pa.
Ang match-case ng Python ay nakasulat tulad nito:
def ejemplo_switch(x):
match x:
case 1:
return "uno"
case 2:
return "dos"
case _:
return "desconocido"
Ang underscore ( _ ) ay gumaganap bilang wildcard at katumbas ng default sa ibang mga wika, na isinasagawa kapag walang naunang pattern na tumutugma.
Bakit ito napakalakas? Dahil maaari kang makatanggap ng mga kumplikadong pattern, kumuha ng mga variable, magbukas ng mga tuple o bagay, at gumamit pa ng mga guard upang magdagdag ng mga karagdagang kondisyon pagkatapos ng pahayag ng kaso:
match dato:
case (a, b) if a > b:
print("El primer elemento es mayor que el segundo")
case (a, b):
print(f"Valores: {a}, {b}")
Bukod pa rito, sa Python 3.10 at mas mataas, pinapabuti ng istrukturang ito ang pagiging madaling mabasa, mapanatili, at scalability ng iyong code, lalo na kapag humahawak ng maraming kaso.
Mga alternatibo upang lumipat sa Python para sa mga mas lumang bersyon
Bago dumating ang match-case , nakaisip na ang mga developer ng pantay na wastong alternatibo. Ang dalawa sa pinakakaraniwan ay ang paggamit ng if-elif-else strings at dictionary mapping . Tingnan natin ang mga ito nang detalyado:
1. Paggamit ng if-elif-else
Ang pinakadirekta at pinakamadaling solusyon ay ang pag-chain ng mga kondisyon gamit ang if, elif, at else. Nagbibigay-daan ito sa iyo na masakop ang lahat ng posibleng halaga ng isang variable at isagawa ang kaukulang bloke ng code. Halimbawa, upang ipakita ang araw ng linggo batay sa isang numero:
dia = 4
if dia == 1:
print('lunes')
elif dia == 2:
print('martes')
elif dia == 3:
print('miércoles')
elif dia == 4:
print('jueves')
elif dia == 5:
print('viernes')
elif dia == 6:
print('sábado')
elif dia == 7:
print('domingo')
else:
print('error')
Mga kalamangan ng diskarteng ito:
- Simple at madaling mabasa na code.
- Hindi mo kailangan ng anumang iba pang mga espesyal na istraktura; ito ay purong Python.
- Maaaring gamitin ang anumang uri ng paghahambing, hindi lamang pagkakapantay-pantay.
Mga disadvantages ng if-elif-else ladder:
- Pagkahilig sa paulit-ulit na code. Kailangan mong ulitin ang variable sa bawat paghahambing, na bumubuo ng maraming hindi kinakailangang teksto kung mayroon kang maraming mga kaso.
- Hindi gaanong mahusay kapag may malaking bilang ng mga kundisyon. Kung ang kaso ay nasa dulo, lahat ng nakaraang kaso ay sinusuri bago dumating.
- Hirap sa pagdaragdag o pag-alis ng mga kaso sa dynamic na paraan.
2. Paggamit ng mga diksyunaryo upang gayahin ang switch-case
Isang napaka-Pythonic na paraan upang gayahin ang isang switch statement ay ang paggamit ng mga dictionary. Simple lang ang ideya: iuugnay mo ang bawat posibleng value (key) sa katumbas na function o action (value). Pagkatapos, i-query mo ang dictionary upang makuha ang function at isagawa ito.
def lunes():
print('lunes')
def martes():
print('martes')
def error():
print('error')
switch_semana = {
1: lunes,
2: martes,
# ... otros días ...
}
dia = 8
switch_semana.get(dia, error)()
Mga kalamangan ng pamamaraang ito:
- Compact at madaling mapalawak na code.
- Napakabilis na pag-access sa tamang function. Gumagamit ang diksyunaryo ng hashing, kaya ang paghahanap ay halos madalian.
- Binibigyang-daan kang magtalaga ng parehong function sa maraming key (halimbawa, sa pangkat ng mga case).
- Maaaring baguhin ang switch sa runtime.
Mga disadvantages:
- Nangangailangan ito ng dati nang pagtukoy sa lahat ng nauugnay na function, na maaaring maging mahirap para sa mga simpleng aksyon.
- Pinapayagan lamang nito ang mga paghahambing para sa pagkakapantay-pantay (hindi ito gumagana para sa mga agwat, saklaw, atbp.).
- Hindi ito inilaan para sa mga kaso na may mas kumplikadong conditional logic sa loob ng bawat pagpili.
Pagkakaiba sa pagitan ng if-elif-else at switch (o match-case)
Ang panloob na paggana ng isang if-elif-else chain ay naiiba sa mga nasa isang switch statement. Sa isang if-elif-else statement, ang mga kondisyon ay sinusuri nang isa-isa, mula itaas hanggang sa ibaba, hanggang sa matugunan ang unang tunay na kondisyon. Samakatuwid, kung ang ninanais na halaga ay nasa simula, ang proseso ay mabilis; kung ito ay nasa dulo, ito ay mas matagal.
Sa kabaligtaran, ang mga tradisyunal na switch statement (at mga dictionary bilang alternatibo sa Python) ay karaniwang gumagamit ng mga lookup table, na nagreresulta sa mas pare-parehong access, anuman ang bilang ng mga case o ang kanilang posisyon. Sa mga match-case statement at dictionary, ang mga oras ng access ay mas pare-pareho.
Kailan pipiliin ang bawat alternatibo?
Walang iisang unibersal na solusyon; ang pinakamahusay na tool ay nakasalalay sa partikular na problema.
- Para sa isang maliit na bilang ng mga kundisyon o kumplikadong lohika sa bawat sangay, ang if-elif-else ay ang pinakasimpleng pagpipilian. Pinapayagan nito ang anumang paghahambing at napaka-flexible.
- Kapag mayroon kang maraming mga kaso at ang bawat isa ay nagsasagawa lamang ng isang partikular na aksyon, umasa sa mga diksyunaryo. Ang code ay mas malinis, nasusukat, at mas madaling mapanatili.
- Kung gumagamit ka ng Python 3.10 o mas mataas, kaso ng tugma Ito ang pinakamahusay na pagpipilian para sa kalinawan at kapangyarihan. Pinapayagan ka nitong pagsamahin ang kagandahan ng switch sa kapangyarihan ng pagtutugma ng pattern sa mga kumplikadong istruktura.
Palaging isipin ang pagiging madaling mabasa, performance, at maintainability ng iyong code.
Mga praktikal na halimbawa ng paggamit ng switch sa Python at ang mga alternatibo nito
Tingnan natin ang ilang halimbawa kung saan inilalapat ang bawat isa sa mga alternatibong ito, mula sa pinakamaliit hanggang sa pinakakumplikado:
Halimbawa 1: Kalkulahin ang grado batay sa isang marka
# Usando if-elif-else
puntuacion = 85
if puntuacion >= 90:
print('Sobresaliente')
elif puntuacion >= 80:
print('Notable')
elif puntuacion >= 70:
print('Bien')
else:
print('Insuficiente')
Ang kasong ito ay perpekto para sa paggamit ng mga kondisyon, dahil nagtatrabaho ka sa mga pagitan, hindi mga nakapirming halaga.
Halimbawa 2: Ipakita ang araw ng linggo ayon sa numero (may diksyunaryo)
# Definición de funciones para cada día
def lunes():
print('lunes')
def martes():
print('martes')
def miercoles():
print('miércoles')
def jueves():
print('jueves')
def viernes():
print('viernes')
def sabado():
print('sábado')
def domingo():
print('domingo')
def error():
print('error')
switch_semana = {
1: lunes,
2: martes,
3: miercoles,
4: jueves,
5: viernes,
6: sabado,
7: domingo
}
dia = 8
switch_semana.get(dia, error)()
Halimbawa 3: Paggamit ng match-case upang pumili ng aritmetika na operasyon
operacion = 'suma'
a = 10
b = 5
match operacion:
case 'suma':
print(a + b)
case 'resta':
print(a - b)
case 'multiplicacion':
print(a * b)
case 'division':
print(a / b)
case _:
print('Operación no válida')
Tulad ng nakikita mo, ang syntax ay simple at napakalinaw. Isinasaad ng underscore ang default na case.
Advanced na halimbawa: pagtutugma ng pattern sa case-case
Ang malaking kalakasan ng match-case analysis ay nakasalalay sa kakayahan nitong gumamit ng mga kumplikadong pattern. Halimbawa, maaari mong suriin ang mga tuple, listahan, diksyunaryo, object, at iba pa.
punto = (3, 5)
match punto:
case (0, 0):
print('Origen')
case (0, y):
print(f'Eje Y en {y}')
case (x, 0):
print(f'Eje X en {x}')
case (x, y):
print(f'Coordenadas X={x}, Y={y}')
Maaari mo ring gamitin ang sugnay na if (guard) upang magdagdag ng mga karagdagang kundisyon sa bawat kaso.
Mga pagkakaiba sa performance sa pagitan ng if-elif-else, mga diksyunaryo, at match-case
Sa karamihan ng mga kaso, bale-wala ang pagkakaiba sa pagganap para sa mga karaniwang script. Gayunpaman, kapag maraming alternatibo, ang mga diksyunaryo at match-case argument ay maaaring maging mas mahusay, dahil binabawasan nito ang bilang ng mga paghahambing. Sa anumang kaso, ang pinakamahalagang salik ay karaniwang ang kakayahang mabasa at mapanatili ang code , sa halip na ang mga micro-optimization na bihirang makagawa ng pagkakaiba sa mga proyekto sa totoong mundo.
Gamitin ang pamamaraan na ginagawang mas malinaw ang code at maiwasan ang mga error.
Mga malikhaing solusyon: mga klase at tagapamahala ng konteksto upang tularan ang switch
Ang ilang mga developer ay lumikha ng mga espesyal na klase na nagbibigay-daan sa paggaya sa klasikong pag-uugali ng switch, kabilang ang mga advanced na opsyon tulad ng pagdaragdag ng break upang makontrol ang pagpapatupad ng mga kasunod na kaso, pagpapangkat ng mga kaso, pagpapasadya ng mga paghahambing, o pag-activate ng isang mahigpit na mode na nagsisiguro na isang branch lamang ang isasagawa.
Halimbawa, maaaring ipatupad ang isang custom na tagapamahala ng konteksto upang gumamit ng syntax na halos kapareho sa ibang mga wika:
class switch:
def __init__(self, variable, comparator=None, strict=False):
self.variable = variable
self.matched = False
self.matching = False
if comparator:
self.comparator = comparator
else:
self.comparator = lambda x, y: x == y
self.strict = strict
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
pass
def case(self, expr, break_=False):
if self.strict:
if self.matched:
return False
if self.matching or self.comparator(self.variable, expr):
if not break_:
self.matching = True
else:
self.matched = True
self.matching = False
return True
else:
return False
else:
if self.matching or self.comparator(self.variable, expr):
if not break_:
self.matching = True
else:
self.matched = True
self.matching = False
return True
else:
return False
def default(self):
return not self.matched and not self.matching
Ang paggamit ng klase na ito ay nagbibigay-daan para sa isang syntax na tulad nito:
dia = 4
with switch(dia) as s:
if s.case(1, True): print('lunes')
if s.case(2, True): print('martes')
if s.case(3, True): print('miércoles')
if s.case(4, True): print('jueves')
if s.case(5, True): print('viernes')
if s.case(6, True): print('sábado')
if s.case(7, True): print('domingo')
if s.default(): print('error')
Ano ang mga bentahe ng solusyong ito? Mayroon itong pamilyar na syntax para sa mga nagmumula sa ibang mga wika at nagbibigay-daan para sa mga advanced na pagpapasadya, tulad ng paggamit ng anumang function ng paghahambing, pagpapangkat ng mga kaso, pagpapatupad ng maraming sangay o isa lamang, atbp. Ang disbentaha ay mas mabagal ito at nangangailangan ng pag-import o pagtukoy sa espesyal na klase.
Paggamit ng mga function ng lambda upang gawing simple ang mga aksyon sa mga diksyunaryo
Kadalasan, hindi mo kailangang magtakda ng magkakahiwalay na mga function para sa bawat aksyon; maaari kang gumamit ng mga anonymous (lambda) function. Ito ay lalong praktikal kapag ang aksyon na isasagawa ay simple:
switch_operaciones = {
'sumar': lambda a, b: a + b,
'restar': lambda a, b: a - b,
'multiplicar': lambda a, b: a * b
}
operacion = 'sumar'
resultado = switch_operaciones.get(operacion, lambda a, b: None)(5, 3)
print(resultado)
Ginagawa nitong compact at madaling palawakin ang code nang hindi nawawala ang kalinawan.
Mga Advanced na Use Case: Pagtutugma ng Pattern sa Match-Case
Ang pahayag na `match-case` ng Python 3.10 ay higit pa sa simpleng pagkopya ng klasikong pahayag na `switch-case`. Ang tunay na kapangyarihan nito ay nasa pagtutugma ng mga istrukturang pattern . Halimbawa, pinapayagan ka nitong madaling makilala ang pagkakaiba sa pagitan ng iba't ibang istruktura ng data, mga pasadyang klase, mag-decompose ng mga object, at kumuha ng mga sub-elemento.
Halimbawa na may mga listahan at tuple:
datos =
match datos:
case :
print('Lista con 1, 2, 3')
case :
print('Lista que empieza con 1')
case _:
print('Otra lista')
Halimbawa na may mga bagay (ipagpalagay na isang Point class):
class Punto:
def __init__(self, x, y):
self.x = x
self.y = y
p = Punto(2, 3)
match p:
case Punto(x=0, y=0):
print('Origen')
case Punto(x, y):
print(f'Coordenadas: {x} {y}')
Ang mekanismong ito ay nagpapahintulot sa iyo na magsulat ng mataas na nagpapahayag na code na umaangkop sa mga kumplikadong istruktura nang hindi nawawala ang pagiging madaling mabasa.
Mga aspetong dapat isaalang-alang kapag naglilipat ng code: compatibility at pinakamahuhusay na kagawian
Hindi lahat ng proyekto ay kayang gamitin agad ang match-case. Kung nagtatrabaho ka sa mga environment na may mas lumang bersyon ng Python (halimbawa, 3.8 o 3.9), kakailanganin mong pumili ng mga dictionary. Kung posible na mag-upgrade sa 3.10+, samantalahin ang kapangyarihan at kalinawan ng pattern matching, lalo na sa mga proyekto kung saan mahalaga ang multiple selection logic.
Tandaan:
- Piliin ang opsyong nag-aalok ng pinakamahusay na kakayahang mabasa, flexibility, at kadalian ng pagpapanatili.
- Sa napakasimpleng mga problema (ilang mga kaso), ang if-elif-else ay kadalasang sapat at mas direkta.
- Para sa malalaking seleksyon ng mga talahanayan, gumamit ng mga diksyunaryo at function.
- Para sa mga kumplikadong istruktura o upang lubos na mapakinabangan ang modernong Python, pumili ng match-case.
Isang maliit na trick: maaari mong i-convert ang mga umiiral na function upang tanggapin ang mga diksyunaryo ng aksyon, na ginagawang mas madali ang paglipat sa pagitan ng mga diskarte.
Mga tip sa pag-optimize at disenyo para sa mas malinis na Python code
Huwag mahulog sa patibong ng pagdidisenyo ng walang katapusang kadena ng mga conditional para lang gayahin ang klasikong switch statement. Isipin ang bawat partikular na kaso at suriin kung aling control structure ang nagdaragdag ng pinakamalaking halaga sa konteksto ng iyong programa. Tandaan na pinahahalagahan ng Python ang kalinawan, kaya iwasang gawing kumplikado ang iyong code kung makakamit mo lang ang parehong resulta nang simple.
Isang mahalagang tip: Kapag gumagamit ng mga diksyunaryo, gamitin ang function get() upang maiwasan ang mga error kung ang susi ay hindi umiiral at sa gayon ay magagawang tukuyin ang isang default na kaso nang elegante.
Paghahambing sa iba pang mga wika at panghuling pag-iisip
Sa ilang mga wika, tulad ng C, C++, o Java, pinapayagan lamang ng mga switch ang paghahambing ng mga simpleng halaga (mga integer, string) at nagbibigay ng maliit na halaga para sa mga kumplikadong istruktura. Ang Python ay nagpapatuloy ng isang hakbang: una, nag-aalok ito ng maraming nalalaman na mga alternatibo (if-elif-else, mga diksyunaryo), at ngayon ay nagbubukas ito ng pinto sa advanced na lohika nang walang labis na pagsisikap. Ang susi ay upang samantalahin ang mga pakinabang ng bawat bersyon at huwag pilitin ang iyong sarili na gayahin ang iba pang mga syntax kung ang problema ay nangangailangan ng ibang solusyon.
Kung nagsisimula ka pa lang sa Python o nanggaling sa ibang mga wika, huwag mabigo kung hindi mo mahanap ang switch na keyword sa manual. Pag-isipan ang lahat ng mga posibilidad na magagamit at piliin ang isa na pinakaangkop sa iyong konteksto at mga pangangailangan.
Ang pamamahala ng maraming alternatibo sa Python ay hindi kailanman naging mas madali o mas malakas. Ngayon ay naiintindihan mo na ang mga dahilan sa likod ng kawalan (at kasunod na pagdating) ng switch, kung paano ito epektibong gayahin sa anumang bersyon, at kung paano masulit ang bagong match-case statement. Kung kailangan mong pumili sa pagitan ng kalahating dosenang mga opsyon, manipulahin ang mga kumplikadong istruktura, sundin ang pinakamahuhusay na kagawian, o mag-alala tungkol sa pagganap, mayroon kang matatag, eleganteng, at nababaluktot na mga alternatibo. Kung ang iyong code ay para sa mabilis na script o kumplikadong mga application, binibigyan ka ng Python ng mga tool upang maisulat ito nang malinaw, mabilis, at madali.