Ej. 38 : Practicando con listas…

Cuando escribo el código Python mysuff.append(‘hello’), en  realidad se están desencadenando una serie de procesos dentro de Python para que suceda algo a la lista mystuff. Así funciona:

  1. Python ve que indiqué mystuff y revisa esa variable. Puede que revise si anteriormente se creó con un =, si se trata de un parámetro de una función o si es una variable global. En cualquier caso, tiene que encontrar donde aparece por primera vez mystuff.
  2. Una vez encuentra mystuff, llega al operador . (punto) y empieza a revisar las variables que son parte de mystuff. Desde el momento que sabe que mystuff es una lista, también sabe que tiene muchas funciones asociadas.
  3. Luego encuentra append y lo compara con todas las funciones y variables de mystuff. Si append está ahí, la usa.
  4. A continuación, Python ve los paréntesis y dice «¡Oh! Ésto debe de ser una función». En ese momento, llama o ejecuta la función con un parámetro extra.
  5. El parámetro extra es…¡¡mystuff!! Lo sé, es raro, ¿verdad? Pero así es como funciona Python, así que lo mejor es simplemente recordarlo y asumir que eso es lo correcto. Lo que ocurre es que la llamada a la función, en el fondo se procesa de una forma similar a append (mystuff, ‘hello’), en lugar de mystuff.append(‘hello’).

No es necesario saber que ésto está pasando pero me será de ayuda para cuando tenga mensaje de error como éste:

>>> class Thing(object) :

…  def test (hi) :

…  print «hi»

>>> a = Thing ()

>>> a.test («hello»)

Traceback (most recent call last): 

File «<stdin>», line 1, in <module>

TypeError: test () takes exactly 1 argument  (2 given)

>>>

Más adelante lo veré, pero el error significa que Python cambió a.test(«hello») por test(a,»hello») y que en algún lugar alguien se confundió y no añadió el argumento o parámentro para a.

Dedicaré algunos ejercicios para que éste concepto quede claro. Haré éste ejercicio que mezcla cadenas y listas para divertirme un poco.

Ej. 38 - Editor Ej. 38 - Terminal

PREGUNTAS

P: ¿No dijimos que no era recomendable usar bucles while?

R: Las reglas se pueden romper si tienes una buena razón. No hay que ser esclavos de las reglas.

P: ¿Qué hace stuff[3:5]?

R: Obtiene una parte de la lista, del elemento 3 al 4, lo que significa que no incluye el 5. Es similar a como funciona range (3,5).  Aunque no es lo mismo, ¿eh?. Con stuff[3:5] se obtiene una sublista de stuff, tenga lo que tenga, range sólo devuelve números.

P: ¿Por qué no funciona join(‘ ‘, stuff)?

R: Esa forma no tiene sentido. No funciona de esa manera, ya que join es un método asociado a una cadena. Reescríbelo así: ‘ ‘.join(stuff).

+ EJERCICIOS

  1. Toma cada llamada a una función y revísala siguiendo los pasos descritos anteriormente para traducirlo a lo que hace Python. Por ejemplo,   ‘ ‘.join(cosas) es join(‘ ‘ , cosas).
  2. Traduce estas dos formas de ver las llamadas a funciones. Por ejemplo, ‘ ‘.join(cosas) se puede leer como «join cosas aplicado a ‘ ‘ «. Otra forma es «Llamada a join con ‘ ‘ y cosas». En realidad es lo mismo.
  3. Busca en internet sobre PROGRAMACIÓN ORIENTADA A OBJETOS (OOP).
  4. Busca que es class en Python, no en otros lenguajes, que puede dar lugar a confusión.
  5. ¿Cuál es la relación entre dir(algo) y la class de algo?