Metadata: Estos notebooks están (más que) inspirados en el excelente trabajo de Jake van der Plass y su Whirlwind Tour Of Python. Ver A Whirlwind Tour of Python by Jake VanderPlas (O’Reilly). Copyright 2016 O’Reilly Media, Inc., 978-1-491-96465-1.". Estos notebooks están protegidos con la misma licencia de los originales, Creative Commons 0. Todas las notas están disponibles en PrograUDD1.

La sintaxis de Python

La sintaxis de Python es considerada tan limpia que a veces a Python se le dice "executable pseudo-code", e hizo que su adaptación haya sido muy extensa.

Considere el siguiente código:


In [2]:
# set the midpoint
midpoint = 5

# make two empty lists
lower = []; upper = []

# split the numbers into lower and upper
for i in range(10):
    if (i < midpoint):
        lower.append(i)
    else:
        upper.append(i)
        
print("lower:", lower)
print("upper:", upper)


lower: [0, 1, 2, 3, 4]
upper: [5, 6, 7, 8, 9]

Este pequeño script muestra algunos aspectos importantes de la sintaxis de Python.

Comentarios

Los comentarios en Python empiezan con un "pound", "hash" o numeral # y cualquier cosa que lo siga hasta el final de la línea es ignorada por el intérprete. Es decir, pueden tener comentarios que toman toda la línea, o sólo parte de ella.

En el ejemplo de arriba hay tres comentarios:

# set the midpoint

# make two empty lists
lower = []; upper = []

# or
lower = []; upper = [] # make two empty lists

# split the numbers into lower and upper

Python no tiene una manera de hacer comentarios multilínea como C, por ejemplo (/* ... */).

"Enter" termina una línea ejecutable (una sentencia, ?)

The line

midpoint = 5

Esta operación se llama asignación, y básicamente consiste en crear una variable y darle un valor en particular: 5, en este caso. Noten que no hay nada que marque el final de la sentencia, ni {...} ni ; ni nada por el estilo (solo Enter). Esto es bastante diferente de los lenguajes de programación como C o Java, que necesitaban los ; (a lo mejor razones históricas?)

Sin embargo si por alguna razón necesitan de hecho "span" más de una línea.

x = 1 + 2 + 3 + 4 +\
    5 + 6 + 7 + 8

también es posible continuar en la siguiente línea si existen paréntesis, y sin usar el operador \, así:

x = (1 + 2 + 3 + 4 +
     5 + 6 + 7 + 8)

Los dioses del Python igual recomiendan el segundo método, en vez del símbolo de continuación: \. Alguno se anima a decir por qué?

Los espacios importan!

Vean el siguiente snippet de código:

for i in range(10):
    if i < midpoint:
        lower.append(i)
    else:
        upper.append(i)

Aqui hay varias cosas que notar. Lo primero es que hay un condicional (el scope introducido por el if), y un "loop" (o ciclo), el scope introducido por el for. No es tan importante a esta altura, pero nos presenta lo que ha sido la caracteristica mas controversial de la sintaxis de Python: el espacio en blanco tiene semántica!

En otros lenguajes de programación, un bloque (scope) se define explicitamente con algun símbolo. Cuál es el simbolo que define scope en el siguiente código?

// C code
for(int i=0; i<100; i++) {
      // curly braces indicate code block
      total += i;}

y en este:

package main
import "fmt"
func main() {
    sum := 0
    for i := 0; i < 10; i++ {
        sum += i
    }
    fmt.Println(sum)
}

En Python los scope (o bloques de código) se determinan por indentación.

for i in range(100):
    # indentation indicates code block
    total += i

y el scope siempre se precede con : en la línea anterior.

A mí me gusta como queda la indentación... es más limpia que la {}, pero al mismo puede producir confusion en los n00bs. Lo siguiente produce diferentes resultados:

>>> if x < 4:         >>> if x < 4:
........y = x * 2     ........y = x * 2
........print(x)      ....print(x)

El código de la izquierda va a ser ejecutado sólo si el valor de x es menor que 4, mientras que el de la derecha se va a ejecutar no importa el valor de x.

A mí me parece más leible el código con espacios que con curlies, a ustedes?

Por último, el número de espacios en blanco no es importante. Sólo es necesario que sean sistemáticos, es decir, no pueden ir cambiando en un script entre 2 y 4 espacios, digamos. La convención es usar 4 espacios (y nunca "tabs"), y esta es la convención que usamos en estos notebooks. (Aunque a mí me guste los 2 espacios en C :( ).

Los espacios en blanco adentro de las líneas no tienen efecto, sólo antes de empezar la línea. Lo siguiente es equivalente:

x=1+2
x = 1 + 2
x             =        1    +                2

Obviamente, abusar esta flexibilidad del lenguaje afecta la legibilidad del código. La tercera línea se ve bastante espantosa. La primera en menor medida, y la del medio es la que (a mi) me hace más sentido. Comparen por ejemplo

x=10**-2

con

x = 10 ** -2

De hecho se sugiere poner espacios entre los operadores binarios.

Parentesis

Los parentesis son para agrupar términos y para hacer llamada a funciones con parametros. Primero, se usan para agrupar los términos de los operadores matemáticos:


In [6]:
print(2*(3+4))
print(2*3+4)
print((2*3)+4)


14
10
10

Los parentesis también se usan para pasar parámetros a una función cuando se llama. En el siguiente snippet de código, la función print() se usa para mostrar, por ej, los contenidos de una variable. La función se "llama" con un par de parentesis con los argumentos de la función adentro.


In [3]:
x = 3
print('first value:', x)


first value: 3

In [8]:
print('second value:', 2)


second value: 2

Algunas funciones se llaman sin argumentos y actuan sobre el objeto que evalúan. Los parentesis deben ser usados igual, aunque la función tenga argumentos.


In [10]:
L = [4,2,3,1]
L.sort()
print(L)


[1, 2, 3, 4]