De ocioso, conversando con Mario en una de las tantas charlas por Google Talk (en realidad por Pidgin xD), estuvimos hablando de sentencias de flujo, cómo programar bien en PHP, etc. De repente, por esas cosas de la vida, me acordé que Python NO tiene implementada por defecto una sentencia de control de flujo del tipo switch-case. Pero en este link, descubrí que sí se puede crear una por medio de diccionarios y una función y/u opción predefinida.

Una versión emulada de una sentencia “switch-case” vendría siendo del tipo:

def funcionalgo(parametroalgo,otroparametro,etc...):
#aca va lo que hace una funcion, googlea para mas informacion
return algo # por si queris que retorne alguna wea xd

def otrafuncion(asdasdas...):
#...aca igual deberia hacer algo xd
...
...
...
#Ahora definimos un diccionario llamado "case":
case = {
'un caso': funcionalgo, #llama a funcion algo
'otro caso': otrafuncion, #llama a otra funcion
...
...
...
'default': hacelaweapordefaultxd
}
opcion1 = 'un caso'
case[opcion1](parametrodelafuncionalgo,...) #depende de los parametros de la funcion
case[opcion2](parametrodeotrafuncion,...)

¿Se entendió con este pseudocódigo? Me imaginé que no o no mucho. Bueno, pondré un ejemplo para que entiendan:

def maulla(nombreneko):
return "el gatito %s dice meow ~"%nombreneko
def dinosaurio(nombredinosaurio):
return "%s dice: RAWR!!"%nombredinosaurio

case = {
'meow': maulla,
'rawr': dinosaurio
}
print case['meow']("misifu")
#Otra forma de trabajar un diccionario
dainosor = 'rawr'
print case[dainosor]("denver")

De esta manera por fin tendré que ahorrarme la paja de andar haciendo reiterados “if, elif, elif,…,else” cuando tenga que trabajar con múltiples opciones D:

Espero que les sirva.

Jorgicio

¿Te gustó este post? Entonces compártelo, quiero ser famoso *w*:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • email
  • Live
  • Meneame
  • MySpace
  • RSS
  • Slashdot
  • Technorati
  • PDF
  • Twitter
  • blogmarks
  • BarraPunto
  • Yahoo! Bookmarks
  • Identi.ca
  • Bitacoras.com
  • Blogosphere News
  • Blogplay
  • Diggita
  • Tipd
  • Tumblr
  • Wikio
  • StumbleUpon
  • FriendFeed
3 Respuestas para “Una especie de “switch” en Python”
  1. RNT dice:

    El único problema de tu código, es que si el valor de la variable dainosor no existe, se produce una excepción y tu programa falla, ya que el caso ‘default’ es con el valor de un string “default” no para cuando no hay nada.

    Tendría que ser algo asi:

    In [1]: def fun1(lala):
    …: print “fun1: %s” % str(lala)
    …:

    In [2]: def fun2(lala):
    …: print “fun2: %s” % str(lala)
    …:

    In [3]: def fun3(lala):
    …: print “fun3: %s” % str(lala)
    …:

    In [4]: case={‘uno’: fun1, ‘dos’: fun2}

    In [5]: case.get(‘uno’,fun3)(“hola mundo”)
    fun1: hola mundo

    In [6]: case.get(‘dos’,fun3)(“hola mundo”)
    fun2: hola mundo

    In [7]: case.get(‘tres’,fun3)(“hola mundo”)
    fun3: hola mundo

    In [8]: case.get(‘no existe’,fun3)(“hola mundo”)
    fun3: hola mundo

    Viste la diferencia? :smile:

  2. jorgicio dice:

    Renato: acuérdate que en los lenguajes de scripting como Python, Perl, PHP, etc., no siempre necesitai declarar variables, de hecho, Python no se hace drama si asigno “dainosor” en un ámbito random a menos que la defina después de ser citada, ahí sí que se cae el mundo xD
    Ahora, con respecto al default, era un supuesto, se supone que es una función predefinida o si quieres que no haga nada, simplemente pones “pass”.
    Además igual tiene error pero NO por lo que dijiste, sino que porque escribí mal la variable “dainosaur” en el hash cuando lo llamé xP
    Sería n.n
    Saludillos :B

  3. Leo Soto M. dice:

    El problema es que la version con if/elif queda harto mas clara (y de hecho me parece que es mas corta).

    Cuando si he encontrado util este truco es cuando el if/elif es de la forma:

    if x == ‘foo’
    y = ‘1′
    elif x == ‘bar’
    y = ‘2′
    elif x == ‘baz’
    y = ‘3′

    En cuyo caso prefiero:

    y = {‘foo’: ‘1′, ‘bar’: ‘2′, ‘baz’: ‘3′}[x]

  4.  
Este blog se alimenta de tus comentarios. Por favor, deje uno.

Usuarios de Twitter
Ahora pueden postear usando su cuenta de Twitter. Sólo pinche el botoncito que aparece ahí.

Quiero comprobar si eres un humano o un (ro)bot, así que rellena la cosita de abajo (más conocida como Captcha xD) :3


El Rincón de Jorgicio es un blog creado y mantenido por Jorge Pizarro Callejas. El autor está libre de expresar el contenido que quiera. 2006-2010 Todos los derechos reservados.
Creative Commons License
Esta obra está bajo una licencia de Creative Commons.